如何检测Python Pygame中以前的移动?
我想检测角色先前的移动,以显示与先前移动相关的动画。例如,如果上一个动作是“向右移动”,当角色停止时,我想显示一个向右移动的图像。左边也是一样。你能帮我吗 编辑 我会给你一部分相关的代码,希望它能帮助你如何检测Python Pygame中以前的移动?,python,pygame,sprite,Python,Pygame,Sprite,我想检测角色先前的移动,以显示与先前移动相关的动画。例如,如果上一个动作是“向右移动”,当角色停止时,我想显示一个向右移动的图像。左边也是一样。你能帮我吗 编辑 我会给你一部分相关的代码,希望它能帮助你 import pygame import constants import time clock = pygame.time.Clock() class Player(pygame.sprite.Sprite): def __init__(self): sup
import pygame
import constants
import time
clock = pygame.time.Clock()
class Player(pygame.sprite.Sprite):
def __init__(self):
super().__init__()
self.velocity = 5
self.HeatBox = constants.S_PLAYER_HEATBOX
self.rect = self.HeatBox.get_rect()
self.rect.x = 500
self.rect.y = 300
self.WalkCount = 0
def move_right(self):
self.rect.x += self.velocity
def move_left(self):
self.rect.x -= self.velocity
def move_up(self):
self.rect.y -= self.velocity
def move_down(self):
self.rect.y += self.velocity
def draw_game():
global SURFACE_MAIN, Player
SURFACE_MAIN.fill(constants.COLOR_DEFAULT_BG)
SURFACE_MAIN.blit(constants.S_BACKGROUND, (0, 0))
SURFACE_MAIN.blit(constants.S_PLAYER_HEATBOX, game.player.rect)
if game.player.WalkCount + 1 >= 40:
game.player.WalkCount = 0
if game.pressed.get(pygame.K_RIGHT):
SURFACE_MAIN.blit(constants.S_PLAYER_W_RIGHT[game.player.WalkCount//10],
game.player.rect)
game.player.move_right()
if game.pressed.get(pygame.K_LEFT):
SURFACE_MAIN.blit(constants.S_PLAYER_W_LEFT[game.player.WalkCount//10],
game.player.rect)
game.player.move_left()
if game.pressed.get(pygame.K_UP):
game.player.move_up()
if game.pressed.get(pygame.K_DOWN):
game.player.move_down()
pygame.display.flip()
def game_main_loop():
game_quit = False
while not game_quit:
clock.tick(60)
events_list = pygame.event.get()
for event in events_list:
if event.type == pygame.QUIT:
game_quit = True
elif event.type == pygame.KEYDOWN:
game.pressed[event.key] = True
elif event.type == pygame.KEYUP:
game.pressed[event.key] = False
draw_game()
pygame.quit()
exit()
def game_initialize():
global SURFACE_MAIN, Player
pygame.init()
pygame.display.set_caption("RogueLike")
SURFACE_MAIN = pygame.display.set_mode((constants.GAME_WIDTH,
constants.GAME_HEIGHT))
class gameplay:
def __init__(self):
self.player = Player()
self.pressed = {}
game = gameplay()
if __name__ == '__main__':
game_initialize()
game_main_loop()
在一个名为constants.py的文件中,我有我所有的精灵
S_BACKGROUND = pygame.image.load('Sprites/Map/Map_Test_3.png')
S_PLAYER_HEATBOX = pygame.image.load('Sprites/Heros/Knight/HeatBox.png')
S_PLAYER_RIGHT =
[pygame.image.load('Sprites/Heros/Knight/Right/sprite_0.png'),
pygame.image.load('Sprites/Heros/Knight/Right/sprite_1.png'),
pygame.image.load('Sprites/Heros/Knight/Right/sprite_2.png'),
pygame.image.load('Sprites/Heros/Knight/Right/sprite_3.png')]
S_PLAYER_LEFT =
[pygame.image.load('Sprites/Heros/Knight/Left/sprite_0.png'),
pygame.image.load('Sprites/Heros/Knight/Left/sprite_1.png'),
pygame.image.load('Sprites/Heros/Knight/Left/sprite_2.png'),
pygame.image.load('Sprites/Heros/Knight/Left/sprite_3.png')]
S_PLAYER_W_RIGHT =
[pygame.image.load('Sprites/Heros/Knight/W_Right/sprite_0.png'),
pygame.image.load('Sprites/Heros/Knight/W_Right/sprite_1.png'),
pygame.image.load('Sprites/Heros/Knight/W_Right/sprite_2.png'),
pygame.image.load('Sprites/Heros/Knight/W_Right/sprite_3.png')]
S_PLAYER_W_LEFT =
[pygame.image.load('Sprites/Heros/Knight/W_Left/sprite_0.png'),
pygame.image.load('Sprites/Heros/Knight/W_Left/sprite_1.png'),
pygame.image.load('Sprites/Heros/Knight/W_Left/sprite_2.png'),
pygame.image.load('Sprites/Heros/Knight/W_Left/sprite_3.png')]
# Left : means sprites turned to the right when the character is stopped.
# Right : means sprites turned to the left when the character is stopped.
# W_Left : means sprites turned to theleft when the character is walking.
# W_Right : means sprites turned to the right when the character is walking.
# S_ : means Sprites
我对你问题的理解是,你希望玩家精灵“面对”上一个动作的方向。例如,如果玩家上次向左移动,精灵应该显示为面向左侧 通过将Sprite
image
值设置为正确的位图,可以很容易地实现这一点。没有解释,所以我不太明白“热箱”代表什么,所以我将忽略它。image
和rect
都是一种特殊的图像。精灵库代码使用它们来绘制和检测精灵的碰撞。最好将另一个变量名用于其他目的
class Player(pygame.sprite.Sprite):
DIR_LEFT = 0
DIR_RIGHT= 1 # This might be better as an Enumerated Type
DIR_UP = 2
DIR_DOWN = 3
def __init__(self):
super().__init__()
self.velocity = 5
self.heat_box = constants.S_PLAYER_HEATBOX
self.heat_rect = self.HeatBox.get_rect()
self.image = S_PLAYER_LEFT[0] # Initially face left
self.rect = self.image.get_rect()
self.rect.x = 500
self.rect.y = 300
self.walk_count= 0 # animation frame count
self.last_dir = Player.DIR_LEFT # direction last walked
def move_right(self):
if ( self.last_dir != Player.DIR_RIGHT ): # changed direction?
self.walk_count = -1 # so next-frame is 0
self.last_dir = Player.DIR_RIGHT # now face right
# continue walking right
self.rect.x += self.velocity
self.walk_count += 1
if ( walk_count >= len( S_PLAYER_W_RIGHT ) ): # loop the animation
self.walk_count = 0
self.image = S_PLAYER_W_RIGHT[ self.walk_count ]
def move_left(self):
if ( self.last_dir != Player.DIR_LEFT ): # changed direction?
self.walk_count = -1 # so next-frame is 0
self.last_dir = Player.DIR_LEFT # now face left
# continue walking left
self.rect.x -= self.velocity
self.walk_count += 1
if ( walk_count >= len( S_PLAYER_W_LEFT ) ): # loop the animation
self.walk_count = 0
self.image = S_PLAYER_W_LEFT[ self.walk_count ]
# TODO: Much the same for Up/Down too
当方向改变时,动画循环计数器(walk\u count
)复位,新方向的位图分配到Player.image
,并在Player.last\u dir
中记忆
因此,基本上,Player
类会记住精灵所面对的方向,以及之前绘制的动画帧。如果播放器继续沿同一方向移动,则动画将在每次移动中逐步通过。如果方向已更改,则动画将重置其他方向位图集
要将玩家吸引到屏幕上,请将其添加到a,并告诉组在主循环中吸引自己。作为奖励,您还可以使用所有功能
player_group = pygame.sprite.GroupSingle()
player_group.add( Player() ) # create the player
...
# main loop
player_group.draw( screen )
注意:CamelCase变量名更改为小写以匹配。我对您的问题的理解是,您希望玩家精灵“面对”上一次移动的方向。例如,如果玩家上次向左移动,精灵应该显示为面向左侧 通过将Sprite
image
值设置为正确的位图,可以很容易地实现这一点。没有解释,所以我不太明白“热箱”代表什么,所以我将忽略它。image
和rect
都是一种特殊的图像。精灵库代码使用它们来绘制和检测精灵的碰撞。最好将另一个变量名用于其他目的
class Player(pygame.sprite.Sprite):
DIR_LEFT = 0
DIR_RIGHT= 1 # This might be better as an Enumerated Type
DIR_UP = 2
DIR_DOWN = 3
def __init__(self):
super().__init__()
self.velocity = 5
self.heat_box = constants.S_PLAYER_HEATBOX
self.heat_rect = self.HeatBox.get_rect()
self.image = S_PLAYER_LEFT[0] # Initially face left
self.rect = self.image.get_rect()
self.rect.x = 500
self.rect.y = 300
self.walk_count= 0 # animation frame count
self.last_dir = Player.DIR_LEFT # direction last walked
def move_right(self):
if ( self.last_dir != Player.DIR_RIGHT ): # changed direction?
self.walk_count = -1 # so next-frame is 0
self.last_dir = Player.DIR_RIGHT # now face right
# continue walking right
self.rect.x += self.velocity
self.walk_count += 1
if ( walk_count >= len( S_PLAYER_W_RIGHT ) ): # loop the animation
self.walk_count = 0
self.image = S_PLAYER_W_RIGHT[ self.walk_count ]
def move_left(self):
if ( self.last_dir != Player.DIR_LEFT ): # changed direction?
self.walk_count = -1 # so next-frame is 0
self.last_dir = Player.DIR_LEFT # now face left
# continue walking left
self.rect.x -= self.velocity
self.walk_count += 1
if ( walk_count >= len( S_PLAYER_W_LEFT ) ): # loop the animation
self.walk_count = 0
self.image = S_PLAYER_W_LEFT[ self.walk_count ]
# TODO: Much the same for Up/Down too
当方向改变时,动画循环计数器(walk\u count
)复位,新方向的位图分配到Player.image
,并在Player.last\u dir
中记忆
因此,基本上,Player
类会记住精灵所面对的方向,以及之前绘制的动画帧。如果播放器继续沿同一方向移动,则动画将在每次移动中逐步通过。如果方向已更改,则动画将重置其他方向位图集
要将玩家吸引到屏幕上,请将其添加到a,并告诉组在主循环中吸引自己。作为奖励,您还可以使用所有功能
player_group = pygame.sprite.GroupSingle()
player_group.add( Player() ) # create the player
...
# main loop
player_group.draw( screen )
注意:CamelCase变量名称更改为小写以匹配。欢迎访问该网站!你能按原样发布一点移动代码吗?不要检测到它;记住那是什么。还有,请拿着这本书读一读,“记住”克里斯是什么意思?@Dyrockw,我的意思是把它保存在记忆中。例如,创建一个名为
last\u move
的变量,并在有移动时更新该变量。或者创建一个名为“移动”的列表,并保存最后一个n
。欢迎访问该网站!你能按原样发布一点移动代码吗?不要检测到它;记住那是什么。还有,请拿着这本书读一读,“记住”克里斯是什么意思?@Dyrockw,我的意思是把它保存在记忆中。例如,创建一个名为last\u move
的变量,并在有移动时更新该变量。或者创建一个名为“移动”的列表,并保存最后一个n
。