본문 바로가기
프로젝트

C언어를 이용해 만든 슈팅게임 #2(c언어 슈팅게임)-플레이어 움직임

by 핫동경 2022. 3. 12.
반응형

[C언어를 이용해서 슈팅게임을 만들어보자]

#1에서 배경색, 커서, 초기화면을 만들었다. 이번에는 사용자의 입력을 받아서 움직이는 게임 주인공을 만들어보겠다.

https://dongkyung.tistory.com/15

 

C언어를 이용해 만든 슈팅게임 #1

[C언어를 이용해서 슈팅게임을 만들어보자] [#1-1 헤더파일 선언하기] #include //기본 입출력을 위한 라이브러리 #include  //getch()함수를 쓰기위해 사용되는 라이브러리(키보드 입력값을 받을 때 사

dongkyung.tistory.com

 

 

#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를 통해 게임 맵 크기를 설정할 수 있다. 다음에는 스페이스바를 누를시 캐릭터에서 총알이 나가는 것을 구현해 보겠다.

 

반응형

댓글