我的pygame精灵可以让我左右移动,但我不能让它停在屏幕的尽头

时间:2012-08-09 19:38:35

标签: python pygame

主程序:

player = Player("player.png",[10,650])
players = pygame.sprite.Group()
players.add(player)

while True:
    for event in pygame.event.get():
      if event.type == KEYDOWN:
        if event.key == K_RIGHT:
          player.goright()
        if event.key == K_LEFT:
          player.goleft()           
      if event.type == KEYUP:
        if event.key == K_RIGHT:
          player.cangoright = False
        if event.key == K_LEFT:
          player.cangoleft = False

players.update()
players.draw(SCREEN)
pygame.display.update()
clock.tick(FPS)

相关精灵的功能:

def update(self):
  if self.cangoright:
    self.rect.left += self.speed
  if self.cangoleft:
    self.rect.left -= self.speed

def goright(self):               
  if self.rect.right <= 1024:
    self.cangoright = True
  else:
    self.cangoright = False

def goleft(self):             
  if self.rect.left >= 0:
    self.cangoleft = True
  else:
    self.cangoleft = False

问题是“cangoright”和“cangoleft”标志似乎没有正常工作。当精灵超过屏幕边缘时(左侧为0,右侧为1024),标志应设置为false,因此更新函数中的ifs应返回false,但这不会发生。< / p>

3 个答案:

答案 0 :(得分:2)

This answer有一些示例move方法。也许看看他们的写作方式会有所帮助吗?

<强> Paddle.move()

def move(self, *, up=False, down=False):
    if up or (not down and self.keys.up and
              self.position.y - self.size.y > 0):
        self.position -= Point(0, self.move_by)
    if down or (not up and self.keys.down and
                self.position.y + self.size.y < self.height):
        self.position += Point(0, self.move_by)

<强> Ball.move()

def move(self):
    self.position += self.velocity
    self.bounce()

答案 1 :(得分:0)

我认为部分问题在于您只是在left更新self.rect。请尝试更新leftright,然后查看是否会更改内容。

更重要的是,这段代码有点难以阅读,而且你要做的事情太复杂了。通过检查update函数中的屏幕边界而不是键事件处理程序,可能会更好地为您提供服务。实际上这是游戏物理的一部分,所以它应该可以挂在那里。

换句话说,使用事件循环来设置表示玩家对update功能的意图的标志。使用update函数根据事件循环设置的标志将游戏规则(物理等)应用于游戏状态。

也许是这样的?

while True:
  ...
    for event in pygame.event.get():
      if event.type == KEYDOWN:
        if event.key == K_RIGHT:
          player.goright = True
        if event.key == K_LEFT:
          player.goleft = True
      if event.type == KEYUP:
        if event.key == K_RIGHT:
          player.goright = False
        if event.key == K_LEFT:
          player.goleft = False

  players.update()
  players.draw(SCREEN)
  pygame.display.update()
  clock.tick(FPS)

def update(self):
  if self.goright and self.speed < SPEED_MAX:
    self.speed += ACCEL_INCREMENT
  if self.goright and self.speed > -SPEED_MAX:
    self.speed -= ACCEL_INCREMENT

  new_left_pos = self.rect.left + self.speed
  new_right_pos = self.rect.right + self.speed

  if new_left_pos > 0 and new_right_pos < 1024:
        self.rect.left += self.speed
        self.rect.right += self.speed

答案 2 :(得分:0)

if语句略有偏离。

if self.rect.right <= 1024:  #Shouldn't this be < 1024 and not <=
    self.cangoright = True 

同样的:

if self.rect.left >= 0:  #Same thing here
    self.cangoleft = True 

看起来你走得很远,因此将你的精灵放在屏幕边缘。

希望这有帮助。