Python 使用pygame函数的角色动画存在问题
我想请你帮我解决这个问题。我需要开发一个只使用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
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()