[C++] 파티클 시스템으로 분수 만들기(DOS Ver.)

in #c7 years ago

//DOS 모드에서 분수를 만든 것이다.
//스페이스바를 누르면 끝난다.



#include <stdio.h> #include <conio.h> #include <stdlib.h>

typedef struct _SM
{
float x;
float y;
float x0;
float vx;
float vy;
float vy0;
int timeCount;
int boundCount;

_SM* next;

}SM; // 파티클을 노드로 구현하기 위해 구조체 선언

void main()
{
SM *head = NULL; //첫부분의 노드 생성 및 초기화
SM *tail = NULL; // 마지막 부분의 노드 생성 및 초기화

char bg[25][80];    

for(;;) // 무한 루프 
{
    system("cls"); //이전화면 지우기
    for(int y = 0; y < 25; y++)
    {
        for(int x = 0; x < 80; x++)
        {
            bg[y][x] = ' ';
        }
    }

    bg[24][79]=NULL;

    //생성영역
            SM *i = new SM; // 새로운 피티클 한개 생성 후 초기값들 입력
            i->x=0.0f;
            i->y=0.0f;
            i->x0=40.0f;
            
            i->vx=  (rand()%11 - 5) * 0.1f;
            i->vy=  ((rand()%22) * 0.1f);
            i->vy0 = i->vy;

            i->timeCount=0;
            i->boundCount=2;
            i->next = NULL;

            if( head == NULL) // 처음 생성된 파티클 노드가 없다면 현재 노드를 처음과 끝으로 세팅
            {
                head = i;
                tail = i;
            }
            else //처음 생성한 파티클 노드가 있다면 끝으로 세팅
            {
                tail->next = i;
                tail =i;
            }
    //업데이트
    SM* bm=NULL; // 새로운 파티클용 노드 생성
    for(SM* i = head; i != NULL; i = i->next)//노드의 처음부터 다음것까지 루프
    {
        i->x = i->x0 + i->vx * i->timeCount; //좌우 이동 등가속도
        i->y =         i->vy * i->timeCount;// 위아래 이동 등가속도
        i->y = i->y  - (0.098f * i->timeCount * i->timeCount)/2.0f; //중력 가속도 적용

        int tx = int(i->x);
        int ty = int(i->y);
        if( tx < 0)
            tx =0;
        else if( tx > 79)
            tx =79;
        if( ty < 0)
            ty =0;
        else if( ty > 24)
            ty =24;
        bg[ 24-ty][tx] = '.'; //현재값에서 24를 빼면 꼭대기가 0, 바닥이 24인 좌표로 변환된다.

        i->timeCount++;

        if (i->y < 0.0f) //파티클의 좌표가 바닥인 0보다 더 아래에 있다면 튕겨주기 위해 세팅한다.
        {
            i->vx = i->vx / 2.0f; //옆으로 이동 가속도를 반 줄인다.
            i->vy = i->vy / 2.0f; //위로 튕기는 가속도를 반 줄인다.
            i->timeCount =0;
            i->boundCount--;
            i->x0 = i->x;               
        }

        if( i->boundCount <=0) // 다 튕겼으면 없앤다.
        {
            //i를 삭제
            if( i == head )
            {
                if( i->next == NULL)
                {
                    head = NULL;
                    tail = NULL;
                }
                else
                {
                    head = head->next;
                }
            }
            else if( i == tail)
            {
                tail = bm;
                tail->next = NULL;
            }
            else
            {
                bm->next = i->next;
            }

            delete i;
            break;
        }

        bm = i;
    }
    // 지금까지 내용을 텍스트로 모두 도스창에 표현
    bg[24][79]=NULL;
    printf("%s", bg);

    if(kbhit()) //스페이스바 누르면 끝내기
    {
        if(getch()==32)
        {
            break;
        }
    }
}

}