2009-02-26 22 views
2

Ben çarpışma tespiti sınamak için nispeten basit bir program yapıyorum, şu anda bir şey hariç, her şey iyi çalışıyor, ben arka plan rengi rasgele değiştirmek yapmak çalışıyorum, tek sorun Bunu yapmak için işlevi tamamen atlama gibi görünüyor; pygame işlevi göz ardı ediliyor gibi görünüyor

import pygame 
from pygame.locals import * 
import random, math, time, sys 
pygame.init() 

Surface = pygame.display.set_mode((800,600)) 

backgroundr = int(random.random()*255)+1 
backgroundg = int(random.random()*255)+1 
backgroundb = int(random.random()*255)+1 

Circles = [] 
class Circle: 
    def __init__(self): 
     self.radius = int(random.random()*50) + 1 
     self.x = random.randint(self.radius, 800-self.radius) 
     self.y = random.randint(self.radius, 600-self.radius) 
     self.speedx = 0.5*(random.random()+1.0) 
     self.speedy = 0.5*(random.random()+1.0) 
     self.r = int(random.random()*255)+1 
     self.g = int(random.random()*255)+1 
     self.b = int(random.random()*255)+1 
##  self.mass = math.sqrt(self.radius) 

for x in range(int(random.random()*30) + 1): 
    Circles.append(Circle()) 

def CircleCollide(C1,C2): 
    C1Speed = math.sqrt((C1.speedx**2)+(C1.speedy**2)) 
    XDiff = -(C1.x-C2.x) 
    YDiff = -(C1.y-C2.y) 
    if XDiff > 0: 
     if YDiff > 0: 
      Angle = math.degrees(math.atan(YDiff/XDiff)) 
      XSpeed = -C1Speed*math.cos(math.radians(Angle)) 
      YSpeed = -C1Speed*math.sin(math.radians(Angle)) 
     elif YDiff < 0: 
      Angle = math.degrees(math.atan(YDiff/XDiff)) 
      XSpeed = -C1Speed*math.cos(math.radians(Angle)) 
      YSpeed = -C1Speed*math.sin(math.radians(Angle)) 
    elif XDiff < 0: 
     if YDiff > 0: 
      Angle = 180 + math.degrees(math.atan(YDiff/XDiff)) 
      XSpeed = -C1Speed*math.cos(math.radians(Angle)) 
      YSpeed = -C1Speed*math.sin(math.radians(Angle)) 
     elif YDiff < 0: 
      Angle = -180 + math.degrees(math.atan(YDiff/XDiff)) 
      XSpeed = -C1Speed*math.cos(math.radians(Angle)) 
      YSpeed = -C1Speed*math.sin(math.radians(Angle)) 
    elif XDiff == 0: 
     if YDiff > 0: 
      Angle = -90 
     else: 
      Angle = 90 
     XSpeed = C1Speed*math.cos(math.radians(Angle)) 
     YSpeed = C1Speed*math.sin(math.radians(Angle)) 
    elif YDiff == 0: 
     if XDiff < 0: 
      Angle = 0 
     else: 
      Angle = 180 
     XSpeed = C1Speed*math.cos(math.radians(Angle)) 
     YSpeed = C1Speed*math.sin(math.radians(Angle)) 
    C1.speedx = XSpeed 
    C1.speedy = YSpeed 
    C1.r = int(random.random()*255)+1 
    C1.g = int(random.random()*255)+1 
    C1.b = int(random.random()*255)+1 
    C2.r = int(random.random()*255)+1 
    C2.g = int(random.random()*255)+1 
    C2.b = int(random.random()*255)+1 

def ColourCheck(): 
    checknumber = int(random.random()*50)+1 
    if checknumber == 50: 
     backgroundr = int(random.random()*255)+1 
     backgroundg = int(random.random()*255)+1 
     backgroundb = int(random.random()*255)+1 

def Move(): 
    for Circle in Circles: 
     Circle.x += Circle.speedx 
     Circle.y += Circle.speedy 
