[C언어를 이용해서 슈팅게임을 만들어보자]
#1에서 배경색, 커서, 초기화면을 만들었다. 이번에는 사용자의 입력을 받아서 움직이는 게임 주인공을 만들어보겠다.
https://dongkyung.tistory.com/15
#1에서 초기화면까지 만들었다.
초기화면에는 1을 누르면 게임이 시작되고 2를 누르면 게임에 대한 설명을 볼 수 있고 3을 누르면 게임이 종료된다
이 기능을 구현하는 StartMenu() 함수를 구현해보겠다.
[#2-1 StartMenu()함수 구현하기]
void StartMenu(){
int a;
while(1){
//
gotoxy문을 이용한 초기화면 노가다
//
printf("번호를 입력하시오:");
scanf_s("%d", &a);
if (a == 1) {
gamestart(); //게임시작함수
break;
}
else if (a == 2) {
help(); //도움말 함수
}
else if (a == 3) {
printf("종료");
break;
}
}
}
[#2-2 help()함수 구현하기]
void help() {
system("cls"); //화면 지우기
//
gotoxy()함수를 활용해 게임 설명하기
//
system("pause"); //help함수 종료
}
[#2-3 gamestart()함수에서 키보드 입력값을 받는 부분 구현]
구현에 앞서 전역변수와 몇가지 #define을 해주려한다.
#define SPECIAL1 0XE0
#define SPECIAL2 0x00
#define SPACE 0x20
#define UP 0x48
#define DOWN 0x50
#define LEFT 0x4b
#define RIGHT 0x4d
int Delay =10 int frame_count = 0 // game 진행 frame count 로 속도 조절용으로 사용된다.int p1_frame_sync = 4; //플레이어의 이동속도
[다 전역변수임]
방향키는 기본키가 아니라 확장 키이기 때문에 ch가 0X00 이나 0XE0 값을 먼저 발생시킨 뒤 입력된 키 값을 생성한다위의 UP, DOWN LEFT RIGHT 들이 그 키 값들이라고 생각하자키가 한번 입력되면 캐릭터가 생성되고 그후 계속 누르지 않아도 움직이도록 else문을 통해 playermove함수에서 인자를 준 모습을 확인할 수 있다.
frame_count는 계속 ++문이 있기 때문에 while문 안에서 계속 값은 증가한다. 플레이어의 속도를 조절하는 방법은playermove함수를 얼마나 자주 호출할 것인가 에서 결정된다. if(frace_count와 p1_Frame을 이용)playermove이런 방식으로 속도조절을 할 수 있다. 저 두 변수를 사용해 어덯게 속도조절을 할 것인지는 생각해보길 바란다
// 우선 게임을 진행이 되면 우리는 계속 키보드를 활용할 것이니 while문을 통해 구현해보자
void gamestart() {
unsigned char ch;
init_game()
while (1) {
if (kbhit() == 1) {
ch = getch();
if (ch == SPECIAL1 || ch == SPECIAL2) {
ch = getch();
switch (ch) {
case UP: case DOWN: case LEFT: case RIGHT:
playermove(ch);
if (frame_count % p1_frame_sync == 0)
playermove(0);
break;
default:
if (frame_count % p1_frame_sync == 0)
playermove(0);
}
}
}
else {
//속도조절 함수
}
Sleep(Delay); // Delay 값을 줄이고
frame_count++;// frame_count 값으로 속도 조절을 한다.
}
}
void init_game() {
//나중에 게임이 종료되고 게임이 다시 시작될 때
변수 값들을 초기화 해주는 영역
//
system("cls"); //게임이 시작되면 초기화면을 사라지게함
removeCursor();
}
[#2-4 playermove()함수 구현하기]
#define WIDTH 62
#define HEIGHT 48
#define UX 30 //시작 유저의 x좌표
#define UY 45 //시작 유저의 y좌표
int called=0
int oldx = UX, oldy = UY; // 플레이어의 old 좌표
int newx = UX, newy = UY; //플레이어의 new 좌표
int keep_moving = 1; //1:계속이동
[다 전역변수임]
WIDTH 와 HEIGHT는 게임 맵의 넓이라고 생각하면 된다.
플레이어가 맵 끝까지 이동하였을 때 벽에 튕겨 반대로 가는 구현을 하였다.
void playermove(unsigned char ch) {
int move_flag = 0;
static unsigned char last_ch = 0;
if (called == 0) {
removeCursor();
playerdraw(oldx, oldy);
called = 1;
}
if (keep_moving && ch == 0)
ch = last_ch;
last_ch = ch;
switch (ch) {
case UP:
if (oldy > 25)
newy = oldy - 1;
move_flag = 1;
break;
case DOWN:
if (oldy < HEIGHT - 3)
newy = oldy + 1;
move_flag = 1;
break;
case LEFT:
if (oldx > 2)
newx = oldx - 1;
move_flag = 1;
break;
case RIGHT:
if (oldx < WIDTH - 6)
newx = oldx + 1;
move_flag = 1;
break;
}
if (move_flag) {
playererase(oldx, oldy);
playerdraw(newx, newy); // 새로운 위치에서 플레이어 표시
oldx = newx; // 마지막 위치를 기억한다.
oldy = newy;
}
}
[#2-5 playerdraw, playererase 함수 구현하기]
캐릭터를 지우고 그리는 방식으로 구현하였다. 위 playermove함수에서 move_flag라면 playererase()함수와
playerdraw()함수가 동시에 호출되는 것을 볼 수 있다. 지우고 그리고 지우고 그리고를 반복해서 캐릭터가
마치 움직이는 것 처럼 보이게된다.
void playerdraw(int x, int y) {
textcolor(GREEN1, BLACK);
gotoxy(x, y);
printf("<=★=>");
}
void playererase(int x, int y) {
gotoxy(x, y);
printf(" ");
}
[마무리]
여기까지 하였다면 방향키를 움직이면 캐릭터가 움직이는 것을 확인할 수 있을 것이다.
WIDTH 와 HEIGHT를 통해 게임 맵 크기를 설정할 수 있다. 다음에는 스페이스바를 누를시 캐릭터에서 총알이 나가는 것을 구현해 보겠다.
'프로젝트' 카테고리의 다른 글
c언어를 이용한 슈팅게임#6(c언어 슈팅게임)-충돌구현 (0) | 2022.03.15 |
---|---|
c언어를 이용한 슈팅게임#5(c언어 슈팅게임)-적 총알구현 (0) | 2022.03.15 |
c언어를 이용한 슈팅게임#4(c언어 슈팅게임)-적 구현 (0) | 2022.03.14 |
c언어를 이용한 슈팅게임 #3(c언어 슈팅게임)-총알구현 (0) | 2022.03.13 |
C언어를 이용해 만든 슈팅게임 #1(c언어 슈팅게임) (0) | 2022.03.11 |
댓글