使用带有功能的pygame进行角色动画的问题

时间:2018-11-12 13:12:24

标签: python python-3.x pygame

我想请您帮助解决我的这个问题。我只需要使用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()

我已经检查过并将其与其他代码进行比较,但是我只是找不到真正的问题。

2 个答案:

答案 0 :(得分:1)

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

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

global left                                
global right

draw的开头。


  

我只需要使用pygame中的功能(无类)来开发游戏

鉴于pygame本身包含了很多类,而您已经使用了其中一些类,因此这是一个奇怪的要求。

答案 1 :(得分:1)

已经提到了简单的修复方法,但是我宁愿建议完全摆脱全局变量,而只是使用主循环将它们移入函数以使其局部化。

此外,drawCharacter函数不应该负责更新walkCount以及为图像加斑点。我将其删除并更新walkCount子句中的if key[pygame.K_LEFT]...,然后使用它将当前播放器图像分配给变量(player_image),您可以在以后的绘图中将其变白。部分。这样一来,您还可以摆脱leftright变量。

drawCharacter函数将仅由这两行组成,

window.blit(background, (0, 0))
window.blit(player_image, (x, y))

所以您也可以在主循环中简单地调用它们,而不用在函数中调用它们(必须将这些参数传递给它们)。

顺便说一句,在加载图像时调用convertconvert_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()