Python 使用pygame函数的角色动画存在问题

Python 使用pygame函数的角色动画存在问题,python,python-3.x,pygame,Python,Python 3.x,Pygame,我想请你帮我解决这个问题。我需要开发一个只使用pygame中的函数(没有类)的游戏 我已经设法运行游戏,但动画或精灵没有更新,因为他们应该。当图像在移动时发生变化时,图像始终保持不变 我做错了什么 代码如下: import pygame WIDTH = 800 HEIGHT= 600 pygame.display.set_caption("Nico's worst adventure") window = pygame.display

我想请你帮我解决这个问题。我需要开发一个只使用pygame中的函数(没有类)的游戏

我已经设法运行游戏,但动画或精灵没有更新,因为他们应该。当图像在移动时发生变化时,图像始终保持不变

我做错了什么

代码如下:

import pygame               

WIDTH = 800     
HEIGHT= 600      
pygame.display.set_caption("Nico's worst adventure")    
window = pygame.display.set_mode((WIDTH, HEIGHT))        

#Color         #R       #G      #B
White =      (255,     255,    255)
Black =       (0,       0,      0)
Red =        (255,     0,      0)
Blue =        (0,       0,      255)

#Position
x = 50
y = 425

imageWidth = 64

vel = 5                 #Velocity of movement

isJumping = False   
jumpCount = 10     

left = False       
right = False         
walkCount = 0   

#Image port
walkRight = [pygame.image.load('Nico right(1).png'), pygame.image.load('Nico right(2).png'), pygame.image.load('Nico right(3).png'), pygame.image.load('Nico right(4).png')]
walkLeft = [pygame.image.load('Nico left(1).png'), pygame.image.load('Nico left(2).png'), pygame.image.load('Nico left(3).png'), pygame.image.load('Nico left(4).png')]
still = pygame.image.load('Nico still.png')
backgorund = pygame.image.load('Fondo.png')



