네트워킹 통합으로 인해 자체 물리 엔진을 작성해야합니까?


11

저는 현재 하향식 실시간 좀비 슈팅 게임을 개발 중입니다. JBox2D를 물리 엔진으로 사용하여 Java로 이것을 코딩하고 있습니다. 나는 이번 주에 네트워킹을 코딩했으며 이제 물리 동기화에 달려 있습니다.

서버가 나중에 승인하는 한 클라이언트가 자유롭게 이동할 수있는 예측 클라이언트 / 권한있는 서버 모델을 사용할 계획입니다. 여기에는 클라이언트가 이동 데이터가 포함 된 패킷을 서버로 보내고 서버가 대기 시간을 계산하고 이전 상태에서 세계를 다시 시뮬레이션하는 과정이 포함됩니다.

내 문제는 현재 물리 엔진 인 JBox2D (기본적으로 Box2D 포트)가 월드 롤백을 지원하지 않으며 월드 데이터를 직렬화하는 것이 쉽지 않다는 것입니다. 나는 2 가지 해결책을 가지고 있습니다. 현재 물리 엔진을 수정 / 확장하거나 직접 작성할 수 있습니다.

내 자신의 물리 엔진을 작성하는 이유-

  • 불필요한 기능을 제거 할 수 있습니다. 하향식 게임에서는 충돌 메커니즘과 처리 력 만 있으면됩니다. 중력이 없습니다.
  • 코드를 더 잘 이해할 수 있으며 롤백 함수를 구현하는 것이 더 쉬울 것입니다.

JBox2D 확장 / 수정 이유

  • 내 자신의 물리 엔진을 작성하면 상당한 양의 작업이 필요할 수 있습니다.
  • JBox2D는 광범위하게 지원하는 커뮤니티를 보유하고있어 개발자와 함께 할 수 있습니다.
  • JBox2D는 충돌 감지와 같은 특정 최적화 기능을 갖추고있어 유용합니다.
  • 이미이 작업을 수행했지만 약간의 코드가 공유되었습니다.

그래서 당신의 의견은 무엇입니까? 이것은 내 첫 게임이며, 전문 게임 개발자는 아닙니다. 누구든지 해당 영역에서 이미 수행 할 수있는 링크를 제공 할 수 있다면 (바람직하게 JBox2D / Box2D / Java 사용).


또한 JBox2D를 사용하는 경우 strictfp어디에서나 사용해야하므로 성능에 심각한 영향을 미칩니다. 그렇지 않으면 서버와 클라이언트가 정확히 동일한 결과를 얻지 못할 수 있습니다. 대신 고정 소수점을 사용하는 것이 좋습니다.
sam hocevar

답변:


7

2D에서의 충돌 감지는 너무나 간단합니다. 왜 물리 엔진을 처음 사용하는지 귀찮게하는 이유를 모르겠습니다. 그리고 모든 취급 력이 직진 또는 곡선을 이루고 있기 때문에 (떨어짐, 변화가없는 등) 개인적으로 그것은 당신이 선택해야 할 두뇌가 아닙니다. 자신을 만드는 것은 간단합니다. 충돌:

두 개의 직사각형에서 발생할 수있는 세 가지 충돌을 설명합니다.

  1. 가장자리에서 가장자리로 : 매우 간단합니다. 하나의 가장자리와 다른 가장자리의 축을 가져 와서 같은 공간을 차지하는지, 아니면 거의 근접한지를 결정합니다.
  2. 모서리에서 모서리로 : 회전 모양이있는 경우 가장 일반적으로 사용됩니다. 운 좋게도 구현하는 것도 매우 간단합니다.
  3. 구석 구석 : 구현할 가치가 없을 정도로 거의 발생하지 않습니다. 그 이유는 두 가지가 동일한 정확한 축에서 정확히 마지막으로 계산 된 10 진수까지 정확히 반대 방향으로 움직여야하기 때문입니다. 이제 모든 것이 45도 또는 90도 회전하면이 값을 포함하여 (아마도 아닐 수도 있음)

편집 : 언급했듯이, 나는이 문제에 익숙하지 않으며 총알 / 발사체 충돌에 대해 상담해서는 안됩니다.

2D 공간에서 글 머리 기호로 작업 할 때 직선과 곡선으로 작동하는 일종의 경로를 사용하여 물리 엔진을 사용하여 발사체를 던지고 (처음부터 만들지 않은) 표준 충돌을 사용합니다.

주석에서 처음부터 작성하는 것에 대해 읽으십시오.


편집 : * 나를 믿어 라. * 어느 것에 관계없이, 발사체와 주어진 시간에 얼마나 많은 발사체가 화면에 나타날 수 있기 때문에 게임 엔진에 어떤 형태의 데드 레커 킹이 필요하다. 주어진 위치에서 프레임 당 화면의 모든 단일 글 머리 기호를 업데이트하고 싶지는 않습니다. 그러나 게임을 플레이 할 수 없을 정도로 느리게 만드는 좋은 방법입니다. : D! 다음 사항 만 업데이트해야합니다.

  • 발사체를 던지고 있습니다
  • 그것이 던져지는 방향
  • 구부러 졌는지 여부
    • 그렇다면 곡선의 기능은 무엇입니까?
  • 발사체 란? (이것은 그래픽, 효과, 손상, 모든 것을 설명합니다)

이제 각 발사체의 서버가 아닌 해당 데이터에 따라 엔진의 데이터를 업데이트하고 모든 단일 탄환에 대한 패킷 데이터를 보냅니다. (화면에 기관총 2 개만으로도 그렇게하는 것을 상상해보십시오!)


물론 구현하기가 상대적으로 쉽지만 충돌 감지 최적화에 관심이 있으며 구현 방법을 모릅니다.
liamzebedee

설명 된 방법은 설명 된대로 최적화하면 실제로 필요하지 않습니다. 필요할 수있는 유일한 최적화는 검사를 수행하는 시간과 충돌이 실제로 업데이트되는 빈도입니다. 예 : 충돌 가능성이있는 경우에만 업데이트해야합니다.
Joshua Hedges

내가 마지막으로 언급 한 내용을 확장합니다. 캐릭터가 처음 움직일 때와 같이 건물 충돌을 확인하기 만하면됩니다. 캐릭터가 아닌 유닛을 볼 때도 유닛 충돌을 확인하기 만하면됩니다. 발사 순간 충돌이있을 때만 (그 순간에) 확인하면됩니다. 무언가가 다른 물체에 닿거나 가까이 있다는 것을 알고 난 후에는 충돌 형태 감지 (가장자리에서 모서리로? 모서리에서 가장자리로? 등)를 건너 뛸 수 있습니다. 그렇지 않으면 전체적으로 건너 뜁니다.
Joshua Hedges

나는, 충돌의 서버 측을 처리하고있을 때를 제외하는 나는 등 여러 선수의 충돌을 감지 할 필요가
liamzebedee

4
@MadPumpkin : 과신이 답변에 잘못 반영됩니다. 충돌 감지에 대해 이야기하고 있지만 2D 슈팅 게임에서 적절한 총알 처리의 핵심 인 스윕 충돌 감지에 대해서는 언급하지 않았습니다 . 또한 스위핑을 수행하더라도 먼저 충돌이 발생했는지 확인하고 잠재적 충돌을 해결하며 엔티티가 제거 된 경우 전체 해상도를 다시 시작해야하므로 해상도 는 감지만큼 중요합니다. 분명히 당신이 그것을 암시하는 것처럼 보이는 사소한 문제는 아닙니다.
sam hocevar
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.