2016-07-02 4 views
0

У меня есть класс, который мяч отскакивает, когда она попадет в пределы экранаPygame Ellipse изменение цвета наехать

Я Покушение программирования 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) 

С помощью этого кода я пытался следовать советам мне дает мне TypeError: draw.ellipse (self.display, self.current_color, self.rect) TypeError: Цвет недопустимого аргумент

# 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

Спасибо! Я уже понял проблему и добился реализации всего хорошего! –

Смежные вопросы