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

in #c6 years ago

<p dir="auto">//DOS 모드에서 분수를 만든 것이다.<br /> //스페이스바를 누르면 끝난다. <p dir="auto"><br /><br /><span><a href="/trending/include">#include <stdio.h><span> <a href="/trending/include"> #include <conio.h><span> <a href="/trending/include"> #include <stdlib.h> <p dir="auto">typedef struct _SM<br /> {<br /> float x;<br /> float y;<br /> float x0;<br /> float vx;<br /> float vy;<br /> float vy0;<br /> int timeCount;<br /> int boundCount; <pre><code>_SM* next; <p dir="auto">}SM; // 파티클을 노드로 구현하기 위해 구조체 선언 <p dir="auto">void main()<br /> {<br /> SM *head = NULL; //첫부분의 노드 생성 및 초기화<br /> SM *tail = NULL; // 마지막 부분의 노드 생성 및 초기화 <pre><code>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; } } } <p dir="auto">}