Python - 计算RPG游戏中的步骤

时间:2017-04-12 08:15:24

标签: python-3.x pygame

问题如下:

我在我的RPG游戏中使用pygame。 我有一个响应向左,向右,向上,向下并相应地移动坐标的玩家(即0,0 - > 1,0 - > 2,0 - > 3,0 - > 2,0)

每次我向左或向右按​​下指定的移动按钮时,我都可以启动计数器。

问题是我的玩家在按住时可以移动ie。左键。 这是注册为"永久"释放前的动作。

每次按下按钮1,计数器都会亮起。 现在我想要o计算运动而不需要计算每次按下,因为玩家可以在不释放的情况下移动整个地图,这只算一步。

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,如果没有对玩家进行任何更改,则不会计算步数?

1 个答案:

答案 0 :(得分:0)

每当玩家的x或y速度为!= 0时,玩家正在移动,因此我们可以在主循环中将每个帧的count变量递增1。 (我已经将玩家的速度提高到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()