如何解决Pygame 跳跃动画问题
所以我正在用 pygame 制作一个 2d 平台游戏,我让玩家精灵能够左右移动、跳跃和攻击(使用动画)
所以我想让玩家在跳跃时能够进行攻击,因为在跳跃动画中必须停止并且攻击动画必须出现但玩家仍然应该向上跳跃和向下坠落,
当我尝试实现这一点时,我遇到了一个问题,即直到玩家落地时才会出现攻击动画,
我尝试在跳跃动画循环中添加一个 if 循环:'if self.slash == True: interrupt_jump = True' 当我运行它时会中断跳跃动画,但斜线(攻击)动画在玩家击中后开始地面,
# player update function
def update(self):
dx = 0
dy = 0
walk_cooldown = 5
down = False
attac = False
self.isidle = 0
self.framedelay = 0.12
#self.slash = False
key = pygame.key.get_pressed()
if key[pygame.K_UP] and self.times_jumped <= 25 and not self.jumped:
self.jump_ini = True
self.vel_y = - 17
self.jumpll = 0
self.times_jumped += 1
self.jumped = True
if not key[pygame.K_UP]:
self.times_jumped = 0
self.j_pressed += 1
if self.j_pressed > 40:
self.jumped = False
self.j_pressed = 0
# self.jumped = False
if key[pygame.K_LEFT]:
dx -= 10
self.counter += 1
self.direction = -1
if key[pygame.K_RIGHT]:
dx += 10
self.counter += 1
self.direction = 1
self.isidle = False
# self.image = self.run_animation[self.idle]
if key[pygame.K_LEFT] == False and key[pygame.K_RIGHT] == False:
self.counter = 0
if self.direction == 1:
self.image = self.run_animation[self.run]
if self.direction == -1:
self.image = self.run_animation[self.run]
self.isidle = True
if key[pygame.K_DOWN]:
down = True
if key[pygame.K_z]:
attac = True
self.slash = True
if self.isidle:
global idle_frame_start
if time.time() - idle_frame_start > self.framedelay:
if self.idle < 3:
self.idle += 1
else:
self.idle = -1
idle_frame_start = time.time()
elif not self.isidle:
if time.time() - run_frame_start > self.framedelay:
if self.run < 3:
self.run += 1
else:
self.run = 0
idle_frame_start = time.time()
if self.slash:
self.isidle = False
global at_frame_start
if time.time() - at_frame_start > self.framedelay:
if self.at < 3:
self.at += 1
else:
self.slash = False
self.at = -1
at_frame_start = time.time()
# add gravity
#self.vel_y += 1
#if self.vel_y > 10:
# self.vel_y = 10
#dy += self.vel_y
# add gravity
# JUMP animation
interrupt_jump = 0
if self.jump_ini:
if self.slash == True:
interrupt_jump = True
else:
interrupt_jump = False
if down and self.vel_y > 0:
dy += 10
if time.time() - jump_frame_start > 0.12:
if self.jumpp < 7:
if self.jumpp == 4:
self.jumpp = 4
self.chg_j_animation = False
if self.chg_j_animation:
time.sleep(0.05)
self.jumpp += 1
if self.vel_y == 11:
self.jumpp = 5
if self.jumpp > 5:
dx += 15
else:
self.chg_j_animation = True
else:
self.jumpp = -1
self.jump_ini = False
at_frame_start = time.time()
self.vel_y += 1
if self.vel_y > 15:
self.vel_y = 15
dy += self.vel_y
# handle animation
if self.counter > walk_cooldown:
self.counter = 0
self.run += 1
if self.run >= len(self.run_animation):
self.run = 0
if self.direction == 1:
self.image = self.run_animation[self.run]
if self.direction == -1:
self.image = self.run_animation[self.run]
self.vel_y += 1
dy += self.vel_y
self.rect.x += dx
self.rect.y += dy
if self.rect.bottom > screen_height:
self.rect.bottom = screen_height
dy = 0
if self.jump_ini and not interrupt_jump:
time.sleep(0.05)
screen.blit(self.jump_animation[self.jumpp],(self.rect))
if self.slash:
time.sleep(0.05)
self.slimg = self.at_animation[self.at]
screen.blit(self.slimg,self.rect)
游戏循环:
player = Player1(100,250)
idle_frame_start = time.time()
run_frame_start = time.time()
at_frame_start = time.time()
jump_frame_start = time.time()
enemy_idle_frame = time.time()
enemy1 = Enemy(250,100)
while run:
screen.blit(bg_img,(0,0))
enemy1.update()
world.draw()
player.update()
draw_grid()
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
pygame.display.update()
pygame.quit()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。