【问题标题】:Different moving sprites not showing in pygamepygame中未显示不同的移动精灵
【发布时间】:2017-09-09 01:04:33
【问题描述】:

我正在使用 pygame 在 Python 中制作一个小游戏,我试图让我的角色在屏幕上向不同方向移动,以响应用户按下键盘上的方向箭头。角色移动的每个方向都有 3 个应该连续显示的精灵。问题是,即使根据我按下键盘箭头的上下移动,角色确实会上下移动。只有向上箭头的精灵有效,如果我尝试将角色向下移动,它确实会移动,但它会保持在我向上移动时的先前精灵状态(即根本不显示向下精灵)。这很奇怪,因为上下精灵的代码完全相同,但只有一个在另一个之上工作!我已经包含了我认为相关的代码部分,任何帮助将不胜感激。

pygame.init()
screen = pygame.display.set_mode((900,70))
finished = False
x = 450 - 35/2
y = 650   #initial co-ordiantes of the player

backSprites = ["data/hero/walk-back1.png", "data/hero/walk-back2.png", "data/hero/stand-back.png"]
back_index = 0
backSpritesModified1 = [pygame.image.load(filename) for filename in backSprites]
backSpritesModified2 = [pygame.transform.scale((filename), (45, 50) for filename in backSpritesModified1]
backSpritesModified3 = [(filename).convert_alpha() for filename in backSpritesModified2]
#These previous lines work perfectly when the up button is pressed

frontSprites = ["data/hero/walk-front1.png", "data/hero/walk-front2.png", "data/hero/stand-front.png"]
front_index = 0
frontSpritesModified1 = [pygame.image.load(filename) for filename in frontSprites]
frontSpritesModified2 = [pygame.transform.scale((filename), (45, 50) for filename in frontSpritesModified1]
frontSpritesModified3 = [(filename).convert_alpha() for filename in frontSpritesModified2]
#as you can see it's written in the same syntax as the previous part but doesn,t work

代码的以下部分包含在 while 循环中,就像我说的,它是唯一相关的部分,所以我只包括它们

while finished == False #while the game isn't finished yet
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            finished = True

    pressedKeys = pygame.key.get_pressed()
    if pressedKeys[pygame.K_UP] == 1:
        y -= 5
        back_index = (back_index + 1) %len(backSpritesModified3)
    if pressedKeys[pygame.K_DOWN] == 1:
        y += 5
        front_index = (front_index + 1) %len(frontSpritesModified3)
#not working even though it's the same syntax as the previous one!

【问题讨论】:

  • 请提供minimal, runnable example。我们至少需要了解您如何对图像/表面进行 blit。
  • 好的,这里是到目前为止游戏完整代码的链接。目标是让玩家到达屏幕顶部有宝藏的地方,避免被僵尸击中。随意在精灵的路径中放置不同的图像drive.google.com/file/d/0B7F-SKlHDPGlak9xQkhUTmhjUlk/view
  • 不要发布代码链接,而是在问题中插入一个最小、完整且可验证的示例。

标签: python python-2.7 pygame


【解决方案1】:

这是一个没有图像的最小工作示例,但您会在屏幕上看到文本,显示正在播放的动画以及动画所在的帧。这应该可以帮助您了解如何根据实体状态在动画之间进行切换。有很多方法可以做到这一点。此外,如果不查看代码的其他部分,很难看出哪里出了问题。

import pygame

pygame.init()

screen = pygame.display.set_mode((800,600))
clock = pygame.time.Clock()
font = pygame.font.SysFont(pygame.font.get_default_font(), 25)

running = True;

anim_idle = ['idle-1']
anim_up = ['up-1', 'up-2', 'up-3']
anim_down = ['down-1', 'down-2', 'down-3']

anim_dict = {'up': anim_up, 'down': anim_down, 'idle': anim_idle}
anim_speed = 0.25# each frame of the animation lasts 1/4 of a second

current_anim_name = 'idle'
current_anim = anim_dict.get(current_anim_name)
current_anim_frame = 0
current_frame_time = 0

def change_anim(anim_name):
    global current_anim_name, current_anim, current_anim_frame, current_frame_time
    current_anim_name = anim_name
    current_anim = anim_dict.get(anim_name)
    current_anim_frame = 0
    current_frame_time = 0

while running:
    dt = clock.tick() * 0.001# delta time in seconds
    current_frame_time = current_frame_time + dt
    if current_frame_time >= anim_speed:
        current_anim_frame = (current_anim_frame + 1)%len(current_anim)
        current_frame_time = 0
    for event in pygame.event.get():
        print(event)
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE:
                running = False
            if event.key == pygame.K_UP:
                change_anim('up')
            elif event.key == pygame.K_DOWN:
                change_anim('down')
            elif event.key == pygame.K_LEFT:
                pass
            elif event.key == pygame.K_RIGHT:
                pass
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_UP:
                change_anim('idle')
            elif event.key == pygame.K_DOWN:
                change_anim('idle')
            elif event.key == pygame.K_LEFT:
                pass
            elif event.key == pygame.K_RIGHT:
                pass
    screen.fill((0,0,0))
    screen.blit(font.render(current_anim_name + ' :: frame ' + current_anim[current_anim_frame], True, (255,255,255)), (0,0))
    pygame.display.flip()

pygame.quit()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多