2016-07-02 45 views
0

我有一个类,球弹,当它击中屏幕的限制pygame的椭圆变色碰撞

我当与极限碰撞,但这不变色,保持尝试编程ballchange我的颜色与color_default值并没有改变,我失踪了?

下面是代码:

from pygame.sprite import Sprite 
from pygame import Surface, draw, mouse 
from GeneralInformation import R, G, B 

class Ball(Sprite): 
    def __init__(self, display)#sorry for bad indent in this example 
     super(Ball, self).__init__() 
     self.elasticity = .8 
     self.radius = 30 
     self.friction = 1 
     self.image = Surface([self.radius*2, self.radius*2]) 
     self.rect = self.image.get_rect() 
     self.rect.x = 100 
     self.rect.y = 100 
     self.dx = 0 
     self.dy = 0 
     self.color_default = (R+130, G-40, B-60) 
     self.color_change1 = (R-20, G+20, B+50) 
     self.color_change2 = (R-40, G+70, B+100) 
     self.display = display 
     self.delta_time = 0 
     self.pos_x_aux = 0 
     self.pos_y_aux = 0 
     self.controlled = False 

    def calculate_gravity(self): 
     """Function for calcule the gravity""" 
     self.dy += .20 

    def impulse(self, dx, dy): 
     self.dx = dx 
     self.dy = dy 

    def update(self, dt): 
     self.calculate_gravity() 
     self.rect.x = self.rect.x + self.dx 
     self.rect.y = self.rect.y + self.dy 

     self.delta_time = self.delta_time + dt 

     if self.controlled: 
      self.rect.x = mouse.get_pos()[0] - self.radius 
      self.rect.y = mouse.get_pos()[1] - self.radius 

      if self.delta_time > 50: 

       self.pos_x_aux = mouse.get_pos()[0] 
       self.pos_y_aux = mouse.get_pos()[1] 
       self.delta_time = 0 

     if not self.controlled and self.pos_x_aux != 0 and self.pos_y_aux != 0: 
      self.dx = mouse.get_pos()[0] - self.pos_x_aux 
      self.dy = mouse.get_pos()[1] - self.pos_y_aux 

      self.pos_y_aux = 0 
      self.pos_x_aux = 0 

     self.check_collisions() 
     self.draw() 

    def check_collisions(self): 
     if self.rect.y + self.radius*2 > self.display.get_size()[1]: 
      self.rect.y = self.display.get_size()[1]-self.radius*2 
      self.impulse(self.dx, -self.dy*self.elasticity) 



     if self.rect.x + self.radius * 2 > self.display.get_size()[0]: 
      self.rect.x = self.display.get_size()[0] - self.radius * 2 
      self.impulse(-self.dx*self.elasticity, self.dy) 


     if self.rect.x < 0: 
      self.rect.x = 0 
      self.impulse(-self.dx*self.elasticity, self.dy) 


     if self.rect.y < 0: 
      self.rect.y = 0 
      self.impulse(-self.dy*self.elasticity, self.dx) 

    def draw(self): 
     draw.ellipse(self.display, self.color_default, self.rect) 

     if self.rect.y + self.radius * 2 > self.display.get_size()[1]: 
      draw.ellipse(self.display, self.color_change1, self.rect) 

     if self.rect.x + self.radius * 2 > self.display.get_size()[0]: 
      draw.ellipse(self.display, self.color_change2, self.rect) 

     if self.rect.x < 0: 
      draw.ellipse(self.display, self.color_change1, self.rect) 

     if self.rect.y < 0: 
      draw.ellipse(self.display, self.color_change2, self.rect) 

有了这个代码,我试图按照给我的建议给了我类型错误: draw.ellipse(self.display,self.current_color,self.rect) 类型错误:颜色无效参数

# coding=utf-8 

from pygame.sprite import Sprite 
from pygame import Surface, draw, mouse 
from GeneralInformation import R, G, B 

class Ball(Sprite): 
    def __init__(self, display): 
     super(Ball, self).__init__() 
     self.elasticity = .8 
     self.radius = 30 
     self.friction = 1 
     self.image = Surface([self.radius*2, self.radius*2]) 
     self.rect = self.image.get_rect() 
     self.rect.x = 100 
     self.rect.y = 100 
     self.current_color = [] 
     self.dx = 0 
     self.dy = 0 
     self.color_default = [R+130, G-40, B-60] 
     self.color_change1 = [R-20, G+20, B+50] 
     self.color_change2 = [R-40, G+70, B+100] 
     self.display = display 
     self.delta_time = 0 
     self.pos_x_aux = 0 
     self.pos_y_aux = 0 
     self.controlled = False 

