검색결과 리스트
게임개발에 해당되는 글 1건
- 2011.02.14 게임 개발 기초 (2)
글
게임 개발 기초
게임을 개발하는 과정은 일반적인 프로그래밍 과정과 크게 다르지 않다.
일반적인 프로그래밍은
- 데이터 추출
- 유효성검사
- 로직처리
- 결과출력
와 같은 흐름을 따른다. 게임프로그래밍에서 상응하는 흐름은 다음과 같다.
- 입력 이벤트 처리
- 로직 업데이트
- 디스플레이 렌더링
이러한 과정을 거쳐 한 프레임이 화면에 출력되며, 프레임의 연속적인 애니메이션이
게임을 이루게 된다. 입력 이벤트 처리 단계에서는 입력장치(키보드, 조이스틱, 터치스크린)를 통해 받은
데이터를 게임에서 의미있는 데이터로 변환한다. 게임로직 업데이트 단계에서는 입력장치로 입력받은 데이터에
근거하여 게임의 다음상태를 계산하게 되고, 물리로직과 렌더링 로직을 업데이트 한다. 디스플레이 렌더링 단계에서는
수정된 데이터를 화면에 드로잉한다.
Frame
프레임(frame)이란 애니메이션을 구성하는 낱낱의 한 화면을 의마한다. 조금씩 다른 사물을 포함하는 프레임을 빠르게
교환하여 마치 사물이 움직이는 듯한 애니메이션 효과를 주는 것이다. 프레임율은 fps(frame per second) 단위로 표현하며,
사람의 눈에 끈김없는 애니메이션 효과를 주기위해서는 평균 30 fps 이상이여야 한다.
Game Architecture
입력 이벤트 처리 / 로직업데이트 / 디스플레이 렌더링 의 각 단계는 게임의 장르, 동작 플랫폼에 따라서 천차만별로 달라질 수 있다.
입력 이벤트 처리에서 입력받는 데이터는 게임이 동작하는 장치에 따라 조이스틱, 키보드, 터치 스크린 등 다양할 수 있지만,
입력인터페이스를 통해 사용자가 입력한 데이터를 추출하여 큐에 담는 비교적 단순한 작업이다. 로직업 데이터에서는 입력데이터를
기반으로 게임 세계를 이루는 사물들의 위치와 속성 등을 변화시킨다. 이 때 물리법칙이 적용되는 게임에서는 별도의 물리엔진을
구성하여 물리엔진을 바탕으로 속성을 변화시킨다.
렌더링 단계에서는 변경된 로직을 바탕으로 화면에 드로잉을 수행하는데, 요즘과 같은 화려한 그래픽을 요구하는 게임에서는
상단한 자원과 렌더링 타임을 소모하게 되기 때문에, 스마트 폰과 같은 저사양 디바이스에서는 자원과 로직데이터의 량을 최소화하여
효율적으로 사용하는 전략이 필요하다
Collision Detection
게임에서 중요한 로직 중 하나가 충돌검사이다. 게임세계에서 묘사되는 사물들은 서로 접촉하게 될 경우 다양한 반응을
보이게 된다. 이러한 것들은 충돌검사를 통해 이루어진다. 다양한 형태를 갖는 사물들이 서로 접촉했는지 검사하는 것은
굉장히 복잡하고 어려운 작업이다. 복작한 형태를 갖는 사물을 단순한 도형으로 간소화하여 대체함으로써 충돌검사를 좀더
쉽게 할수 있다. 사물을 하나의 원으로 표현한다면, 원의 중심들 간에 거리와 원의 반지름의 합을 비교하여 접촉여부를 대략적
으로 검사할 수 있다. 실제로 사물이 접촉하지도 않았는데 충돌효과가 발생하여 동작이 어색함을 유발할 수 도 있다. 이럴 경우에는
단순한 도형으로 1차 충돌 검사를 하고, 1차 충돌검사가 통과할 경우 더 작은 도형(원과 사각형 등)들로 충돌 검사를 하여 정확도를
향상시킬 수 있다. 이러한 검사전략은 게임의 문맥과 사물의 특성에 따라, 결정해야할 문제이다.
또 하나의 충돌검사에서의 과제는 게임세계에서는 수많은 사물들이 존재하는데 어떻게 두 사물이 접촉했는지 알 수 있는가?이다.
게임 세계에 존재하는 모든 사물든 간에 접촉을 검사해야 할까? 그러면 엄청난 자원소모가 발생할 것이다.
게임세계를 다수의 일정한 영역으로 구분한다면, 현재 사물이 속한 영역에서 일정범위에 해당하는 영역 내의 사물들로 검사의
범위를 한정지을 수 있다.
Texture, Sprite
사물을 이루는 정점들의 구조인 Mesh에 이미지가 덧 입혀져 게임화면을 구성한다. 게임에 사용되는 이미지를 별도로
텍스처라고 부른다. Mesh의 각 정점들과 맵핑되는 텍스처의 점을 맵핑하여 사물에 텍스처를 입힌다. (텍스처링)
게임에서 하나의 텍스처를 로딩하는데는 상당한 자원을 소모하게 되는데, 이를 여러 텍스처를 포함하는 하나의 큰 텍스처를
구성하고 한번에 로딩하여, 원하는 텍스처를 적절한 시점에 불러와 사용하는 전략이 사용된다.
일반적으로 게임에서는 시나리오와 레벨이 있어서, 어느 시점에 어느 자원이 필요하다는 것을 알수 있기 때문에, 필요한 만큼에
자원을 예측하여 한번에 로딩하여 퍼포먼스를 향상시킬 수 있다.
이렇게 여러 작은 텍스처로 구성된 텍스처를 Atlas(지도책) 또는 Sprite 라고 부른다. (스프라이트는 애니메이션을 위해 조금씩
모양이 다른 이미지들로 구성된 텍스처들을 나타내는 의미가 강한 것 같음)
렌더링
화면 렌더링을 위한 표준 그래픽 라이브러리로 윈도우 플랫폼을 지원하는 Direct X와 멀티플랫폼을 지원하는 OpenGL이 있다.
게임을 이루는 사물의 메시를 모두 프로그래머가 수동으로 그릴 수는 없다. 그래서 3차원 공간상에 사물들에 메시를 그려주고,
텍스처링해주며, 플랫폼에 맞게 메시와 텍스처를 쉽게 익스포트 할 수 있게 지원하는 3D 툴을 사용하게 된다.
대표적으로 유료툴인 Maya아, 무료툴인 Blender 가 있다.
게임루프
다음은 C언어를 사용하여 구현한 간단한 게임루프이다.
#include <stdio.h>
// 게임상태
enumGAME_STATE {
LOADING,
MAIN_MENU,
PLAYING,
PAUSE,
QUIT
};
// 게임종료유무를나타내는변수
int isGameOver = 0;
// 현재 게임 상태
int game_state;
// 사용자입력갑
char userInput;
void event_precess();
void logic_update();
void render();
int main (int argc, const char * argv[]) {
// 게임 초기화
game_state = LOADING;
printf("game start\n");
render();
while (!isGameOver) {
event_precess();
logic_update();
render();
}
return 0;
}
// 사용자 입력
void event_precess() {
printf("please input!\n");
// 사용자입력을받음(표준입력)
userInput = getchar();
// 개행문자(enter)가나올때까지입력버퍼를비움
while (getchar() != '\n');
}
// 로직 갱신
void logic_update() {
switch (game_state) {
caseLOADING:
if (userInput == 'm') {
printf("move to main menu!\n");
game_state = MAIN_MENU;
}
break;
caseMAIN_MENU:
if (userInput == 'p') {
printf("let's play game!!\n");
game_state = PLAYING;
} else if (userInput == 'q') {
game_state = QUIT;
isGameOver = 1;
}
break;
casePLAYING:
if (userInput == 'u') {
printf("pause game!!\n");
game_state = PAUSE;
} else if (userInput == 'e') {
printf("game over! move to main menu!\n");
game_state = MAIN_MENU;
}
break;
case PAUSE:
if (userInput == 'r') {
printf("resume game!!\n");
game_state = PLAYING;
}
break;
}
}
// 화면디스플레이
void render() {
switch (game_state) {
case LOADING:
printf("loading state...\n");
break;
case MAIN_MENU:
printf("main menu state...\n");
break;
case PLAYING:
printf("playing state...\n");
break;
case PAUSE:
printf("pause state...\n");
break;
default:
printf("quit game! bye bye~\n");
break;
}
}
'게임개발로그' 카테고리의 다른 글
| 2D 맵 에디터 Tiled (0) | 2011.03.16 |
|---|---|
| 아이폰 2D 게임엔진 Cocos2D (1) | 2011.03.16 |
| 게임 개발 기초 (2) | 2011.02.14 |
| 게임 시스템 모듈 구성 (0) | 2011.02.13 |
| DirectX 와 OpenGL (0) | 2011.02.13 |
| 3차원의 기초 (0) | 2011.02.13 |