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