2009-02-26 4 views
2

나는 충돌 감지를 테스트하는 비교적 간단한 프로그램을 만들고 있습니다. 한 가지를 제외하고는 모두 정상적으로 작동합니다. 배경색을 무작위로 변경하려고합니다. 유일한 문제는 다음과 같습니다. 이것을 수행하는 기능을 완전히 건너 뛰고있는 것처럼 보입니다.파이 게임 기능이 무시되고있는 것처럼 보입니다.

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() 

이 기능은 무시되고 있습니다. 그 이유는 무엇입니까?

답변

6

backgroundr, backgroundg 및 backgroundb는 ColourCheck() 함수의 로컬 변수라고 생각합니다. 전역 변수를 사용하기로 결정하는 경우

는 파일의 상단에 이것을 시도 :

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

이 함수에서 :

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

아, 그리고 이것들이 글로벌 변수가 아니기 때문에 재 작업하는 것이 현명합니다. :-) – Nathan

+0

D : 이제는 50에서 1로 올리고 조금 더 부드럽게 전환해야합니다. – user33061

+0

실제로 함수 밖에서 세 변수를 전역 적으로 선언 할 필요는 없습니다. – Dana

0

Move() , CollisionDetect()Draw() 모든 Circles을 참조하고 전역으로 선언하지 마십시오. 각 기능의 시작 부분에 global Circles 줄을 추가하십시오. 또한 변수를 소문자로 변경하는 것이 좋습니다. 초기 뚜껑은 일반적으로 파이썬에서 클래스를 나타낼뿐만 아니라 실제적으로 Circle 변수와 Circle 클래스 사이의 충돌을 발생시킵니다. 예를 들어

:

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 

# ... 

편집 :

나단 노트로, 당신의 backgroundX 변수는 ColorCheck()Draw() 글로벌 선언 할 필요가.

너무 많은 전역과의 작업을 피하기 위해 모든 함수를 Game 클래스 (또는 일부)로 래핑하는 것이 좋습니다.

관련 문제