2
import pygame
from sys import exit
import random

WIDTH, HEIGHT = 1400,750
FPS = 60
HEADWAY_GAP = 40
vehicleColor = {0:"red",1:"blue",2:"yellow"}
directions = ["Right", "Left"]
classofVehicle = ["Car","Bike","Bus"]
coord = {"Right":(0,300), "Left":(1400,350)}
objects = {"Right":[],"Left":[]}

pygame.init()
myWindow = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()
road = pygame.image.load("Required_images/Road/Road_final.png")

class Vehicle(pygame.sprite.Sprite):
  def __init__(self, ClassofVehicle, Color_Code, direction, pos):
    super().__init__()
    self.Class = ClassofVehicle
    self.Color_Code = Color_Code
    self.direction = direction
    self.pos = pos
    path = "Required_images/"+ClassofVehicle+"/"+ClassofVehicle+"_"+Color_Code+".png"
    self.image = pygame.image.load(path)
    self.rect = self.image.get_rect()
    if self.direction == "Right":
      self.rect.midright = pos
    else:
      self.rect.midleft = pos
    self.index = len(objects[direction])-1

  def movingVehicles(self):
    if self.direction == "Right":
      if self.index == 0 or (self.rect.x + self.rect.width < objects[self.direction][self.index].rect.x - HEADWAY_GAP):
        self.rect.x += 1
    elif self.direction == "Left":
      if self.index == 0 or (self.rect.x - self.rect.width > objects[self.direction][self.index].rect.x + HEADWAY_GAP):
        self.rect.x -= 1
  
  def update(self):
    self.movingVehicles()

Object_timer = pygame.USEREVENT+1
pygame.time.set_timer(Object_timer, 1000)
objectsGroup = pygame.sprite.Group()

def generatingObjects():
  Dir = random.choice(directions)
  po = coord[Dir]
  color_code = random.choice([0,1,2])
  cla = random.choice(classofVehicle)
  object = Vehicle(cla,vehicleColor[color_code],Dir,po)
  objectsGroup.add(object)
  objects[Dir].append(object)

while True:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit()
      exit()

    if event.type == Object_timer:
      generatingObjects()


myWindow.fill((0,0,0))
objectsGroup.update()
objectsGroup.draw(myWindow)
pygame.display.update()
clock.tick(FPS)

我创建了一个精灵类和一个精灵组。我还创建了一个用户定义的事件,以每 1000 毫秒生成车辆。为了在屏幕上显示车辆而不是分别循环遍历精灵组的所有元素,我使用了 group_name.draw() 方法。但是当我运行代码时,一些图像会卡在屏幕上一段时间,然后在一段时间后移动。我试图寻找逻辑中的任何错误,但找不到。如果您有任何知识或能够找到错误,请提供帮助,并感谢任何形式的建议。

4

2 回答 2

1

这是一个缩进的问题。您必须在应用程序循环中而不是在应用程序循环之后绘制场景:

while True:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit()
      exit()

    if event.type == Object_timer:
      generatingObjects()

# INDENTATION
#->|

  myWindow.fill((0,0,0))
  objectsGroup.update()
  objectsGroup.draw(myWindow)
  pygame.display.update()
  clock.tick(FPS)
于 2021-10-28T15:48:34.773 回答
0

确保在 while 循环中缩进元素,并在循环的最后使用 pygame.display.flip()。

所以看起来像

while True:
  for event in pygame.event.get():
    if event.type == pygame.QUIT:
      pygame.quit()
      exit()

    if event.type == Object_timer:
      generatingObjects()

    myWindow.fill((0,0,0))
    objectsGroup.update()
    objectsGroup.draw(myWindow)
    clock.tick(FPS)
    pygame.display.flip()
于 2021-10-28T15:46:47.160 回答