2012-08-09 65 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() 
相關問題