답변:
당시 (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 장면이며 단순화 된 모양의 시각적 플레이 필드를 나타내는 일부 단순화 된 선, 베 지어 곡선 또는 구에 충돌이 발생합니다.
예 ( 시각 핀볼에서 ) :
일부 게임 회사들은 자신의 물리 엔진을 사용하지만, 또 다른 쉬운 방법은 같은 물리 엔진을 사용하는 것입니다 Box2D
나 Bullet
. 내가 본 대부분의 iPhone 핀볼 게임은 기존 물리 엔진 + 일부 3D 자산을 사용하고있었습니다.
핀볼은 구멍이나 벽뿐만 아니라 공이 느려지고 속도가 느려지는 반동 요소 또는 요철이있는 표면이 매우 풍부합니다.
좋은 핀볼을 만들려면 3D 충돌 감지를 사용하거나 거리 및 속도 매개 변수가있는 방법을 가진 모든 충돌 가능한 객체에 자체 맞춤형 시스템을 사용하여 변경된 속도를 반환해야합니다.
먼저 핀볼 게임을 만드는 경우 경계 상자 하나보다 더 많은 경계 -CIRCLE-collision-detection이 필요할 것입니다. :-)
본격적인 핀볼에 관련된 물리학의 복잡성을 고려할 때, 기존 2D 물리 엔진. Box2D는 자바 스크립트에서 꽤 명성이 있으며, 다른 것들이있을 수 있지만 좋은 (무료)를 찾지 못했습니다.
Rq1 : 업데이트와 드로우 사이에서 게임에서 클래식 스플릿을 사용합니다. 또한 타이머 (setInterval / setTimeout) 및 / 또는 RequestAnimationFrame을 사용하여 업데이트를 호출 한 다음 정기적으로 그립니다. 핀볼은 하나의 타이머 구동 업데이트와 다른 구동 추첨을 원하는 게임 유형 일 수 있으므로 각 장치의 속도를 독립적으로 조정하여 광범위한 장치에서 작동 할 수 있습니다. 장치가 너무 느리면 떨어 뜨릴 수 없으므로 (업데이트 + 그리기) 두 업데이트 사이의 시간 (dt)이 너무 길면 물리 엔진이 충돌을 놓칠 수 있습니다.