我有一個類,球彈,當它擊中屏幕的限制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)"""
有一個縮進問題 - 請參閱編輯。當你調用draw.eclipse並且所有的類方法都被正確縮進時,它是否仍然會產生問題? – dmitryro
在我的PyCharm中,所有的縮進都很好,但是我遇到了Stackoverflow中的縮進問題,程序運行了,但是當對象發生碰撞時不會改變顏色,顯示Main.py的代碼會是一個好主意嗎? –
給予類定義4中更多縮進。問題在於你最初是以元組的形式創建你的顏色,並且元組在python中是不可變的,所以使用不同的數據結構來設置顏色。 – dmitryro