1

主程序:

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,但这不会发生。

4

3 回答 3

2

这个答案有一些示例move方法。也许看看它们是如何写的会有所帮助?

桨.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)

球.move()

def move(self):
    self.position += self.velocity
    self.bounce()
于 2012-08-09T20:30:18.863 回答
0

我相信部分问题是您只leftself.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
于 2012-08-09T19:46:39.330 回答
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 

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

希望这可以帮助。

于 2012-08-09T19:46:49.087 回答