핀볼 게임의 2D 충돌 감지


9

지금까지 이전 게임에서는 상자와 함께 간단한 2D 충돌을 사용한 다음 픽셀 수준에서 충돌을 확인했습니다.

거의 많은 프레임에서 핀볼 게임을하는 경우 공이 벽이나 다른 표면에 닿아 다른 방법이 있습니까?

답변:


19

당시 (1990 년) 오래된 핀볼 게임은 다음과 같이 만들어졌습니다.

운동장에는 여러 레이어가 있습니다 (게임을 할 때 보이는 것) :

여기에 이미지 설명을 입력하십시오

충돌에 대한 여러 레이어 :

여기에 이미지 설명을 입력하십시오 여기에 이미지 설명을 입력하십시오

왼쪽 회색조 그림은 메인 게임의 충돌 맵이고, 오른쪽 그림은 핀볼 램프와 같은 특수 영역의 충돌 맵입니다.

White = 공의 자유 영역, 색상 인덱스는 255입니다.

Gray=이 영역에서 볼이 "밀어집니다". 색상 인덱스 = 볼 위치에 추가 할 벡터 각도. 연한 회색 = 0도. 어두운 회색 = 360도

일부 의사 코드 :

void do_ball_physics()
{
    while(1)
    {
         byte color = read_pixel_under_ball(ballx, bally); //one pixel read
         if(color == 255) //see remark below
            break;
         float vectorx = sin(color/255.0f * 2.0f * PI);
         float vectory = cos(color/255.0f * 2.0f * PI); 
         ballx += vectorx; //push ball away from one unit
         bally += vectory; //

    }
}

일부 특수 컬러 인덱스도 충돌보다는 다른 것에 사용 할 수 있습니다, 사용자 정의 색상 범위 (예 : 240-255)이 같은 특별한 영역을 검출 예약 할 수 있습니다 spinners, triggers, bumpers, holes, ...

보시다시피, 이것은 매우 간단합니다. 프레임 당 몇 개의 "읽기"픽셀 만 있습니다. 이로 인해 물리 시뮬레이션을 실제 프레임 속도 (예 : 200fps)로 실행할 수 있습니다. 높은 프레임 속도를 사용하면 시뮬레이션이 매끄럽고 "터널링"이 줄어 듭니다 (공이 너무 빠르게 진행되어 충돌없이 트로프 요소를 통과 할 때 발생 함). 그 단순성에 부드러운 핀볼 게임을 가능하게하는 것 또한 386 computers(심지어 빠른 286(컬러 사이클링, VGA 스크롤 및 스프라이트 마스킹 ... 같은 몇 가지 다른 트릭 중) 시대에) 다시.

오늘날 대부분의 핀볼 게임은 더 이상 이와 같이 만들어지지 않습니다. 대신, 플레이 필드는 다각형 또는 스프라이트를 사용하는 2D / 3D 장면이며 단순화 된 모양의 시각적 플레이 필드를 나타내는 일부 단순화 된 선, 베 지어 곡선 또는 구에 충돌이 발생합니다.

예 ( 시각 핀볼에서 ) :

여기에 이미지 설명을 입력하십시오

일부 게임 회사들은 자신의 물리 엔진을 사용하지만, 또 다른 쉬운 방법은 같은 물리 엔진을 사용하는 것입니다 Box2DBullet. 내가 본 대부분의 iPhone 핀볼 게임은 기존 물리 엔진 + 일부 3D 자산을 사용하고있었습니다.


... 우리는 여기에서 자바 스크립트와 캔버스를 이야기하고 있으므로이 프레임 워크에서 가능한 가장 느린 작업은 ... 가장 느린 장치에서 픽셀을 그리기 및 읽는 것입니다. 따라서이 답변의 4/5는 단순히 역사 / 무관합니다. 그러나 합리성은 그림과 경쟁 할 수 없습니다.
GameAlchemist

