2017-04-12 51 views
1

問題如下所示:Python - 在RPG遊戲中計算步驟

我對我的RPG遊戲使用pygame。 我有一個球員,響應左,右,上,下,並相應地移動座標(即。0,0 - > 1,0 - > 2,0 - > 3,0 - > 2,0)

每次我按下指定的移動按鈕向左或向右按​​下時,我就可以取得計數器。

問題是我的玩家可以在按住ie時移動。左鍵。 這是註冊之前發佈「永久」運動。

每當我按下按鈕1時,計數器就會上升。 現在我想o計算運動而無需計算每次按壓,因爲玩家可以在不釋放的情況下移動整個地圖並將其計爲1步。

count = 0 
    while True: 
     for e in pygame.event.get(): 
      if e.type == KEYDOWN and e.key == K_UP: 
       player.changespeed(0, -3) 
      if e.type == KEYDOWN and e.key == K_DOWN: 
       player.changespeed(0, 3) 
      if e.type == KEYDOWN and e.key == K_RIGHT: 
       player.changespeed(3, 0) 
      if e.type == KEYDOWN and e.key == K_LEFT: 
       player.changespeed(-3, 0) 
      if e.type == KEYDOWN and e.key == K_i: 
       player_menu = Player_menu() 

      if e.type == KEYUP and e.key == K_UP: 
       player.changespeed(0, 3) 
       count += 1 
      if e.type == KEYUP and e.key == K_DOWN: 
       player.changespeed(0, -3) 
       count += 1 
      if e.type == KEYUP and e.key == K_RIGHT: 
       player.changespeed(-3, 0) 
       count += 1 
      if e.type == KEYUP and e.key == K_LEFT: 
       player.changespeed(3, 0) 
       count += 1 

我該怎麼定義,只要供玩家X的變化,通過步驟1中相同的速度增長,如果沒有更改完成到球員,沒有步驟算的?

+0

我不知道如果我理解正確的問題,但如果你只是想怎麼算通常玩家會移動,當用戶按下某個鍵時,可以增加「steps」計數器,例如'if event.key == pygame.K_LEFT:steps + = 1'(in your event loop)。 – skrx

+0

我試圖計算X和Y位置的變化量,而不考慮方向。所以1步= 1像素= 0,0 - > 1,0就位。 – Emute

+0

然後skrx給出了一個合適的答案 - 你實現增量計數器是你的決定,一個好主意是當你執行你的「字符」的x/y變量的變化 - 每當你添加/減去x或y,增加計數器。我建議不要在鍵盤輸入時這樣做,因爲你的角色有可能無法在所需的方向上移動(在牆的前面),因此不會採取步驟=>在鍵盤輸入處的計數器即使x/y位置變量沒有變化,也會增加1。 – Cribber

回答

0

當玩家的x或y速度爲!= 0時,玩家正在移動,因此我們可以在主循環中的每幀增加count變量。 (我增加了球員的速度爲25,因此,它更容易看到一個步驟。)

import sys 
import pygame as pg 


pg.init() 
screen = pg.display.set_mode((640, 480)) 
FONT = pg.font.Font(None, 32) 


class Player(pg.sprite.Sprite): 

    def __init__(self, pos, *groups): 
     super().__init__(*groups) 
     self.image = pg.Surface((20, 35)) 
     self.image.fill(pg.Color('sienna1')) 
     self.rect = self.image.get_rect(center=pos) 
     self.vel_x = 0 
     self.vel_y = 0 

    def update(self): 
     self.rect.x += self.vel_x 
     self.rect.y += self.vel_y 

    def changespeed(self, x, y): 
     self.vel_x = x 
     self.vel_y = y 


def main(): 
    clock = pg.time.Clock() 
    sprite_group = pg.sprite.Group() 
    player = Player((300, 300), sprite_group) 
    count = 0 
    done = False 

    while not done: 
     for e in pg.event.get(): 
      if e.type == pg.QUIT: 
       done = True 
      if e.type == pg.KEYDOWN: 
       if e.key == pg.K_UP: 
        player.changespeed(0, -25) 
       if e.key == pg.K_DOWN: 
        player.changespeed(0, 25) 
       if e.key == pg.K_RIGHT: 
        player.changespeed(25, 0) 
       if e.key == pg.K_LEFT: 
        player.changespeed(-25, 0) 
       if e.key == pg.K_i: 
        player_menu = Player_menu() 
      if e.type == pg.KEYUP: 
       player.changespeed(0, 0) 

     # If the player is moving increment the step count. 
     # You also need to check whether the player can move 
     # or is blocked by obstacles. 
     if player.vel_x != 0 or player.vel_y != 0: 
      count += 1 
     sprite_group.update() 
     screen.fill((85, 81, 66)) 
     sprite_group.draw(screen) 
     txt_surf = FONT.render(
      'Steps: {}'.format(count), True, pg.Color('sienna1')) 
     screen.blit(txt_surf, (10, 4)) 

     pg.display.flip() 
     clock.tick(30) 


if __name__ == '__main__': 
    main() 
    pg.quit() 
    sys.exit() 
+1

非常感謝你,這將完全符合我的需求。 找到了另一種方法,它可以得到相同的結果,但需要更多(不必要的)代碼,並且需要全局變量(更好地避免),所以您的方法非常乾淨。 – Emute