멀티플레이어 게임 만들기
이 문서는 첫 번째 멀티플레이어 게임을 만드는 자세한 단계를 안내합니다. 롤백 시스템에 대한 정보는 Rollback System을 참조하세요. 롤백 함수에 대한 자세한 내용은 Rollback Functions을 읽어보세요.
프로젝트 설정
- 새로운 프로젝트를 시작하고 플레이어 객체를 위한 스프라이트를 만듭니다. 이미지를 가져오거나 채워진 사각형을 만들 수 있습니다.
- 두 개의 객체를 생성합니다:
obj_game
: 멀티플레이어 게임을 관리합니다.obj_player
: 실제 플레이어 객체입니다. 연결된 각 플레이어는 이 객체의 인스턴스를 제어할 수 있습니다.- 플레이어 스프라이트를 플레이어 객체에 할당합니다.
obj_game
을 방에 배치합니다.obj_player
는 자동으로 생성되므로 배치하지 않습니다.
게임 시작하기
obj_game
의 Create 이벤트에 다음 코드를 작성합니다:
rollback_define_player(obj_player);
var _joined = rollback_join_game();
if (!_joined){
rollback_create_game(2);
}
이 코드는 사용할 플레이어 객체를 정의하고 rollback_join_game()
을 사용하여 게임에 참여하려고 시도합니다. 게임에 참여할 수 없으면 rollback_create_game()
을 호출하여 자신의 게임을 호스팅합니다. 여기서 최대 2명의 플레이어가 허용됩니다.
현재 최대 4명의 플레이어를 위한 게임만 생성할 수 있습니다.
위 코드는 방의 왼쪽 상단 모서리에 두 개의 obj_player
인스턴스를 생성하지만, 아직 제어할 수 없습니다.
플레이어 이동
입력은 롤백 시스템에 의해 관리되며 플레이어 간에 자동으로 동기화됩니다. 플레이어 객체에서 rollback_get_input()
을 호출하여 기본 입력을 포함하는 구조체를 가져옵니다. 기본 입력은 다음과 같습니다:
- left
- right
- up
- down
- Z
- X
- C
- space
이 키가 눌렸는지 여부를 나타냅니다. _pressed
및 _released
변형도 제공됩니다. 자신의 입력을 정의하려면 Defining Inputs를 참조하세요.
플레이어를 설정하기 위해 Create 및 Step 이벤트에 다음 코드를 추가합니다:
// Create Event
move_speed = 5;
// Step Event
var _input = rollback_get_input();
if (_input.left) x -= move_speed;
if (_input.right) x += move_speed;
if (_input.up) y -= move_speed;
if (_input.down) y += move_speed;
이 코드는 플레이어의 속도를 설정하고 Step 이벤트에서 입력 구조체를 가져옵니다. 각 방향키가 눌리면 해당 축으로 인스턴스를 이동시킵니다.
플레이어 위치 설정
테스트하기 전에 플레이어가 방의 왼쪽 상단 모서리 대신 특정 위치에 생성되도록 설정합니다. 플레이어 객체의 Create 이벤트에 다음을 작성합니다:
if (player_id == 0){
x = 300;
} else if (player_id == 1){
x = room_width - 300;
}
y = room_height / 2;
player_id
는 플레이어 인스턴스의 ID를 저장하는 내장 인스턴스 변수입니다. 두 명의 플레이어가 있는 게임에서 첫 번째 플레이어는 ID 0을, 두 번째 플레이어는 ID 1을 가집니다. 이를 기반으로 플레이어의 초기 X 위치를 변경합니다. Y 위치는 두 플레이어 모두 동일합니다.
게임을 실행하면 두 플레이어가 보이며 첫 번째 플레이어를 제어할 수 있습니다. 두 번째 플레이어는 롤백 시스템의 기능으로 인해 자동으로 이동합니다. 자동 랜덤 이동을 비활성화하려면 rollback_use_random_input(false)
를 호출하거나 다른 플레이어를 위한 "모의" 입력을 설정할 수 있습니다.
온라인 연결
기본 멀티플레이어 예제가 완료되었으며 인터넷으로 가져갈 준비가 되었습니다. 기본적으로 시스템은 Sync Test 모드에서 시작되며, 이는 오프라인에서 게임을 테스트하는 방법입니다. 온라인 기능을 활성화하려면 rollback_create_game()
의 두 번째 인수를 false
로 설정해야 합니다.
// obj_game: Create event
rollback_define_player(obj_player);
var _joined = rollback_join_game();
if (!_joined){
rollback_create_game(2, false);
}
GX.games에 로그인하고 프로필 설정에서 지역을 설정합니다. GX.games 대상을 통해 게임을 실행합니다. 롤백 시스템이 시작되면 플레이어가 함께 플레이할 "방"이 생성됩니다.
플레이어 초대
게임이 시작되면 플레이어 인스턴스가 즉시 보이지 않습니다. 대신 시스템은 모든 플레이어가 참여할 때까지 기다립니다.
팁: rollback_start_game()
을 호출하여 플레이어가 참여하기 전에 게임을 시작할 수 있습니다. rollback_use_manual_start()
를 호출하면 모든 플레이어가 참여한 후에도 수동으로 게임을 시작할 때까지 기다립니다.
기다리는 동안 게임 아래에 "Copy Share Url" 버튼이 표시됩니다. 버튼이 보이지 않으면 아래로 스크롤하세요. 이 버튼을 클릭하면 게임 링크가 복사되며, 다른 브라우저 창에 붙여넣어 두 번째 플레이어로 참여할 수 있습니다. 두 브라우저 창을 동시에 볼 수 있어야 하며, 그렇지 않으면 숨겨진 창의 플레이어가 타임아웃되어 게임이 종료됩니다.
두 게임 인스턴스가 연결되고 동기화되면 각 플레이어를 브라우저 창을 통해 제어할 수 있습니다. 두 창을 나란히 열려면 드래그하여 크기를 조정하세요. 테스트 중에는 게임의 상태에 대한 정보를 제공하는 디버그 메시지가 게임의 왼쪽 상단 모서리에 표시됩니다. 이를 비활성화하려면 rollback_display_events(false)
를 호출하세요.
방 나가기
플레이어가 방을 나가려면 rollback_leave_game()
을 호출합니다. 사용법에 대한 자세한 정보는 함수 페이지를 참조하세요.
게임 로직
롤백 시스템은 모든 플레이어가 참여하면 자동으로 플레이어 인스턴스를 생성합니다. 그러나 게임이 시작되기 전에 다른 코드를 실행할 수 있으므로, 모든 플레이어가 참여한 후에만 핵심 게임 로직을 시작해야 합니다. 예를 들어, 알람을 사용하여 적 인스턴스를 생성하는 경우, Rollback Start
이벤트가 트리거된 후에만 해당 알람을 시작해야 합니다.
주요 이벤트
게임의 주요 이벤트(예: 플레이어가 승리하고 레벨이 종료되는 경우)는 모든 플레이어가 동기화되었을 때 수행해야 합니다. 그렇지 않으면 잘못된 예측으로 인해 플레이어가 잘못 승리할 수 있으며, 이는 나중에 롤백될 때 이상하게 보일 수 있습니다. 이를 올바르게 수행하는 방법은 rollback_sync_on_frame()
의 예제를 참조하세요.
추가 자료
이제 첫 번째 멀티플레이어 게임이 완료되었습니다! 롤백 시스템에 대해 더 배우려면 다음 페이지를 읽어보세요:
게임에 채팅 기능을 추가하려면 rollback_chat()
을 사용할 수 있습니다.