Game Fundamentals
1. 게임 구성 요소
- Graphics
- Sounds
- Input
- Physics
- Game logic.. etc
게임은 복잡하고 다양한 요소들로 구성되어 라이브러리를 사용하게 되는데, 해킹에서 또한 라이브러리 식별이 중요하다.
예를 들어, wallhack은 해커가 단단한 벽을 통해 타 플레이어를 볼 수 있도록 하는 일종의 해킹으로 게임의 그래픽 라이브러리를 수정하여 프로그래밍할 수 있다.대부분의 해킹에서는 게임 로직을 수정하는데 이는 게임 플레이 방법을 담당하는 섹션으로 캐릭터 제어 등이 자유로워진다.
2. 게임 구조
게임 로직 또한 컴퓨터 코드와 마찬가지로 명령으로 구성된다.대부분의 게임에는 설정과 메인루프, 두 가지 주요 기능이 있다.1) 설정 설정 기능은 게임 시작 시 실행되며 하드 드라이브에서 이미, 사운드 및 기타 대용량 파일을 로드하여 RAM에 배치하는 역할을 한다.2) 메인루프
메인 루프는 플레이어가 종료할 때까지 영원히 실행되는 특별한 유형의 함수로 입력 처리, 사운드 재생, 화면 업데이트 등을 담당한다.
ex
function main_loop() {
handle_input();
update_score();
play_sound_effects();
draw_screen();
}
이 때 함수는 차례로 다른 함수를 호출한다.
function handle_input() {
if( keydown == LEFT ) {
update_player_position(GO_LEFT);
}
else if( keydown == RIGHT ) {
update_player_position(GO_RIGHT);
}
}
3. 데이터와 클래스
게임에서 업데이트 되는 모든 데이터는 변수에 저장된다.
변수에는 플레이어의 점수, 포지션,돈 등 여러가지가 존재한다.
ex) money.c
int money = 0;
변수로 돈을 선언했을 때 플레이어의 돈을 추적해야 한다면
int money1 = 0;
int money2 = 0;
int money3 = 0;
int money4 = 0;
다음과 같이 선언을 해야하지만, 이는 유지 관리가 힘들다는 단점이 있다.
int money[10] = { 0 };
int current_players = 4;
function increase_money() {
for(int i = 0; i < current_players; i++) {
money[i] = money[i] + 1;
}
}
따라서 위와 같은 코드를 통해 current_players 변수만 업데이트하면 되도록 작성하는 것이 좋다.
복잡한 애플리케이션을 쉽게 개발하도록 객체지향프로그래밍(OOP)을 하는 경우가 많으며 OOP에서 변수와 함수는 클래스라는 컬렉션으로 함께 그룹화된다.
예를 들어 게임에 Player 클래스에서는 플레이어의 위치, 이름, 돈과 같은 변수가 포함되는 것처럼 말이다.
게임에는 이렇듯 클래스 목록이 포함되는 경우가 많다.
4. 메모리
게임에는 이미지나 사운드와 같은 대규모 리소스가 많기에 RAM에 다양한 데이터를 계속해서 레지스터에 로드하여 작동해야 한다.
이 로딩은 일반적으로 mov 명령으로 수행되며 mov 명령을 통해 메모리 섹션을 레지스터로 이동한다.
ex) loss_money
function increase_money:
mov eax, 0x12345678
add eax, 1
mov 0x12345678, eax
0x1234567을 플레이어 돈의 RAM 위치로 사용해보자.
게임에 Player 클래스가 있는 경우 CPU에서 실행되는 위의 코드는 돈을 검색하기 위해 Player의 클래스 위치를 사용해야한다.
function increase_money:
mov ebx, 0x12345670
mov eax, ebx + 8
add eax, 1
mov ebx+8, eax
이 경우 CPU는 Player 클래스의 위치를 기반으로 돈의 위치 또한 상쇄한다.
5. 멀티 플레이어 클라이언트
게임에서 여러 플레이어가 서로 상호작용하는 경우 게임은 클라이언트와 서버를 활용한다.
클라이언트는 각 플레이어의 게임 사본을 나타내며 로컬 게임의 모든 정보를 포함한다.
ex) 플레이어가 돈을 사용하면 클라이언트는 업데이트를 서버에 보낼 책임이 있음
정보는 양방향으로 전송될 수 있다.
ex) 플레이어가 움직이면 서버는 다른 모든 클라이언트에게 이동된 클라이언트의 위치를 업데이트하라고 지시함
6. 멀티 플레이어 서버
클라이언트가 플레이어의 게임 사본이라면 서버는 연결된 모든 클라이언트가 동일한 사본을 플레이하는지 확인한다.
서버는 종종 클라이언트로부터 받아들이는 변경사항을 제한하는데 이로 인해 싱글 플레이어 핵이 멀티 플레이어에서 작동하지 않는 일이 발생한다.