def drawCharacter():
    global walkCount                              
    window.blit(backgorund, (0,0))                           
    if walkCount + 1 >= 12:            
        walkCount = 0                  

    if left:
        window.blit(walkLeft[walkCount//3], (x, y))
        walkCount += 1
    elif right:
        window.blit(walkRight[walkCount//3], (x, y))
        walkCount += 1
    else:
        window.blit(still, (x, y))

    pygame.display.update()


def draw():
    global imageWidth
    global WIDTH
    global x                                           
    global y                                             
    global vel                                           
    global jumpCount                               
    global isJumping                                
    clock = pygame.time.Clock()                          
    play = True                                    
    #Main loop
    while play:                                       
        clock.tick(27)                                   
        pygame.init()                                  

        for event in pygame.event.get():               
            if event.type == pygame.QUIT:               
                play = False                          

        key = pygame.key.get_pressed()                 
        if key[pygame.K_LEFT] and x > vel:               
            x -= vel
            left = True
            right = False

        elif key[pygame.K_RIGHT] and x < WIDTH - imageWidth - vel:              
            x += vel
            right = True
            left = False
        else:                                          
            right = False
            left = False
            walkCount = 0                         

        if not(isJumping):                            
            if key[pygame.K_SPACE]:
                isJumping = True
                right = False
                left = False
                walkCount = 0

        else:
            if jumpCount >= -10:                        
                neg = 1                                    
                if jumpCount < 0:
                    neg = -1
                y -= (jumpCount ** 2) * 0.5 * neg      
                jumpCount -= 1
            else:
                isJumping = False
                jumpCount = 10


        drawCharacter()
        pygame.display.flip()


    pygame.quit()

draw()
导入pygame
宽度=800
高度=600
pygame.display.set_标题(“尼科最糟糕的冒险”)
window=pygame.display.set_模式((宽度、高度))
#颜色#R#G#B
白色=(255,255,255)
黑色=(0,0,0)
红色=(255,0,0)
蓝色=(0,0255)
#位置
x=50
y=425
imageWidth=64
vel=5#移动速度
isJumping=False
跳数=10
左=假
右=假
步行次数=0
#图像端口
walkRight=[pygame.image.load('Nico right(1.png')、pygame.image.load('Nico right(2.png')、pygame.image.load('Nico right(3.png')、pygame.image.load('Nico right(4.png'))
walkLeft=[pygame.image.load('Nico left(1.png')、pygame.image.load('Nico left(2.png')、pygame.image.load('Nico left(3.png')、pygame.image.load('Nico left(4.png'))
still=pygame.image.load('Nico still.png')
backgorund=pygame.image.load('Fondo.png')
def drawCharacter():
全局步行计数
窗板(背角(0,0))
如果walkCount+1>=12:
步行次数=0
如果留下:
blit(walkLeft[walkCount//3],(x,y))
步行次数+=1
埃利夫权利:
blit(walkRight[walkCount//3],(x,y))
步行次数+=1
其他:
窗玻璃(静止,(x,y))
pygame.display.update()
def draw():
全局图像宽度
全局宽度
全球x
全局y
全球水平
全局跳转计数
全球跳跃
clock=pygame.time.clock()
播放=正确
#主回路
游戏时:
时钟滴答作响(27)
pygame.init()
对于pygame.event.get()中的事件:
如果event.type==pygame.QUIT:
播放=错误
key=pygame.key.get_pressed()
如果键[pygame.K_LEFT]和x>vel:
x-=水平
左=真
右=假
elif键[pygame.K_RIGHT]和x=-10:
负=1
如果跳线计数<0:
负=-1
y-=(跳线计数**2)*0.5*负
跳转计数-=1
其他:
isJumping=False
跳数=10
drawCharacter()
pygame.display.flip()
pygame.quit()
画()

我已经检查了它,并将它与其他代码进行了比较,但我就是找不到真正的问题所在

这是因为
draw
函数中的
left
right
是局部变量,而不是全局变量

一个简单的解决方法是添加

global left                                
global right
绘图的开头


我需要开发一个只使用pygame中的函数(没有类)的游戏


这是一个奇怪的要求,因为pygame本身充满了类,并且您已经使用了其中的一些类。

简单的修复方法已经提到过,但我建议完全去掉全局变量,只将它们移动到带有主循环的函数中,使它们成为局部变量

另外,
drawCharacter
功能不应负责更新
walkCount
以及对图像进行分屏。我只需删除它并更新
if key[pygame.K_LEFT].
子句中的
walkCount
,然后使用它将当前播放器图像分配给变量(
player_image
),您可以稍后在绘图部分中对其进行blit。这也允许您去掉
变量

drawCharacter
函数将只包含这两行

window.blit(background, (0, 0))
window.blit(player_image, (x, y))
因此,您也可以在主循环中调用它们,而不是在函数中调用它们(您必须将这些参数传递给函数)

顺便说一下,在加载图像时调用
convert
convert\u alpha
方法以提高性能

以下是更新的代码:

import pygame


pygame.init()
WIDTH = 800
HEIGHT= 600
pygame.display.set_caption("Nico's worst adventure")
window = pygame.display.set_mode((WIDTH, HEIGHT))

White = (255, 255, 255)
Black = (0, 0, 0)
Red = (255, 0, 0)
Blue = (0, 0, 255)
# Images (I assume you're using pictures with a transparent background
# so I call the `convert_alpha` method).
walkRight = [
    pygame.image.load('Nico right(1).png').convert_alpha(),
    pygame.image.load('Nico right(2).png').convert_alpha(),
    pygame.image.load('Nico right(3).png').convert_alpha(),
    pygame.image.load('Nico right(4).png').convert_alpha(),
    ]
walkLeft = [
    pygame.image.load('Nico left(1).png').convert_alpha(),
    pygame.image.load('Nico left(2).png').convert_alpha(),
    pygame.image.load('Nico left(3).png').convert_alpha(),
    pygame.image.load('Nico left(4).png').convert_alpha(),
    ]
still = pygame.image.load('Nico still.png').convert_alpha()
background = pygame.image.load('Fondo.png').convert()



def game():
    clock = pygame.time.Clock()
    # Player related variables.
    x = 50
    y = 425
    imageWidth = 64
    vel = 5
    isJumping = False
    jumpCount = 10
    walkCount = 0
    player_image = still  # Assign the current image to a variable.

    play = True
    while play:
        clock.tick(27)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                play = False

        key = pygame.key.get_pressed()
        if key[pygame.K_LEFT] and x > vel:
            x -= vel
            # Update the walkCount and image here.
            walkCount += 1
            player_image = walkRight[walkCount//3]
        elif key[pygame.K_RIGHT] and x < WIDTH - imageWidth - vel:
            x += vel
            walkCount += 1
            player_image = walkLeft[walkCount//3]
        else:
            player_image = still
            walkCount = 0

        if walkCount + 1 >= 12:
            walkCount = 0

        if not isJumping:
            if key[pygame.K_SPACE]:
                isJumping = True
                walkCount = 0
        else:
            if jumpCount >= -10:
                neg = 1
                if jumpCount < 0:
                    neg = -1
                y -= (jumpCount ** 2) * 0.5 * neg
                jumpCount -= 1
            else:
                isJumping = False
                jumpCount = 10

        window.blit(background, (0, 0))
        window.blit(player_image, (x, y))  # Just blit the current image.
        pygame.display.flip()  # Only one `flip()` or `update()` call per frame.


game()
pygame.quit()
导入pygame
pygame.init()
宽度=800
高度=600
pygame.display.set_标题(“尼科最糟糕的冒险”)
window=pygame.display.set_模式((宽度、高度))
白色=(255,255,255)
黑色=(0,0,0)
红色=(255,0,0)
蓝色=(0,0255)
#图片(我假设您使用的是透明背景的图片
#所以我称之为“convert_alpha”方法)。
向右行走=[
pygame.image.load('Nico right(1.png')。convert_alpha(),
pygame.image.load('Nico right(2.png')。convert_alpha(),
pygame.image.load('Nico right(3.png')。convert_alpha()