2015-11-18 26 views
0

我正在製作一個簡單的自上而下的遊戲,使用pygame在玩家和牆壁之間移動和碰撞。pygame - 如何更改正在使用的變量?

我做了我的代碼,這樣,當keys[pygame.K_LSHIFT]pygame.key.get_pressed在鍵盤的狀態下True當它被稱爲,block_speed變化的5而不是3。因此它的工作原理,當我按住Shift並在鍵盤上的WASD鍵移動同時我的速度變爲5.

現在,問題是當我放開SHIFT的同時還在移動時,我的速度不會回到3,而是停留在5.但是如果我停止移動,然後移動,block_speed按預期回到3。看起來好像對block_speed的任何改變只發生在我停止移動然後再次移動時。

我猜它只接收block_speed的新值block_speed當前副本完成使用後。

當程序正在使用此變量時,如何使用SHIFT更改block_speed

def run(self): 

    pygame.init() 
    pygame.display.set_caption("Platformer v1") 

    block_speed = 3 

    sprite_list = pygame.sprite.Group() 
    wall_list = pygame.sprite.Group() 

    left_wall = Wall(0,0,10,resolution[1]) 
    wall_list.add(left_wall) 
    sprite_list.add(left_wall) 

    top_wall = Wall(10,0,resolution[0]-10,10) 
    wall_list.add(top_wall) 
    sprite_list.add(top_wall) 

    test_wall = Wall(10,150,200,10) 
    wall_list.add(test_wall) 
    sprite_list.add(test_wall) 

    player = Player(50,50) 
    player.walls = wall_list 
    sprite_list.add(player) 

    while True: 

     self.screen.fill(black) 

     keys = pygame.key.get_pressed() 
     for event in pygame.event.get(): 
      if event.type == pygame.QUIT: 
       return False 

      if keys[pygame.K_LSHIFT]: 
       block_speed = 5 
      else: 
       block_speed = 3 

      if event.type == pygame.KEYDOWN: 
       if event.key == pygame.K_d: 
        player.change_x += block_speed 
       elif event.key == pygame.K_a: 
        player.change_x += -block_speed 
       elif event.key == pygame.K_w: 
        player.change_y += -block_speed 
       elif event.key == pygame.K_s: 
        player.change_y += block_speed 

      elif event.type == pygame.KEYUP: 
       if event.key == pygame.K_d or event.key == pygame.K_a: 
        player.change_x = 0 
       elif event.key == pygame.K_w or event.key == pygame.K_s: 
        player.change_y = 0 


     sprite_list.update() 
     sprite_list.draw(self.screen) 

     pygame.display.update() 
     self.clock.tick(FPS) 

回答

1

你的問題是,當你加擋速度player.change_x/change_y,它執行的是計算在那個時候。事後改變變量不會有什麼區別。

你的情況的一個簡單的解決方案是在你使用它之前簡單地改變block_speed。如果你這樣做,block_speed有你想要的價值,當改變其他變量,給你你想要的結果。

編輯:我意識到還有另外一個問題 - 也就是說,如果新按鍵(事件被觸發),你只能改變移動速度,所以改變塊的速度仍然不會改變速度,除非方向鍵被按下。無論如何,解決方案是每次都要進行計算。

keys = pygame.key.get_pressed() 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: 
      return False 

     if keys[pygame.K_LSHIFT]: 
      player.block_speed = 5 
     else: 
      player.block_speed = 3 

     if event.type == pygame.KEYDOWN: 
      if event.key == pygame.K_d: 
       player.change_x += 1 
      elif event.key == pygame.K_a: 
       player.change_x -= 1 
      elif event.key == pygame.K_w: 
       player.change_y -= 1 
      elif event.key == pygame.K_s: 
       player.change_y += 1 

     elif event.type == pygame.KEYUP: 
      if event.key == pygame.K_d or event.key == pygame.K_a: 
       player.change_x = 0 
      elif event.key == pygame.K_w or event.key == pygame.K_s: 
       player.change_y = 0 

然後在您的位置:

keys = pygame.key.get_pressed() 
for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
     return False 

    if keys[pygame.K_LSHIFT]: 
     block_speed = 5 
    else: 
     block_speed = 3 

    if keys[pygame.K_d]: 
     player.change_x += block_speed 
    if keys[pygame.K_a]: 
     player.change_x += -block_speed 
    if keys[pygame.K_w]: 
     player.change_y += -block_speed 
    if keys[pygame.K_s]: 
     player.change_y += block_speed 

    elif event.type == pygame.KEYUP: 
     if event.key == pygame.K_d or event.key == pygame.K_a: 
      player.change_x = 0 
     elif event.key == pygame.K_w or event.key == pygame.K_s: 
      player.change_y = 0 

另一種方法是存儲在一個鍵被按下的方向,然後利用速度在你做的運動每幀的時間乘以這件事代碼,請改爲self.rect.x += self.change_x * self.block_speed。這可能是一個更好的解決方案。

+0

不幸的是,block_speed仍然沒有改變,我猜「等待」,無論「player.change_x + = block_speed」在應用我的SHIFT變化之前完成 – martinpkmn

+0

我也有一個函數在這個代碼中執行這個代碼self.rect .x + = self。change_x'如果有幫助 – martinpkmn

+0

代碼中必須有其他內容,因爲語句按順序執行,所以將塊速度改變爲高於塊速度的使用率將意味着使用新值。 –

0

我有同樣的問題,並嘗試使用建議的答案中的代碼,但發現它不適合我。我的精靈仍然以基礎速度移動,直到鑰匙被解除。

看着這個帖子,我試着在事件循環之外移動get_pressed()鍵檢測,這固定了事情。

keys = pygame.key.get_pressed() 
if keys[pygame.K_LSHIFT]: 
    player.block_speed = 5 
else: 
    player.block_speed = 3 

for event in pygame.event.get(): 
    if event.type == pygame.QUIT: 
     return False 

    if event.type == pygame.KEYDOWN: 
     if event.key == pygame.K_d: 
      player.change_x += 1 
     #etc. 

    elif event.type == pygame.KEYUP: 
     if event.key == pygame.K_d or event.key == pygame.K_a: 
      player.change_x = 0 
     #etc. 

正如在上面的答案中,在您的位置代碼有self.rect.x += self.change_x * self.block_speed

當某個鍵被按下時,這可以讓我獲得一個速度提升效果,當它沒有時恢復到基本速度。