2012-12-19 2 views
0

간단한 게임 (cocos2d)에서 스프라이트를 움직여 작은 물리 엔진을 만들어 점프 및 플랫폼 요법에 서게 할 수 있습니다.게임 물리학 - 매우 실물과 같지 않음

위치 (상하 이동) I 각 업데이트 기본적인 운동학 방정식을 사용하여 갱신하려면 다음

  • 위치 = oldPosition + 속도 (델타) +1/2 (중력) (델타)^2
  • velocity = oldVelocity + (중력) (델타)

어떤 이유로 게임은 매우 실물처럼 보입니다. 중력을 만드는 것이 얼마나 큰지에도 불구하고 아크의 꼭대기 부근에서 오랜 시간이 걸리는 것으로 보입니다. 내 스프라이트가 같은 높이로 뛰기를 원하지만, 더 빨리 감속하고 가속하지만, 이전처럼 높게 뛰어 올랐 으면 어떻게해야합니까? 나는 그것이 의미가 있기를 바랍니다.

답변

1

문제는 당신이 당신의 물리학 실수를했다입니다! 그러나 그것은 쉬운 수정이기 때문에 괜찮습니다.

스프라이트의 위치에서 업데이트 방법을 호출 할 때 먼저 가속을 설정해야합니다. 중력은이 게임에서 상수라고 생각합니다. 그래서 한 번만 설정하면됩니다. (-9.81 등)

y 방향의 문자 속도를 velocity = old_velocity + acceleration * time으로 업데이트하려고합니다.

이렇게 한 다음 비슷한 방식으로 위치를 업데이트합니다. position = old_position + velocity * time.

위치를 업데이트하는 데 사용하는 방정식은 delta가 시간 경과가 아닌 총 경과 시간 인 경우에만 유효합니다! (저는 델타가 시간 단계라고 생각했습니다. 물리학 게임이 보통 프로그래밍되는 방식이기 때문입니다.)

이 도움이 되었기를 바랍니다. 더 많은 것을 알고 싶다면 수완 방정식을보고 싶을 것입니다. 처음 속도와 일정한 가속도를 안다면 최종 포지션을 계산할 수 있습니다. 점프와 충돌을 할 때마다 속도가 달라지며, 그래서 그것이 현실적이지 않다는 것을 놀라지 않습니다! 궁금한 점이 있으시면 의견을 보내 주시면 더욱 도움이 될 것입니다.

편집 : OpenGL을 사용하여 그려진 일부 상자를 사용하여 수행 한 작업을 정확히 다시 프로그래밍했습니다. 위치 업데이트 방법이 작동하지 않는 것 같습니다. 박스는 dt 또는 timestep이 1.0d 인 경우에만 제대로 표시되는 것으로 보이며 이유가 확실하지 않습니다. 그런 다음 무언가와 충돌하면 튀는 대신 모두 멈 춥니 다. 왜 그런지 정확히 모르겠습니다. v = u + a*ts = s_last + v*t 상자가 예상대로 정확히 떨어지고 제대로 반사 :

그러나, 나는 또한 내가 설명하는 물리학을 사용하여 화면에 또 다른 상자가 있습니다. 간소화로 인해 튀는 에너지가 손실됩니다.

+0

두 번째 운동학 방정식을보십시오 : http://physics.info/kinematics-calculus/ 제 방정식은 같습니다. – bluestunt

+0

예, 그렇지만 불행히도 이러한 유형의 작업에는 유효하지 않습니다. – user3728501

+0

방정식이 계산하는 내용을 이해합니까? 설명하면 도움이 될까요? 에드워드 (Edward)가 말했듯이, – user3728501

0

당신의 cocos2d-iphone 게임에서 Box2d 또는 Chipmunk 물리 엔진을 시험해 보는 것이 더 좋습니다. 또한 구현하기가 상대적으로 쉽습니다.

자신의 물리 시스템을 만들 필요가 없습니다 - 당신을위한 기술 작업을 수 있도록 기억, D 여기

+0

Box2d를 구현하려고했습니다. 정말 큰 무게의 물리 엔진이 필요없는 매우 가볍고 간단한 게임입니다. 저는 새로운 속도에 5의 계수를 곱하는 것이 도움이된다는 것을 알았습니다. – bluestunt

+0

@bluestunt : 나는 이해합니다. 그러나 나는 탁구와 같은 것들을 포함하는 셀 수없는 간단한 게임들이 이런 종류의 "잔인한"엔진을 사용했다고 확신합니다. 그것은 단지 당신의 인생을 더 쉽게 만듭니다. 부족한 것보다 여분의 힘을 갖는 것이 더 낫습니다! 또한 Box2d 또는 Chipmunk를 사용하면 실제로는 더 복잡한 구성을 의미하지 않습니다. 필요한 모든 것이 기본 기능이면 기본 설정 만 가능합니다. – Voldemort

+0

물리 엔진을 구현할 필요가 없으며 방정식을 바꿔 트릭을 수행 할 수 있습니다. 추신 : 귀하의 방정식과 내가 사용하는 방정식을 사용하여 프로그램을 작성 했으므로 이제 내 대답을 편집했습니다. 나는 이것을 너무 오랫동안 생각해 왔기 때문에 그 결과에 대해 매우 혼란 스럽다. 그러나 긴 이야기는 짧다. 새로운 y- 속도를 얻기 위해'v = v_last + accel * timestep ' 새로운 y 위치를 얻으려면 y_last + v * timestep'을 입력하십시오. – user3728501