def calculate_gravity(self): 
    """Function for calcule the gravity""" 
    self.dy += .20 

def impulse(self, dx, dy): 
    self.dx = dx 
    self.dy = dy 

def update(self, dt): 
    self.calculate_gravity() 
    self.rect.x = self.rect.x + self.dx 
    self.rect.y = self.rect.y + self.dy 

    self.delta_time = self.delta_time + dt 

    if self.controlled: 
     self.rect.x = mouse.get_pos()[0] - self.radius 
     self.rect.y = mouse.get_pos()[1] - self.radius 

     if self.delta_time > 50: 

      self.pos_x_aux = mouse.get_pos()[0] 
      self.pos_y_aux = mouse.get_pos()[1] 
      self.delta_time = 0 

    if not self.controlled and self.pos_x_aux != 0 and self.pos_y_aux != 0: 
     self.dx = mouse.get_pos()[0] - self.pos_x_aux 
     self.dy = mouse.get_pos()[1] - self.pos_y_aux 

     self.pos_y_aux = 0 
     self.pos_x_aux = 0 

    self.check_collisions() 
    self.draw() 

def check_collisions(self): 
    if self.rect.y + self.radius*2 > self.display.get_size()[1]: 
     self.rect.y = self.display.get_size()[1]-self.radius*2 
     self.impulse(self.dx, -self.dy*self.elasticity) 
     self.current_color.append(self.color_change1) 

    if self.rect.x + self.radius * 2 > self.display.get_size()[0]: 
     self.rect.x = self.display.get_size()[0] - self.radius * 2 
     self.impulse(-self.dx*self.elasticity, self.dy) 
     self.current_color.append(self.color_change2) 

    if self.rect.x < 0: 
     self.rect.x = 0 
     self.impulse(-self.dx*self.elasticity, self.dy) 
     self.current_color.append(self.color_change1) 

    if self.rect.y < 0: 
     self.rect.y = 0 
     self.impulse(-self.dy*self.elasticity, self.dx) 
     self.current_color.append(self.color_change2) 

def draw(self): 
    """Draw""" 
    draw.ellipse(self.display, self.color_default, self.rect) 
    if not self.check_collisions(): 
     draw.ellipse(self.display, self.current_color, self.rect) 

    """"if self.rect.y + self.radius * 2 > self.display.get_size()[1]: 
     draw.ellipse(self.display, self.color_change1, self.rect) 

    if self.rect.x + self.radius * 2 > self.display.get_size()[0]: 
     draw.ellipse(self.display, self.color_change2, self.rect) 

    if self.rect.x < 0: 
     draw.ellipse(self.display, self.color_change1, self.rect) 

    if self.rect.y < 0: 
     draw.ellipse(self.display, self.color_change2, self.rect)""" 
+0

有一个缩进问题 - 请参阅编辑。当你调用draw.eclipse并且所有的类方法都被正确缩进时,它是否仍然会产生问题? – dmitryro

+0

在我的PyCharm中,所有的缩进都很好,但是我遇到了Stackoverflow中的缩进问题,程序运行了,但是当对象发生碰撞时不会改变颜色,显示Main.py的代码会是一个好主意吗? –

+0

给予类定义4中更多缩进。问题在于你最初是以元组的形式创建你的颜色,并且元组在python中是不可变的,所以使用不同的数据结构来设置颜色。 – dmitryro

回答

1

.draw()功能仅绘制球用不同的颜色,而它的显示,这是从来没有的范围之外。你想要的是在.check_collisions()之内,如果检测到碰撞,请在self上设置属性,确定使用哪种颜色。

然后,在.draw(),而不是draw.ellipse(self.display, self.color_default, self.rect),你会有draw.ellipse(self.display, self.current_colour, self.rect),或类似的东西。

+0

嗯,朋友,我不太了解这个问题。我想我做了他们告诉我的,但它给出了一个错误“TypeError:Color invalid argument” –

+0

您正在追加颜色变化而不是切换它。 'colour_default','colour_change1'和'colour_change2'中的值是静态的;你只设置一次,并且永远不要改变它们。您不需要对数据进行任何变化,只需更改'current_colour'指定的三种定义颜色中的哪一种。 –

+0

谢谢!我已经理解了这个问题并且实现了所有的好东西! –