2014-11-21 11 views
1

나는 lib가 어떻게 작동 하는지를 배우기 위해 pymunk와 pong clone을 만들고있다. 공이 벽에서 튀어 오르게되지만, 패들은 화면의 각면에 하나씩 세그먼트로 정의 된 사각형 안에 머물기를 여전히 거부합니다. K_UP 또는 K_DOWN 키를 누를 경우pymunk - 운동을 제한하는 방법?

def handle_input(self): 
    keys = pygame.key.get_pressed() 
    if keys[K_UP]: return Vec2d(0, 200) 
    elif keys[K_DOWN]: return Vec2d(0, -200) 
    else: return Vec2d(0, 0) 

이 함수를 검출한다. 그렇다면 원하는 속도로 새 벡터를 반환하고이 벡터는 paddle.body.velocity에 할당됩니다. 문제는 패들이 화면의 상단이나 하단에 도달했을 때 좌표에서 멈추는 대신 각 키를 놓을 때까지 조금 더 위 (또는 아래로)갑니다. 방향. 세그먼트는 외륜에 일종의 저항을 제공하는 것처럼 보이지만 화면에서 절반 정도만 멈출 수 있습니다.

out

왜 이런 일이 무엇입니까? 주위의 세그먼트에 의해 설정된 경계 내에서만 움직 이도록 패들의 움직임을 어떻게 제한 할 수 있습니까?


소스 : game.py | paddle.py

+0

당신이 문제에 관련된 나머지 코드를 게시 할 수 :

다음은이 기술을 사용하여 최고에 도달 할 때까지의 속도가 모든 프레임을 설정받을 패들에 대한 기본적인 예는? 예 : 어디 키보드 처리기 등의 결과를 처리 세그먼트를 설정합니다. –

+0

아직하지 않은 경우,이 질문에 대한 링크를 chipmunk forum에 게시하는 것이 좋습니다. –

답변

1

각 프레임에서 직접 속도를 설정하는 것이 문제입니다. 그러면 충돌 해결사에 문제가 생기고 패들이 벽을 통과 할 수 있습니다. 대신에 충동을 적용하거나 다른 방법으로 운동을 제한하도록 변경하십시오.

나는 나는 그것의 움직임을 제한 할 GrooveJoint 사용이 breakout.py, pymunk의 예 폴더에서 비슷한 예를 :

player_body = pymunk.Body(500, pymunk.inf) 
player_shape = pymunk.Circle(player_body, 35) 
player_shape.color = THECOLORS["red"] 
player_shape.elasticity = 1.0 
player_body.position = 300,100 
# restrict movement of player to a straigt line 
move_joint = pymunk.GrooveJoint(space.static_body, player_body, (100,100), (500,100), (0,0)) 
space.add(player_body, player_shape, move_joint) 
여기

전체 코드 : 설정하는 것이 https://github.com/viblo/pymunk/blob/master/examples/breakout.py

주 속도마다 프레임마다 다른 부작용이있을 수 있지만 귀하의 경우에는 브레이크 아웃 예제와 마찬가지로 정상적으로 작동해야한다고 생각합니다.

+0

GrooveJoint를 추가했지만 작동하지 않았습니다. 패들은 조인트에 지정된 좌표보다 멀리 이동했습니다. 아니면 이것은 예상 된 행동입니까? – Jovito

+0

당신의 코드와 광산의 차이점은 처음부터 본 것이 아닙니다. 키를 누른 상태에서 속도를 설정하는 것입니다. 키를 누른 상태에서만 설정합니다. 그게 내 예제에서 더 효과가있는 이유. 다른 해결책에 대한 저의 다른 대답을보십시오. – viblo

0

하나의 해결 방법은 패들이 상단/하단 벽에 도달 할 때 약간의 탐지를 추가하고 히트하면 반대 방향으로 만 허용되는 속도를 제한하는 것입니다.

이렇게하면 벽과 외륜 사이에 충돌 처리기를 만들 수 있습니다. 그런 다음 begin 함수에서 paddle에 touching_top/touching_bottom 변수를 설정하고 별도로 변수를 false로 설정합니다.

import pymunk 

space = pymunk.Space() 

top = pymunk.Segment(space.static_body, (0,100), (100,100), 1) 
space.add(top) 
top.collision_type = 1 

b = pymunk.Body(100,1000) 
b.position = (50,50) 
paddle = pymunk.Poly.create_box(b, (5,20)) 
paddle.collision_type = 2 
space.add(b, paddle) 

touching_top = False 

def begin(space, arbiter, *args, **kwargs): 
    global touching_top 
    touching_top = True 
    print "begin" 
    return True 

def separate(space, arbiter, *args, **kwargs): 
    global touching_top 
    touching_top = False 
    print "separate" 

space.add_collision_handler(1, 2, begin=begin, separate=separate) 

for x in range(100): 
    print paddle.body.position 

    if not touching_top: 
     paddle.body.velocity = (0,100) 

    space.step(1/60.) 
+0

이것을 수행하는 방법에 대한 예를 들려 줄 수 있습니까? – Jovito

+0

예를 들어 답변을 업데이트했습니다. – viblo