Python变量在每个obj中都会改变

2024-10-01 13:43:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我第一次玩pygame,试图让多个矩形在屏幕上移动。这是我的密码:

import pygame

pygame.init()

scrWidth = 1200
scrHeigth = 900
done = False
rectangles = []

screen = pygame.display.set_mode((scrWidth, scrHeigth))
clock = pygame.time.Clock()

class Rectangle:
    speed = [1,1]
    colourSpeed = 300
    colourID = 0
    colour = (0, 0, 255)
    size = 60

    def __init__(self, name = "", x=0, y=0, speed=False, colour=False, size=False):
        self.name = name
        self.x = x
        self.y = y
        self.doesSpeed = speed
        self.doesColour = colour
        self.doesSize = size

    def draw(self):
        pygame.draw.rect(screen, self.colour, pygame.Rect(self.x, self.y, self.size, self.size))

    def checkCollision(self):
        if self.x < 0 or self.x > scrWidth-self.size:
            self.speed[0] = -self.speed[0]
        if self.y < 0 or self.y > scrHeigth-self.size:
            self.speed[1] = -self.speed[1]

    def move(self):
        self.x += self.speed[0]
        self.y += self.speed[1]

    def changeColour(self):
        self.colourID = (self.colourID+1)%self.colourSpeed
        if 0 <= self.colourID < (self.colourSpeed/3):
            self.colour = (0, 0, 255)
        elif (self.colourSpeed/3) <= self.colourID < (2*self.colourSpeed/3):
            self.colour = (0, 255, 0)
        elif (2*self.colourSpeed/3) <= self.colourID < self.colourSpeed:
            self.colour = (255, 0, 0)




rect1 = Rectangle("rect1", 30, 30, False, True, False)
rectangles.append(rect1)
rect2 = Rectangle("rect2", 300, 300)
rectangles.append(rect2)


while not done:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            done=True

    screen.fill((0, 0, 0))
    for obj in rectangles:
        obj.checkCollision()
        if obj.doesColour: obj.changeColour()
        obj.move()
        obj.draw()

    pygame.display.flip()
    clock.tick(60)

问题是当一个矩形与屏幕边缘碰撞时,所有的矩形都会改变方向(速度)。但是如果我用不同的速度做矩形,这就不会发生。你知道吗

例如:rect1有速度[1,1],rect2有速度[2,2]。你知道吗

是什么原因造成的?我该怎么解决?你知道吗


Tags: selffalseobjsizeifdefpygamespeed
1条回答
网友
1楼 · 发布于 2024-10-01 13:43:24

将speed、colorSpeed、colorId、colour、size移到init方法。你知道吗

此时,字段被定义为类字段,因此所有矩形的字段都被全局更改。你知道吗

解决方案

def __init__(self, name = "", x=0, y=0, speed=False, colour=False, size=False):
        self.name = name
        self.x = x
        self.y = y
        self.doesSpeed = speed
        self.doesColour = colour
        self.doesSize = size
        # here it comes
        self.speed = [1,1]
        self.colourSpeed = 300
        self.colourID = 0
        self.colour = (0, 0, 255)
        self.size = 60

相关问题 更多 >