如何移动动画精灵



所以我最近开始尝试制作一款游戏。我在移动动画播放器时遇到问题。我让它在动画的精灵表中翻转,我只是不知道如何让动画在屏幕上移动。所以我只需要知道如何移动动画图像。在游戏中,我有一个正在运行的动画和一个空闲的动画,当我按住箭头键并在屏幕上移动时,我希望它切换到运行的动画。然后在不移动的情况下返回到空闲动画。

import pygame
from sys import exit
import time
pygame.init()
pygame.display.set_caption('Rocket_Jump')
width = 1750
height = 1250
screen = pygame.display.set_mode((width,height))
#FPS
clock = pygame.time.Clock()
#Black Gunner
bg_idle_sheet = pygame.image.load(r'Rocket_JumpTeamGunner_By_SecretHideout_060519CHARACTER_SPRITESBlackGunner_ Black_Idle.png').convert_alpha(); bg_idle_frames = 5
bg_run_sheet = pygame.image.load(r'Rocket_JumpTeamGunner_By_SecretHideout_060519CHARACTER_SPRITESBlackGunner_Black_run.png').convert_alpha(); bg_run_frames = 6
bg_crouch_sheet = pygame.image.load(r'Rocket_JumpTeamGunner_By_SecretHideout_060519CHARACTER_SPRITESBlackGunner_Black_crouch.png').convert_alpha(); bg_crouch_frames = 3
bg_death_sheet = pygame.image.load(r'Rocket_JumpTeamGunner_By_SecretHideout_060519CHARACTER_SPRITESBlackGunner_Black_death.png').convert_alpha(); bg_death_frames = 8
bg_jump_sheet = pygame.image.load(r'Rocket_JumpTeamGunner_By_SecretHideout_060519CHARACTER_SPRITESBlackGunner_Black_jump.png').convert_alpha(); bg_jump_frames = 2
#Background
BG = (178, 190, 181)
#start position
start_x = 100
start_y = 100
#Gets images from a sprite sheet
def get_image(sheet, frame, width, height, scale, color):
image = pygame.Surface((width, height)).convert_alpha()
image.blit(sheet, (0, 0), (frame * width, 0, width, height))
image = pygame.transform.scale(image, (width * scale, width * scale))
image.set_colorkey(color)
return image

#Animation
class  Gunner(pygame.sprite.Sprite):
def __init__(self, sheet, frames, pos_x, pos_y, type):
pygame.sprite.Sprite.__init__(self)
self.sprites = [get_image(sheet, i, 48, 48, 4, 'Black') for i in range(frames)]
self.current_sprite = 0
self.image = self.sprites[self.current_sprite]
self.rect = self.image.get_rect()
self.x = pos_x
self.y = pos_y
self.rect.center = [self.x, self.y]
self.type = type
def update(self):
self.current_sprite += 1
if self.current_sprite >= len(self.sprites):
self.current_sprite = 0
self.image = self.sprites[self.current_sprite]
def draw(self, screen):
screen.blit(self.image, self.rect)
moving_sprites = pygame.sprite.Group()
run = True

while run:
#What keys are pressed
keys = pygame.key.get_pressed()
player_idle = Gunner(bg_idle_sheet, bg_idle_frames, start_x, start_y, 1)
player_run = Gunner(bg_run_sheet, bg_run_frames, 100, 100, 2)
moving_sprites.add(player_idle)
moving_sprites.add(player_run)
#Screen color
screen.fill(BG)
#Quit Program
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False

if keys[pygame.K_RIGHT]:
for sprite in moving_sprites: 
if sprite.type == 1: 
start_x += 1
sprite.draw(screen)
elif sprite.type == 2:
sprite.draw(screen)

moving_sprites.update()
pygame.display.flip()
pygame.display.update()
clock.tick(12)

要使动画精灵移动,我建议您使用pygame矩形的内置功能,如移动功能,而不是在游戏循环的每次迭代中更新start_x:

https://www.pygame.org/docs/ref/rect.html#pygame.Rect.move_ip

此外,你应该在游戏循环之前只制作一次Gunner对象,而不是每次迭代都重新创建相同的东西。最终,一旦你在游戏中添加了更多内容,你的游戏就会因此而开始滞后。

对于动画之间的转换,我强烈建议您从只制作Gunner对象的一个实例开始,并且它包含所有动画。而不是两个炮手对象,每个炮手只有一组图像。例如,你可以让你的枪手精灵的结构像

self.sprites = {
"running" : [get_image(bg_run_sheet, i, 48, 48, 4, 'Black') for i in range(bg_run_frames)],
"idle" :  [get_image(bg_idle_sheet , i, 48, 48, 4, 'Black') for i in range(bg_idle_frames)]
}

然后你可以在一个变量中跟踪枪手的状态,并根据你的状态键入这个dict。为了管理状态,在炮手的更新功能中,如果发生KEYDOWN事件,则运行、KEYUP、空闲等

最新更新