지난 시간에 key event를 실습했습니다. 키를 누르면 뭔가 동작을 수행하는 명령을 내리면 재미 있을 것 같기에 GAME 원리인 캐릭 이동의 기초 동작을 실험하고자 합니다.
방향키는 a(왼), d(오), w(위), s(아래)로 지정 한 후 이 값을 기준으로 조정 원리를 체크 해보죠.
while(1){
if(kbhit()){
ch=getch();
switch(ch){
case 97:printf("왼쪽 %c\n",ch); break;
case 100:printf("오른쪽 %c\n",ch); break;
case 119:printf("위쪽 %c\n",ch); break;
case 115:printf("아래쪽 %c\n",ch); break;
}
}
}
[결과]
printf()문으로 해서 방향키를 누름 값을 출력하도록 테스트 했습니다.
이제 실제 동작을 코딩해야 합니다.
COORD pos={0,0};
특정 모양을 이동시키려면 콘솔창에 커서의 좌표 위치를 지정해야 합니다. pos로 좌표변수를 선언하면 키를 눌렀을 때 해당 좌표값을 증가 or 감소로 우치를 조정하게 하면 됩니다.
switch(ch){
case 97:pos.X-=2; break;
case 100:pos.X+=2; break;
case 119:pos.Y-=1; break;
case 115:pos.Y+=1; break;
}
이렇게 말이죠. 여기서 잠깐 좌표 커서를 무한으로 이동시켜면 문제가 생길 수 있습니다. 커서의 움직이는 범위를 지정해 주면 됩니다.
if(pos.X<0)pos.X=0; //폭 범위
else if(pos.X>20)pos.X=20;
if(pos.Y<0)pos.Y=0;//높이 범위
else if(pos.Y>10)pos.Y=10;
이제는 특수 모양을 배치할 위치를 지정 할까요.
void gotoxy(int x, int y){
COORD pos;
pos.X = x; pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
전달인수 x,y 값을 토대로 콘솔창에 커서가 특정 위치로 이동하게 됩니다. SetConsoleCursorPosition()함수는 지난 실습 시간에 다뤘던 내용이라 설명은 생략합니다.
이제 실제 특수 모양을 콘솔창에서 조정해 볼까요.
[전체소스]
#include
#include
#include
void gotoxy(int x, int y){
COORD pos;
pos.X = x; pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos);
}
int main(int argc, char *argv[]){
COORD pos={0,0};
int ch;
int i,j;
for(i=0;i<10;i++){ /맵세팅
for(j=0;j<10;j++){
printf("☆");
}
printf("\n");
}
gotoxy(pos.X,pos.Y); //game 시작지점
printf("★");
while(1){
if(kbhit()){
ch=getch();
/* switch(ch){
case 97:printf("왼쪽 %c\n",ch); break;
case 100:printf("오른쪽 %c\n",ch); break;
case 119:printf("위쪽 %c\n",ch); break;
case 115:printf("아래쪽 %c\n",ch); break;
}
*/
gotoxy(pos.X,pos.Y); //루프 이전 이동 좌표 초기화
printf(" ");
switch(ch){
case 97:pos.X-=2; break;
case 100:pos.X+=2; break;
case 119:pos.Y-=1; break;
case 115:pos.Y+=1; break;
}
if(pos.X<0)pos.X=0;
else if(pos.X>20)pos.X=20;
if(pos.Y<0)pos.Y=0;
else if(pos.Y>10)pos.Y=10;
gotoxy(pos.X,pos.Y); //새로운 이동 좌표 지정
printf("★");
}
}
return 0;
}
[결과]
맵 별표를 지우는 게임처럼 보일 거에요. 어떤 기능도 들어가 있지 않고 별표를 방향키로 지정한 알파벳을 누르면 해당 위치로 동하는 하면서 이전 별표들이 덮어 씌우기가 되어 지우는 모습으로 보였을 거에요. 별 다른 기능 없이 그냥 별표를 이동 시켠서 이전 위치는 공백문자를 넣고 새로운 위치는 별표를 넣음으로써 별표의 움직임을 만들어 냈네요. 그냥 게임 느낌만 살작 조정기 동작을 수행하는 코딩 실습을 하였습니다.