2012-07-06 8 views
2

이 코드는 이미지 assassin1.png을 검은 색 화면에 표시합니다. 이 이미지에는 pymunk body와 shape이 연관되어 있습니다. 그 아래에는 floor이라는 보이지 않는 정적 pymunk 객체가 있습니다. 중력은 이미지에 유도되며 보이지 않는 바닥에 놓여 있습니다.pyglet 및 pymunk로 스프라이트 문자를 자연스럽게 점프

나는 내가 UP 키를 누를 때 내 이미지가 자연스럽게 이동하고 싶습니다

. 어떻게 구현할 수 있습니까?

import pyglet 
import pymunk 

def assassin_space(space): 
    mass = 91 
    radius = 14 
    inertia = pymunk.moment_for_circle(mass, 0, radius) 
    body = pymunk.Body(mass, inertia) 
    body.position = 50, 80 
    shape = pymunk.Circle(body, radius) 
    space.add(body, shape) 
    return shape 

def add_static_line(space): 
    body = pymunk.Body() 
    body.position = (0,0) 
    floor = pymunk.Segment(body, (0, 20), (300, 20), 0) 
    space.add_static(floor) 
    return floor 

class Assassin(pyglet.sprite.Sprite): 
    def __init__(self, batch, img, space): 
     self.space = space 
     pyglet.sprite.Sprite.__init__(self, img, self.space.body.position.x, self.space.body.position.y) 

    def update(self): 
     self.x = self.space.body.position.x 
     self.y = self.space.body.position.y 

class Game(pyglet.window.Window): 
    def __init__(self): 
     pyglet.window.Window.__init__(self, width = 315, height = 220) 
     self.batch_draw = pyglet.graphics.Batch() 
     self.player1 = Assassin(batch = self.batch_draw, img = pyglet.image.load("assassin1.png"), space = assassin_space(space)) 
     pyglet.clock.schedule(self.update) 
     add_static_line(space) 

    def on_draw(self): 
     self.clear() 
     self.batch_draw.draw() 
     self.player1.draw() 
     space.step(1/50.0) 

    def on_key_press(self, symbol, modifiers): 
     if symbol == pyglet.window.key.UP: 
      print "The 'UP' key was pressed" 

    def update(self, dt): 
     self.player1.update() 
     space.step(dt) 

if __name__ == "__main__": 
    space = pymunk.Space() # 
    space.gravity = (0.0, -900.) # 
    window = Game() 
    pyglet.app.run() 

답변

3

신체에 충격을 가할 필요가 있습니다. 임펄스는 질량의 속도 인 운동량의 변화입니다. 나는 당신이 당신의 아사민이 똑바로 뛰어 오르는 것을 원한다고 생각합니다. 그렇다면 충동을 신체의 중심에 적용해야합니다. PyMunk 같은 물리 라이브러리를 사용하여 플랫 포머를 작성

body.apply_impulse(pymunk.Vec2d(0, 60), (0, 0)) 
+0

당신은 똑바로 뛰어 오르거나 비스듬히 뛰어 오르고 싶을 때 항상 * 충동을 몸의 중앙에가하십시오. 센터가 아닌 다른 곳에 적용하는 유일한 방법은 시체를 회전시키고 점프하기를 원할 때입니다. –

3

정말 어렵습니다. 나는 강력하게 반대하고, 대신 자신의 코드에서 점프하는 것처럼 물리학을 관리하는 것이 좋습니다.

문제는 pymunk와 같은 현실적인 물리학이 실제로 원하지 않는 많은 부작용이 있다는 것입니다. 예를 들어, 캐릭터가 옆으로 움직이는 경우, 마찰에 의한 마루가 바닥에 닿아 서 움직일 수 없기 때문에 회전하거나 넘어지는 경향이 있습니다. 이를 막을 수있는 방법을 찾을 수는 있지만, 다른 부작용이 생길 수 있습니다. 예를 들어, 캐릭터를 큰 평면 하단 가장자리가있는 웅크리는 모양으로 만들면 충돌 감지에도 영향을 미칩니다. 마루와의 마찰을 줄이면 시간이 지남에 따라 천천히 움직이지 않는다는 것을 의미합니다. 이러한 문제를 해결하기 위해 더 많은 세부 조정을 추가 할 수 있지만 더 많은 부작용이있을 수 있습니다. 여기에 나와있는 예제는 빙산의 일각에 불과합니다. 큰 문제를 유발할 더 많은 복잡한 효과가 있습니다.

대신 캐릭터의 속도를 나타내는 변수를 가지고 각 프레임의 위치에 추가하는 것이 훨씬 간단합니다. 그들이 플랫폼과 같은 것을 치 었는지 탐지하고, 그렇다면 플랫폼으로 이동하지 않도록 수평 또는 수직 속도를 설정하십시오. 이것은 또한 약간의 미묘한 문제가 있지만, 일반적으로 물리 시뮬레이션보다 수정하기가 훨씬 쉽습니다.