Python 3.x rpg游戏中的Python计算步骤

Python 3.x rpg游戏中的Python计算步骤,python-3.x,pygame,Python 3.x,Pygame,问题如下: 我用pygame玩我的rpg游戏。 我有一个对左、右、上、下做出反应的玩家,并相应地在坐标中移动(即0,0->1,0->2,0->3,0->2,0) 每次按指定的移动按钮时,我都能使计数器上升 问题是我的播放器在按下左键时会移动。 这在发布之前被注册为“永久”移动 每次我按按钮1,计数器就会上升。 现在我想计算移动次数,而不需要计算每次按下的次数,因为玩家可以在不释放的情况下移动整个地图,这只算一步 count = 0 while True: for e in

问题如下:

我用pygame玩我的rpg游戏。 我有一个对左、右、上、下做出反应的玩家,并相应地在坐标中移动(即0,0->1,0->2,0->3,0->2,0)

每次按指定的移动按钮时,我都能使计数器上升

问题是我的播放器在按下左键时会移动。 这在发布之前被注册为“永久”移动

每次我按按钮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,如果玩家没有改变,则不计算步数?

每当玩家的X或y速度为0,播放机正在移动,因此我们可以在主循环中每帧将
count
变量增加1。(我已将播放器的速度提高到25,因此更容易看到单个步骤。)


当玩家的x或y速度为时!=0,播放机正在移动,因此我们可以在主循环中每帧将
count
变量增加1。(我已将播放器的速度提高到25,因此更容易看到单个步骤。)


我不确定我是否正确理解了这个问题,但如果你只想计算玩家移动的频率,你可以在用户按键时增加
steps
计数器,例如
if event.key==pygame.K\u LEFT:steps+=1
(在你的事件循环中).我试图计算X和Y位置的变化量,而不管方向如何。因此,1步=1像素=0,0->1,0在位置上。然后skrx给出了一个合适的答案-在您决定实施递增计数器的地方,一个好主意是当您执行“字符”的x/y变量的更改时-无论何时添加/减去x或y中的一个,递增计数器。我建议不要在关键点输入上这样做,因为你的角色可能无法朝所需的方向移动(在墙前),因此不采取步骤=>即使x/y位置变量没有改变,按键输入处的计数器也会增加1。请编辑您的问题,并发布一个经过编辑和澄清的问题。我不确定我是否正确理解该问题,但如果您只想计算玩家移动的频率,当用户按下某个键时,您可以增加
步数
计数器,例如
如果event.key==pygame.K_LEFT:steps+=1
(在您的事件循环中)。我试图计算X和Y位置的变化量,而不考虑方向。因此,1步=1像素=0,0->1,0在位置上。然后skrx给出了一个合适的答案-在您决定实施递增计数器的地方,一个好主意是当您执行“字符”的x/y变量的更改时-无论何时添加/减去x或y中的一个,递增计数器。我建议不要在关键点输入上这样做,因为你的角色可能无法朝所需的方向移动(在墙前),因此不采取步骤=>即使x/y位置变量没有改变,关键输入处的计数器也会增加1。请编辑您的问题并发布一个经过编辑和澄清的问题。非常感谢,这将非常适合我的需要。找到了另一种方法,可以得到相同的结果,但是需要更多(不必要的)代码和全局变量(最好避免),您的方法非常干净。非常感谢,这将非常适合我的需要。找到了另一种方法,可以得到相同的结果,但需要更多(不必要的)代码和全局变量(最好避免),您的方法非常简洁。
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()