def CollisionDetect(): 
    for Circle in Circles: 
     if Circle.x < Circle.radius or Circle.x > 800-Circle.radius: 
      Circle.speedx *= -1 
      Circle.r = int(random.random()*255)+1 
      Circle.g = int(random.random()*255)+1 
      Circle.b = int(random.random()*255)+1 
     if Circle.y < Circle.radius or Circle.y > 600-Circle.radius: 
      Circle.speedy *= -1 
      Circle.r = int(random.random()*255)+1 
      Circle.g = int(random.random()*255)+1 
      Circle.b = int(random.random()*255)+1 
    for Circle in Circles: 
     for Circle2 in Circles: 
      if Circle != Circle2: 
       if math.sqrt( ((Circle.x-Circle2.x)**2) + ((Circle.y-Circle2.y)**2) ) <= (Circle.radius+Circle2.radius): 
        CircleCollide(Circle,Circle2) 
def Draw(): 
    Surface.fill((backgroundr,backgroundg,backgroundb)) 
    for Circle in Circles: 
     pygame.draw.circle(Surface,(Circle.r,Circle.g,Circle.b),(int(Circle.x),int(600-Circle.y)),Circle.radius) 
    pygame.display.flip() 

def GetInput(): 
    keystate = pygame.key.get_pressed() 
    for event in pygame.event.get(): 
     if event.type == QUIT or keystate[K_ESCAPE]: 
      pygame.quit(); sys.exit() 

def main(): 
    while True: 
     ColourCheck() 
     GetInput() 
     Move() 
     CollisionDetect() 
     Draw() 
if __name__ == '__main__': main() 

göz ardı ediliyor ColourCheck fonksiyondur

, herhangi bir fikir neden?

cevap

6

Backgroundr, backgroundg ve backgroundb'nin ColourCheck() işlevinizin yerel değişkenleri olduğuna inanıyorum. Eğer küresel değişkenler kullanmak kararlı iseniz

dosyanızın üstündeki bu deneyin:

global backgroundr; 
global backgroundg; 
global backgroundb; 
backgroundr = int(random.random()*255)+1 
backgroundg = int(random.random()*255)+1 
backgroundb = int(random.random()*255)+1 

ve bu işlevi:

def ColourCheck(): 
    global backgroundr; 
    global backgroundg; 
    global backgroundb; 
    checknumber = int(random.random()*50)+1 
    if checknumber == 50: 
     backgroundr = int(random.random()*255)+1 
     backgroundg = int(random.random()*255)+1 
     backgroundb = int(random.random()*255)+1 
+0

Oh, ve işleri yeniden işlemek daha akıllıca olurdu, bu yüzden bunlar sadece global değişkenler değildi. :-) – Nathan

+0

harika teşekkürler: D, şimdi sadece 50'de 1'den yükseltmek ve biraz daha yumuşak bir geçiş yapmak gerekiyor :) – user33061

+0

Aslında fonksiyonların dışında global olarak üç değişkeni bildirmeniz gerekmiyor. – Dana

0

Move() , CollisionDetect() ve Draw() bütün Circles'a bakın, ancak global olarak beyan etmeyin. Her işlevin başına global Circles satır eklemeyi deneyin. Ayrıca, değişkenlerinizi küçük harfe dönüştürmenizi öneririm; sadece bir başlangıç ​​başlığı Python'da bir sınıfı gösterir, ancak aslında Circle değişkeni ile Circle sınıfı arasındaki çarpışmaları üretiyorsunuz (önemsiz). Örneğin

:

circles = [] 

# ... 

for x in range(int(random.random()*30) + 1): 
    circles.append(Circle()) 

# ... 

def Move(): 
    global circles 

    for circle in circles: 
     circle.x += circle.speedx 
     circle.y += circle.speedy 

# ... 

Düzenleme:

Nathan notları gibi sizin backgroundX değişkenler de ColorCheck() ve Draw() küresel ilan edilmesi gerekir.

Tüm bu işlevleri, çok sayıda globals ile çalışmamak için Game sınıfına (veya bazılarına) sarmayı düşünebilirsiniz.

İlgili konular