2012-07-31 3 views
1

저는이 핀볼 게임 프로그램을 수업에 배정 해주었습니다. 핀볼의 움직임과 충돌을 고치려고 노력했습니다.핀볼의 이동 방향을 수정하여 충돌시키는 법

첫 번째 문제는 사용자가 속도로 설정 한 방향에 관계없이 공이 특정 각도에서만 움직이는 것입니다.

내 메모, 강의 슬라이드 및 토론 자료에 따르면 왜 작동하지 않아야하는지 전혀 알지 못합니다. 괜찮을 것입니다. 왜 아무도 그것이 작동하지 않는 이유를 알고 있습니까? 나는 주변을 둘러 보았고 확실한 답을 찾을 수 없었다. 어떤 도움을 주시면 감사하겠습니다. 나는 뒤죽박죽이다. (

작동하지 않는다는 것은 사용자가 핀볼을 어느 방향으로 가도 상관없이 한 방향으로 만 움직인다는 것을 의미한다 (예 : 사용자가 핀볼을 왼쪽으로 설정하고, 핀볼이 오른쪽으로 가고, 사용자 집합 여기

http://mcsp.wartburg.edu/zelle/python/graphics/graphics/index.html가 충돌 코드 : 핀볼는 벽이나 대상의 충돌되지 않으며, 또한) 등 을

그래픽 graphics.py이며, 핀볼은 바로 간다, 최대 이동합니다. (속도 반전과 함께 게임 보드의 오른쪽 벽에만 계속 충돌 함) :

def checkHit(ball,target,dispX,dispY,VelX,VelY,hit): ###pulled the definition out of the loop but keeping it here for easier reference 
    center = ball.getCenter() ###defines the center of the pinball as a point 
    hit = 0 ###used for differentiating between objects collided with 
    if center.getX() + 1 <= 45 and center.getX() + 1 + dispX > 45: ####if the pinball collides with the right wall of the board 
     VelX = VelX *(-1) ###velocity in the x direction reverses 
     hit = 0 ###did not collide with a target 

for j in range(1000):####1000 frames (ball isn't expected to last long in the air, only a couple seconds) 
    vy = vy - 9.8 ###effect of gravity 
    dx = vx/math.sqrt(vx**2 + vy**2) ###speed in x direction over time 
    dy = vy/math.sqrt(vx**2 + vy**2) ###speed in y direction over time 
    checkHit(pinball,target_front1,dx,dy,vx,vy,0) ####runs function each frame for collision testing 
    pinball.move(dx , dy) ###moves pinball 
+1

문제의 문맥에서 "작동하지 않습니다"를 정의하십시오. –

+1

"강의 노트"에 대해 언급하셨습니다. 이 숙제가 있니? 그렇다면 태그를 붙이십시오. – mgilson

+0

일반적으로 전체 코드를 게시하는 것을 피하십시오 (특히 필요한 모듈 인'graphics'에 액세스 할 수없는 경우). 가능한 한 작은 코드 블록으로 수정하십시오. 우리가 당신을 도울 수있게 도와 주며, 당신 스스로 문제를 이해하게합니다. – TankorSmash

답변

1

어디서 graphics 모듈을 가져 왔는지 알려주지 않았으므로 확실히 말할 수 없습니다. 가장 가능성이 큰 학교.

if 문 중 일부를 elif으로 변경해보십시오. 아마도 당신은 동시에 너무 많은 것을 평가할 것입니다. 당신은 단지 다음 if 문 ONE을 실행하려면 다음 코드를 고려하지만, 현실에서, 그들 모두이 실행 중입니다 : 다음

def foo(x): 
if x < 5: 
    print 'x is greater than five' 
if x == 10: 
    print 'x is 10' 

foo(10) 

>>> x is greater than 5 
>>> x is 10 

당신이 elif에 두 번째 if를 변경하는 경우, 첫 번째 if 문이 실행되면, elif의 나머지는 무시됩니다 : 당신은 또한 모든 루프를 checkHit 정의

def bar(x): 
if x < 5: 
    print 'x is greater than five' 
elif x == 10: #changed this line to an 'elif' 
    print 'x is 10' 

bar(10) 

>>> x is greater than 5 #only prints once, because the first if statement is True 

, 시스템 자원을 낭비. 루프에서 빠져 나와 모듈의 최상위 부분으로 가져 오는 것이 좋습니다.


편집 : 실제로 위의 예는 사실은 좋지 않습니다. x의 속도가 5 이상인 경우 공이 굴러 가지 않는다고 상상해보십시오. 따라서 x0으로 변경하십시오. 그런 다음 두 번째 if 문을 사용하여 즉시 확인하고 중지되었는지 확인합니다. 멈춘 경우 다시 이동을 시작하십시오 (x == 5 또는 무언가). 이것은 if 문장의 말에 상관없이 항상 공이 다시 움직이기 때문에 공이 움직이지 않는 것을 의미합니다. 이전 if 문이 True이되지 않는 elif 평가되지 않기 때문에

은 그래서 당신이해야 할 것입니다 것은, 두 번째 if 대신 elif 문을 사용합니다.

+0

흠, 여러 "if"를 "elif"로 변경하려고했지만 문제를 해결하지 못했습니다 =/ – OD97

+0

Go 전체 코드를 통해 최소한 3 번째 줄마다 주석을 달고 자신이하는 일을 이해하고 있음을 보여줍니다. 지루할 것 같지만, 당신이 뭘 잘못하고 있는지 알아낼 수 있습니다. 버그를 재현 할 필요가없는 코드 부분을 제거하려고 한 것처럼 보이지 않습니다. 오류를 재현하는 데 단지 4 분의 1이 소요될 때 ~ 200 줄의 코드를 제공했습니다. – TankorSmash

+0

일부 중복 된 코드를 제거하여 도움이 되었으면 좋겠습니다. 죄송합니다. 나는 볼이 어떤 것과도 충돌하지 않기 때문에 오른쪽 벽과 충돌을 유지하기로 결정했습니다. – OD97

관련 문제