问题描述
这是主要代码
import pygame
from player import *
pygame.init()
window = pygame.display.set_mode((800,600))
pygame.display.set_caption("Platformer")
gravity=-0.5
black = (0,0,0)
blue = (50,60,200)
clock = pygame.time.Clock()
player=Player(400,0)
gameLoop = True
while gameLoop:
for event in pygame.event.get():
if (event.type==pygame.QUIT):
gameLoop = False
window.fill(blue)
player.update(gravity)
player.update(window)
clock.tick(60)
pygame.display.flip()
pygame.quit()
这是第二个文件
import pygame
class Player:
def __init__(self,x,y):
self.x=x
self.y=y
self.width=32
self.height=32
self.velocity=0
def update(self, gravity):
self.velocity += gravity
self.y -= self.velocity
def render(self, window):
pygame.draw.rect(window,(0,0,0),(self.x,self.y,self.width,self.height))
我正在按照一个教程系列进行工作,并且老师已经输入了确切的代码。我正尝试使用此代码进行反向工程,以了解有关如何制作平台游戏的更多信息,但无法使此代码正常工作。
错误在以下代码中:
def update(self, gravity):
self.velocity += gravity
self.y -= self.velocity
1楼
正如@JGreenwel和@rmunn所提到的那样 ,问题是您在主程序循环中两次 调用了player
对象的.render .render()
方法 ,但同时将 两个不同的对象 ( gravity
和window
) 传递给了它 :
while gameLoop:
for event in pygame.event.get():
# ... some code ...
player.update(gravity) #1. call
player.update(window) #2. call
clock.tick(60)
pygame.display.flip()
结果是TypeError
,因为pygame.surface
.render()
方法需要数字而不是pygame.surface
实例才能正常工作 。
要解决此问题,您需要将第二个方法调用更改为 player.
render
(window)
:
while gameLoop:
for event in pygame.event.get():
# ... some code ...
player.update(gravity) #1. update some attributes
player.render(window) #2. blit player onto the screen
clock.tick(60)
pygame.display.flip()
现在,某些player
属性(例如self.velocity
或self.y
)通过第一个方法调用得到更新,而第二个属性(取决于tis属性)将对象绘制到屏幕上。