1
충돌 맵을 배열에 저장할 수 있습니다. 왜 캔버스에 저장 하시겠습니까? 대답의 첫 번째 부분은 대부분 역사에 대한 것이지만 매우 낮은 CPU (예 : 오래된 GSM)에 핀볼을 구현 해야하는 경우에도 여전히 적용 가능합니다. 현대에는 jbox2d와 같은 물리 엔진을 사용하거나 선 세그먼트 또는 베 지어 곡선과 충돌하여 직접 물리학을 제안하는 것이 좋습니다 (당신이 그런 것을 쓸 수 있다고 생각되면).
tigrou

최신 브라우저에서는 이미지에서 픽셀을 읽는 것이 매우 빠릅니다. 최초의 "omg JS는 C보다 빠릅니다."데모 중 일부는 이미지 처리 커널이었습니다.
Sean Middleditch 2018

충돌 맵 tigrou에 대해 어떻게 알게 되었습니까?
Bemmu

1
이 핀볼의 꿈 때문에 리메이크 : pouet.net/prod.php?which=24499 ( 나가 아님). 내가 살펴본 출처, 충돌지도가 있습니다.
tigrou 2016 년

1

핀볼은 구멍이나 벽뿐만 아니라 공이 느려지고 속도가 느려지는 반동 요소 또는 요철이있는 표면이 매우 풍부합니다.

좋은 핀볼을 만들려면 3D 충돌 감지를 사용하거나 거리 및 속도 매개 변수가있는 방법을 가진 모든 충돌 가능한 객체에 자체 맞춤형 시스템을 사용하여 변경된 속도를 반환해야합니다.


왜 3D 충돌 감지가 2D보다 어떤 장점을 가지고 있다고 말합니까?
John

@John 저는 경사로 등이있는 3D 게임으로 좋은 핀볼을 상상합니다.이 경사로를 2D로 프로그래밍하고 경사로를 넘어갈 때 공을 확장 할 수 있습니다.이 경우에는 여전히 3D입니다. 게임에서는 Z 치수 만 추가하면됩니다.
Markus von Broady

1

나는 얼마 전에 핀볼 게임을 만들었습니다. 픽셀 기반이었습니다. 충돌 데이터가 포함 된 충돌 맵이있었습니다. 대략적인 충돌 법선을 쉽게 찾을 수있었습니다.

공과 겹치는 충돌 맵 영역을 가져 와서 중심을 찾은 다음 해당 지점에서 공 중심까지의 벡터를 형성 한 다음 정규화합니다.

희망은 당신에게 몇 가지 아이디어를 제공합니다 :)


1

먼저 핀볼 게임을 만드는 경우 경계 상자 하나보다 더 많은 경계 -CIRCLE-collision-detection이 필요할 것입니다. :-)
본격적인 핀볼에 관련된 물리학의 복잡성을 고려할 때, 기존 2D 물리 엔진. Box2D는 자바 스크립트에서 꽤 명성이 있으며, 다른 것들이있을 수 있지만 좋은 (무료)를 찾지 못했습니다.
Rq1 : 업데이트와 드로우 사이에서 게임에서 클래식 스플릿을 사용합니다. 또한 타이머 (setInterval / setTimeout) 및 / 또는 RequestAnimationFrame을 사용하여 업데이트를 호출 한 다음 정기적으로 그립니다. 핀볼은 하나의 타이머 구동 업데이트와 다른 구동 추첨을 원하는 게임 유형 일 수 있으므로 각 장치의 속도를 독립적으로 조정하여 광범위한 장치에서 작동 할 수 있습니다. 장치가 너무 느리면 떨어 뜨릴 수 없으므로 (업데이트 + 그리기) 두 업데이트 사이의 시간 (dt)이 너무 길면 물리 엔진이 충돌을 놓칠 수 있습니다.


0

2D 대 3D 주제의 시각적 핀볼 대 미래 핀볼을 살펴볼 수 있습니다. 시각적 핀볼 (모든 것이 2D로 제작 됨)을 재생 한 다음 미래의 핀볼 또는 Zen Pinball과 같은 게임을하는 경우 게임 방식에 차이가 있습니다. 개인적으로 3d를 선호하지만 프로젝트가 2d에 더 적합 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.