2012-08-09 63 views
1

主程序:我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,因此更新函数中的if应该返回false,但这不会发生。

+1

可以'self.speed'永远是负面的?在这种情况下,即使'self.cangoright'为'False','self.rect.left'也会增加。 – Kevin 2012-08-09 19:44:55

回答

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 
0

if if statments稍微偏离。

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 

看起来像你去一个远,从而将你的精灵就在屏幕的边缘。

希望这会有所帮助。

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() 
相关问题