2014-10-25 1 views
1

약간 큰 프로그램의 관련 부분 인 것 같습니다. 본질적으로 충돌 감지 기능입니다. 거품은 원래 원 목록입니다. 충격에 따라 충돌 한 원이 사라 지길 바란다. 나는 "if collide =="조건부에 내 문제가 있음을 확신합니다.충돌시이 원이 왜 사라지지 않습니까?

def getDistance(point1,point2): 
    a= point1.getX() 
    b= point2.getX() 
    c= point1.getY() 
    d= point2.getY() 
    distance= math.sqrt((b-a)**2 + ((d-c)**2)) 
    return distance 

def balloonBubbleCollide(balloon,bubble): 
    point1 = balloon.getCenter() 
    point2= bubble.getCenter() 
    distance= getDistance(point1, point2) 
    if distance <= 30: 
     return True 

def check(balloon, bubbles, window): 
    for bubble in bubbles: 
     collide = balloonBubbleCollide(balloon, bubble) 
     if collide == True: 
      bubbles.remove(bubble) 

main이 올바른 순서로 실행한다고 가정합니다. 그냥 코드로 게시물을 늪지 싶지 않아요.

+0

반복하는 목록을 수정하지 마십시오. –

+0

코딩 스타일에 대한 간단한 설명 : True와 비교할 필요는 없으며 간단히'충돌 할 경우 : ... '라고 말하면됩니다. 당신은 또한 'getter'함수를 많이 사용하는 것처럼 보이지만 간단한 매개 변수에 속성을 사용하는 것은 더 파이썬 적이기 때문에 ('point.x','point.y','balloon.center' 등) 사용하십시오. 이러한 속성은 나중에 언제든지 속성으로 업그레이드 할 수 있습니다. –

+0

흥미로운 @BasSwinckels 나는 자습서에서 내가 보았던 것에 가까이 머물러 있었다. 나는 그것을 염두에 두겠다. – aero26

답변

1

반복하는 동안 remove을 사용하여 목록을 수정하면 안됩니다.

은 충돌 거품 대신 같은 것을 사용 필터링하려면

def check(balloon, bubbles, window): 
    bubbles[:] = [bubble for bubble in bubbles 
        if not baloonBubbleCollide(balloon, bubble)] 

(지능형리스트를 사용하여) 계속 다음의 현재 내용을 대체하는 거품 객체의 첫 번째 새 목록을 만들 것입니다 표시된 코드를 bubbles 목록과 함께 즉시.

+0

흠. 서클은 여전히 ​​사라지지 않는 것 같습니다. – aero26

+0

@ aero26 : 코드에 다른 문제가 있습니다. 해피 디버깅 ... – 6502

관련 문제