2016-07-02 50 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

謝謝!我已經理解了這個問題並且實現了所有的好東西! –