为什么我的 class 方法没有更新属性?

why is my class method not updating the attribute?

我正在尝试制作一个以恒定速度向下移动的精灵,使用 pygame 和随机。但不幸的是,精灵只是停留在一个地方。 问题是方法 itemMover()。它不会更新实例的属性值(debris1,在底部),所以每次,在 y 值增加速度值后,它会立即重置为原始值......这会导致精灵只是停滞不前。 我不知道为什么它不更新属性。

import pygame
import random

# variables
mainWindow = pygame.display.set_mode((800, 600))
posX = random.randint(0,800)
posY = 0
#speedXRight = 0.5
#speedXLeft = -0.5
# images

sprite = pygame.image.load("rockred.png")
xval = random.randint(50, 750)
ypos = 0
yspeed = 0.5

class item:
    def __init__(self, xpos, ypos, yspeed):
        self.xpos = xpos
        self.ypos = ypos
        self.yspeed = yspeed

    # below method not working as intended

    def itemMover(self, win, val):
        ############HELP HERE
        print(self.ypos)
        self.ypos += self.yspeed
        ############HELP HERE
        print(self.xpos, self.ypos)
        win.blit(val, (self.xpos, self.ypos))
mainLoop = True
while mainLoop:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            mainLoop = False
            #keycode.Main = False
    debris1 = item(xval, 0, 0.5)
    debris1.itemMover(mainWindow, sprite)
    pygame.display.update()

输出:

0
167 0.5
0
167 0.5
0
167 0.5
0
167 0.5
0
167 0.5
0
167 0.5
0
167 0.5
0
167 0.5

还有一个 window 的 sprite 保持静止。

方法itemMover 可以工作,但是您在循环中不断地重新创建对象debris1。因此,对象从每一帧的开头开始。 在应用程序循环之前创建对象并在循环中移动对象。
此外,在绘制对象之前,您必须通过 pygame.Surface.fill() 清除显示:

debris1 = item(xval, 0, 0.5)

mainLoop = True
while mainLoop:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            mainLoop = False

    mainWindow.fill(0)
    debris1.itemMover(mainWindow, sprite)
    pygame.display.update()

原因是每次循环时,您都会重新创建对象 debrise1 并设置 ypos=0 和 yspeed=0.5,因此当您执行方法 itemMover() 时,它总是会显示相同的更改,即您所拥有的要做的是在循环外创建对象,循环内应该只有 itemMover() 方法,如下所示:

mainLoop = True
debris1 = item(xval, 0, 0.5)

while mainLoop:
for event in pygame.event.get():
    if event.type == pygame.QUIT:
        mainLoop = False
        #keycode.Main = False
debris1.itemMover(mainWindow, sprite)
pygame.display.update()