python - 谁能帮我解决我的代码遇到的这个pygame TypeError?
问题描述
您好,我是堆栈溢出和 python 的新手,我需要一些帮助来解决我遇到的这个编码错误。我按照 Tim 的关于创建精灵移动的教程学习了 Tech,当我移动我的精灵时遇到了一条错误消息。这是我关注的视频的链接: https ://www.youtube.com/watch?v=UdsNBIzsmlI
跳跃运动似乎有效,但当我将角色/精灵向左/向右移动超过 3 步时,我收到一条错误消息。这是我收到的错误消息:
Traceback (most recent call last):
File "C:\Users\Desktop\PYGAME Folder\Game Code.py", line 90, in <module>
redrawGameWindow()
File "C:\Users\Desktop\PYGAME Folder\Game Code.py", line 40, in redrawGameWindow
win.blit(walkRight[walkCount//3], (x,y))
TypeError: argument 1 must be pygame.Surface, not str
以下是使用 Tech 和 Tim 的示例的代码:
import pygame
pygame.init()
win = pygame.display.set_mode((500,480))
pygame.display.set_caption("First Game")
walkRight = [pygame.image.load('R1.png'), ('R2.png'), ('R3.png'), ('R4.png'), ('R5.png'), ('R6.png'), ('R7.png'), ('R8.png'), ('R9.png')]
walkLeft = [pygame.image.load('L1.png'), ('L2.png'), ('L3.png'), ('L4.png'), ('L5.png'), ('L6.png'), ('L7.png'), ('L8.png'), ('L9.png')]
bg = pygame.image.load('bg.jpg')
char = pygame.image.load('standing.png')
x = 50
y = 400
width = 40
height = 60
vel = 5
clock = pygame.time.Clock()
isJump = False
jumpCount = 10
left = False
right = False
walkCount = 0
def redrawGameWindow():
global walkCount
win.blit(bg, (0,0))
if walkCount + 1 >= 27:
walkCount = 0
if left:
win.blit(walkLeft[walkCount//3], (x,y))
walkCount += 1
elif right:
win.blit(walkRight[walkCount//3], (x,y))
walkCount += 1
else:
win.blit(char, (x, y))
walkCount = 0
pygame.display.update()
run = True
while run:
clock.tick(27)
for event in pygame.event.get():
if event.type == pygame.QUIT:
run = False
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT] and x > vel:
x -= vel
left = True
right = False
elif keys[pygame.K_RIGHT] and x < 500 - width - vel:
x += vel
left = False
right = True
else:
left = False
right = False
walkCount = 0
if not(isJump):
if keys[pygame.K_SPACE]:
isJump = True
left = False
right = False
walkCount = 0
else:
if jumpCount >= -10:
y -= (jumpCount * abs(jumpCount)) * 0.5
jumpCount -= 1
else:
jumpCount = 10
isJump = False
redrawGameWindow()
pygame.quit()
解决方案
在walkRight
中,仅实际加载了第一张图像。其他只是文件名。有同样的问题walkLeft
。看看这是否能解决问题:
walkRight = [pygame.image.load(i) for i in ['R1.png', 'R2.png', 'R3.png', 'R4.png', 'R5.png', 'R6.png', 'R7.png', 'R8.png', 'R9.png']]
要获得更简洁的代码,请尝试以下操作:
walkRight = [pygame.image.load("R%d.png"%i) for i in range(1,10)]
推荐阅读
- c# - 数据表单元格数学
- mysql - 优化数据库中大表的查询(SQL)
- powershell - 忽略Powershell中文本字符串中的引号
- javascript - 如何将 Codepen 脚本添加到我的文件中(见截图)
- html - 需要帮助将图像集中在我的标题列表中吗?
- flutter - Flutter on VS Code 运行卡在“Installing build\app\outputs\apk\app.apk...”
- css - 文件拖放到元素上后使用 :hover CSS 规则闪烁元素
- python - 如何为 Pandas 中同一类别的每条记录添加均值?
- docker - 只有一个 ubuntu docker 容器来装我需要的一切是不是错了?
- mongodb - 如何从MongoDB中对象的对象数组中查找记录