크리티컬섹션 :: JavaScript로 Slither.io를 만드는 법 : Part 4 - 충돌

달력

62024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

이것은 JavaScript 및 Phaser로 Slither.io를 만드는 튜토리얼 시리즈의 네 번째 파트입니다! 


예제를 살펴보고 이 부분의 소스 코드를 살펴보십시오.


충돌 개념

이 부분에서는 snake.js를 수정합니다. 본질적으로, 우리가 하고 싶은 것은 다른 뱀의 섹션과 충돌 할 수 있는 뱀의 전면에 포인트를 추가하는 것입니다. 다음과 같이 보입니다.

각 뱀의 앞쪽에서 원형 물리 바디 "포인트"를 볼 수 있습니다. 게임에서 이 피직스 바디를 보려면 뱀의 디버그 속성을 true로 설정하십시오.


Part 2의 뱀 섹션에 이미 물리 바디를 추가 했으므로 뱀 앞에 서클 본문을 만드는 것이 필요합니다. 이 원을 뱀의 "가장자리"라고 할 것 이므로 뱀의 가장자리가 섹션 바디와 충돌 할 때 관심이 있습니다. 가장자리를 머리 앞쪽에 유지하려면 잠금 제한을 사용하여 뱀이 회전하거나 움직일 수 있도록하고 이 가장자리는 앞으로 유지됩니다.


가장자리 만들기

먼저 snake.js 소스의 Snake 함수에 다음 줄을 추가했습니다.


// 가장자리는 다른 뱀과 충돌 할 수있는 앞쪽 몸체입니다.

// 이 뱀의 머리에 고정되어있다.

this.edgeOffset = 4;

this.edge = this.game.add.sprite (x, y - this.edgeOffset, this.spriteKey);

this.edge.name = "edge";

this.edge.alpha = 0;

this.game.physics.p2.enable (this.edge, this.debug);

this.edge.body.setCircle (this.edgeOffset);


// 가장자리를 머리 앞쪽으로 제한합니다.

this.edgeLock = this.game.physics.p2.createLockConstraint (

     this.edge.body, this.head.body, [0, -this.head.width * 0.5-this.edgeOffset]

);


this.edge.body.onBeginContact.add (this.edgeContact, this);


우리는 스프라이트를 보이지 않게 만들고, 그런 다음 가장자리에 원형 물리바디를 줍니다. 이 바디를 특정 오프셋에서 머리 앞에 고정시키는 잠금 구속 조건을 만듭니다. 이 가장자리가 다른 본문과 접촉하기 시작할 때 콜백을 추가합니다.


에지 연결

가장자리가 무언가와 충돌 할 때 우리가 하는 일을 살펴 봅시다.


edgeContact : function (phaserBody) {

     // 가장자리가 다른 뱀의 섹션을 치는 경우이 뱀을 파괴합니다.

     if (phaserBody && this.sections.indexOf (phaserBody.sprite) == -1) {

         this.destroy ();

     }

     // 가장자리가이 뱀 자신의 섹션에 닿는 경우 글리치를 피하는 간단한 해결책은

     // 가장자리를 중심으로 이동하는 것입니다.

     // 그러면 잠금 제한으로 인해 맨 앞으로 이동합니다

     else if (phaserBody) {

         this.edge.body.x = this.head.body.x;

         this.edge.body.y = this.head.body.y;

     }

}


우리는 가장자리가 다른 뱀의 단면 또는이 뱀의 단면을 공격했는지 알아 낼수 있습니다. 그것이 다른 뱀을 치면 우리는 파괴 방법을 사용하여 이 뱀을 파괴합니다. 이 뱀을 때렸다면, 우리는 머리를 단순히 재설정하기 위해 머리의 중심으로 이동시킵니다. 이 솔루션은 충돌 그룹을 사용하여 이 뱀의 가장자리가 자신의 섹션을 치는 것을 방지하기 위한 대안입니다. 우리가 사용하는 솔루션은 간단하지만 구현하기가 훨씬 쉽습니다.


파괴

뱀이 파괴되면, 우리는 또한 가장자리를 파괴해야합니다. destroy 메소드에 이 코드를 추가했습니다.


this.game.physics.p2.removeConstraint (this.edgeLock);

this.edge.destroy ();


그들이 제한하는 스프라이트 바디와 함께 제약 조건을 파괴하는 것이 항상 중요합니다.


스케일링

뱀의 머리가 커지면 그 엣지는 더욱 더 제약을 받아야 합니다. 이 코드를 setScale 메서드에 추가합니다.


// p2 physics로 엣지 잠금 위치 업데이트

this.edgeLock.localOffsetB = [

     0, this.game.physics.p2.pxmi (this.head.width * 0.5 + this.edgeOffset)

];


순수한 P2 물리를 사용하여 잠금 구속 조건을 업데이트하고 새로운 헤드 스케일을 기반으로 헤드에서 추가 오프셋에 에지를 배치합니다. P2 잠금 제한 등록 정보는 여기에서 읽을 수 있습니다.


그리고 그것은 게임에서 뱀 충돌을 구현하는 데 필요한 모든 것입니다. 우리의 작업은 대부분 물리학 자들로 철저한 스네이크 수업을 만들고 방법을 파괴함으로써 이미 완료되었습니다. 제 5 부에서는 우리가 뱀에게 눈을 보충하기 위해 노력할 것입니다.





Posted by 마스터킹
|