当前位置: 代码迷 >> python >> + ='float'和'pygame.surface'不支持的操作数类型
  详细解决方案

+ ='float'和'pygame.surface'不支持的操作数类型

热度:57   发布时间:2023-06-13 14:05:44.0

这是主要代码

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

正如@JGreenwel@rmunn所提到的那样 ,问题是在主程序循环中两次 调用player对象的.render .render()方法 ,但同时将 两个不同的对象gravitywindow传递给了它

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.velocityself.y )通过第一个方法调用得到更新,而第二个属性(取决于tis属性)将对象绘制到屏幕上。

  相关解决方案