почему мой метод класса не обновляет атрибут? - PullRequest
1 голос
/ 05 мая 2020

Я пытаюсь создать спрайт, который движется вниз с постоянной скоростью, используя pygame и random. Но, к сожалению, спрайт просто остается на одном месте. Проблема заключается в методе 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

также окно со спрайтом, который остается неподвижным.

Ответы [ 2 ]

1 голос
/ 05 мая 2020

метод itemMover будет работать, но вы постоянно воссоздаете объект debris1 в l oop. Следовательно, объект начинается с начала в каждом кадре. Создайте объект перед приложением l oop и переместите объект в l oop.
Более того, вы должны очистить отображение на 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()
0 голосов
/ 05 мая 2020

Причина в том, что каждый раз на l oop вы повторно создаете объект debrise1 с ypos = 0 и yspeed = 0.5, поэтому, когда вы выполняете метод itemMover (), он всегда будет отображать те же изменения, что и вы необходимо создать объект из l oop, а то, что должно быть внутри l oop, - это только метод 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...