2016-12-02 51 views
0

我第一次玩pygame,试图让多个矩形在屏幕上移动。这里是我的代码:Python变量在每个对象中都有变化

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]。

这是什么原因造成的?我该如何解决?

+0

我不知道为什么你有'speed'类变量,但我会建议你摆脱它。您还需要在每种方法中调整它... – 2016-12-02 07:16:46

+0

速度是一个类属性,可变值在所有实例之间共享。你必须在每个实例'__init__'方法中创建单独的列表。 –

回答

1

将速度,colourSpeed,colourID,颜色,大小移至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 
+0

谢谢,那工作。当我将速度改变为绝对值时,它是如何工作的? (rect1.speed = [2,2]) –

+0

@SJ_WTF我想现在就看看你的代码,因为这个解决方案真的没有什么变化 – 2016-12-02 07:28:05

+0

@LPK是在这个答案代码块出现在我面前的答案。你应该在init –