[C++] 간단한 파티클 시스템 만들기(DOS Ver.)

in cpp •  7 years ago 

// 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] = '.'; //파티클의 생김새
}

}

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!