// DOS 모드이다.
// 굳이 설명이 필요없이 컴파일 해보면 조각 하나가 분수나 공처럼 튀어 오르는 것을 볼수 있다.
// 스페이스바를 누르면 파티클이 튀는 것을 볼수 있다.
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
typedef struct _particle
{
float x; //파티클의 처음 위치
float y;
float x0; //파티클의 처음 위치
float y0;
float vx; //파티클의 현재 위치(가속중)
float vy;
int timeCount; //파티클이 진행 시간
int boundCount; //튄기는 횟수
bool life; //파티클 생존여부
}PARTICLE;
char bg[25][80];
PARTICLE particle;
void PrintfScreen(void);
void ClearScreen(void);
void GameMain(void);
void main()
{
particle.life = false;
for(;;) //무한루프 구현
{
ClearScreen();
GameMain();
PrintfScreen();
}
}
void PrintfScreen(void)
{
bg[24][79] = 0; //DOS 모드의 창크기를 80,25로 정의함
printf("%s", bg);
}
void ClearScreen(void)
{
system("cls"); //DOS창의 내용을 깨끗이 지움 이것을 쓰지 않으면 이전내용이 계속 누적된다.
for(int y=0; y< 25; y++)
{
for(int x=0; x< 80; x++)
{
bg[y][x] = ' '; //새로운 빈칸을 채움
}
}
}
void GameMain(void)
{
if(kbhit()) //아무키나 눌렀는지 확인
{
if(getch()==32) //스페이스 바가 눌렀는지 확인
{
if(particle.life != true)
{
particle.life = true; // 파티클 생성 시작
particle.x=0.0f;
particle.y=0.0f;
particle.x0=40.0f;
particle.y0= 0.0f;
particle.vx= (rand()%11 - 5) * 0.2f;
particle.vy= ((rand()%15) * 0.1f)+1.0f;
particle.timeCount=0;
particle.boundCount=0;
}
}
}
if(particle.life != true)
{
return;
}
particle.x = particle.x0 + particle.vx * particle.timeCount; //운동역학 공식 적용
particle.y = particle.y0 + particle.vy * particle.timeCount;
particle.y = particle.y - (0.1f * particle.timeCount * particle.timeCount);
int tx = int(particle.x);
int ty = int(particle.y);
// 파티클 중단을 위한 결정들
if( tx < 0)
particle.life = false;
else if( tx > 79)
particle.life = false;
if( ty < 0)
ty =0;
else if( ty > 24)
ty =24;
particle.timeCount++;
if( particle.y < 0.0f)
{
particle.vx = particle.vx / 2.0f;
particle.vy = particle.vy / 2.0f;
particle.timeCount =0;
particle.boundCount++;
particle.x0 = particle.x;
}
if( particle.boundCount >1)
{
particle.life = false;
}
if(particle.life == true)
{
bg[ 24-ty][tx] = '.'; //파티클의 생김새
}
}