본문 바로가기
프로젝트

c언어를 이용한 슈팅게임#7(c언어 슈팅게임)-아이템구현

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

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

#6에서 충돌구현을 했고 이번에는 아이템을 만들어보겠다.

2022.03.15 - [프로젝트] - c언어를 이용한 슈팅게임#6(c언어 슈팅게임)-충돌구현

 

c언어를 이용한 슈팅게임#6(c언어 슈팅게임)-충돌구현

[C언어를 이용해서 슈팅게임을 만들어보자] #5에서 적의 총알을 구현해보았고 이번에는 적의 총알과 플레이어의 총알의 충돌구현을 해보겠다. 2022.03.15 - [프로젝트] - c언어를 이용한 슈팅게임#5(c

dongkyung.tistory.com

 

 

 

[#7-1 어떤 방법으로 아이템 생성할 것인가]

이전 글들을 봐왔다면 몇초마다 함수를 실행할 것인가와 frame변수를 이용해서 함수 호출의 빈도를 조절해서 플레이어의 속도와 총알의 속도 적의 움직임 속도 등을 제어할 수 잇었다.

 

 

 

[#7-2 아이템 생성하기]

#define ITEM "<H>"
#define SPEEDITEM "<S>"
#define POWERITEM "<P>"
#define MISILEITEM "<M>"

int items[WIDTH][HEIGHT] = { 0 };
int items_count = 0;
int items_use = 35; //아이템 나타나는 시간(목숨 아이템)


int speeditems[WIDTH][HEIGHT] = { 0 };
int speeditems_count = 0;
int speeditems_use = 23; //아이템 나타나는 시간(스피드 아이템)

○ 2차원 배열을 이용해 아이템의 x,y좌표를 설정할 수 있다.

 

○ items_count로 아이템의 개수설정

 

○ item_use로 아이템이 몇초마다 생성되게 할 것인지 설정

 

 

 

[#7-3 아이템 생성 및 움직임 함수 구현하기]

void showitem() {
	int x, y;
	x = 7 + rand() % 40;
	y = 2;
	textcolor(YELLOW2, BLACK);
	gotoxy(x, y);
	printf(ITEM);
	items[x][y] = 1;
	items_count++;
	textcolor(YELLOW2, BLACK);
}


void moveitem() {
	int x, y, dx, dy, nx, ny;
	int newitems[WIDTH][HEIGHT] = { 0 };
	

	
	if (items_count == 0)
		return;
	for (x = 0; x < WIDTH-2; x++) {
		for (y = 0; y < HEIGHT; y++) {
			if (items[x][y]) {
				dx = rand() % 3 - 1; // -1 0 1
				dy = 1;
				nx = x + dx;
				ny = y + dy;
				if (nx == WIDTH-5) nx = WIDTH - 6;
				if (nx < 7) nx = 8;
				if (ny < 1) ny = 1;
				if (ny > HEIGHT - 1) {
					gotoxy(x, y);
					printf("   ");
					items_count--;
				}
				else {
					gotoxy(x, y);
					textcolor(YELLOW2, BLACK);
					printf("   "); // erase gold
					gotoxy(nx, ny);
					printf(ITEM);
					newitems[nx][ny] = 1; // 이동된 아이템의
					textcolor(YELLOW2, BLACK);
				}
			}
		}
	}
	memcpy(items, newitems, sizeof(newitems)); // 한번에 gold 위치를 조정한다.
}

○ 아이템의 초기위치 난수로 설정하기

 

○ 아이템이 맵 맨아래까지 내려갔다면 아이템 없애주기

 

○ 아니라면 아이템 지우고 새로운 위치에 그려주기

 

다른 아아템들도 위와같은 방법으로 설정하면 맵에 아이템이 나타나게된다.

 

 

 

 

 

 

 

 

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;
		if (items[newx][newy]) {
			heart++;
			items[newx][newy] = 0;
			items_count--;
		}
		
	}
}

○ 플레이어의 움직임 도중 플레이어의 움직임이 아이템의 좌표와 같다면 속도조절 변수를 조절해주어서

   속도를 조절해준다. 실제 아이템을 먹은 것 같이 효과를 낼 수 있다.

 

 

 

 

반응형

댓글