为什么我的 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()
我正在尝试制作一个以恒定速度向下移动的精灵,使用 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()