// ■花火のシミュレーショ // 右ボタンをクリックすると停止。左ボタンで開始。 // 右ボタンをクリックしながら画面キャプチャすることができる。 #include "myWin.h" #include "stdio.h" #include "stdlib.h" #include "time.h" #include "math.h" #define frand()((double)rand()/(RAND_MAX+1)) #define NUMS 30 #define HMAX 50 #define NSTEP 5 #define RED(X) ( X & 0xFF) #define GREEN(X) ((X>>8) & 0xFF) #define BLUE(X) ((X>>16) & 0xFF) #define PI 3.14159265358979 static HDC hBuff; static HBITMAP hBM; //ビットマップ表示用 typedef struct{ int R, G, B; double X, Y, VX, VY, m; } spark_data; spark_data sparks[NSTEP][NUMS][HMAX]; int step; double myu,G; double T, DT; int counter, tFact, fFact,KK; void drawLine(int X1, int Y1, int X2, int Y2, int W, int Color){//■線分 HPEN pen=CreatePen(PS_SOLID,W, Color) ; SelectObject(hBuff, pen) ; MoveToEx(hBuff,X1,Y1,NULL);LineTo(hBuff, X2, Y2); DeleteObject(pen); } void drawEllipse(int X1, int Y1, int X2, int Y2, int lColor, int Color){//■線分 HBRUSH brush=CreateSolidBrush(Color) ; SelectObject(hBuff, brush) ; HPEN pen=CreatePen(PS_SOLID,1, lColor) ; SelectObject(hBuff, pen) ; Ellipse(hBuff,X1,Y1,X2,Y2);DeleteObject(pen);DeleteObject(brush); } void drawRectangle(int X1, int Y1, int X2, int Y2, int lColor, int bColor){//■矩形 HBRUSH brush=CreateSolidBrush(bColor) ; SelectObject(hBuff, brush) ; HPEN pen=CreatePen(PS_SOLID,1, lColor) ; SelectObject(hBuff, pen) ; Rectangle(hBuff,X1,Y1,X2,Y2);DeleteObject(pen);DeleteObject(brush); } void drawPolygon(POINT poly[],int N, int lineW, int lColor, int bColor){//■多角形 HPEN pen=CreatePen(PS_SOLID, lineW, lColor) ; SelectObject(hBuff, pen) ; HBRUSH brush=CreateSolidBrush(bColor) ; SelectObject(hBuff, brush); Polygon(hBuff,poly,N); DeleteObject(brush) ; DeleteObject(pen); } void genSparks(){ if(step>=NSTEP) return; int ct[][3]={{0xFF, 0,0},{0, 0xFF, 0xFF}, {0xFF, 0xFF,0}, {0xFF,0, 0xFF}, {0,0, 0xFF}}; int MD = step % 5; double DA=2.0* PI/(double)NUMS, angle=(double)(MD*2); for(int i=0; i0;j--){ sparks[k][i][j].X=sparks[k][i][j-1].X; sparks[k][i][j].Y=sparks[k][i][j-1].Y; sparks[k][i][j].R =sparks[k][i][j-1].R-tFact;if(sparks[k][i][j].R<0)sparks[k][i][j].R=0; sparks[k][i][j].G =sparks[k][i][j-1].G-tFact;if(sparks[k][i][j].G<0)sparks[k][i][j].G=0; sparks[k][i][j].B =sparks[k][i][j-1].B-tFact;if(sparks[k][i][j].B<0)sparks[k][i][j].B=0; } ACY=G-sparks[k][i][0].VY*myu; ACX=-sparks[k][i][0].VX*myu; sparks[k][i][0].R-=fFact;if(sparks[k][i][0].R<0)sparks[k][i][0].R=0; sparks[k][i][0].G-=fFact;if(sparks[k][i][0].G<0)sparks[k][i][0].G=0; sparks[k][i][0].B-=fFact;if(sparks[k][i][0].B<0)sparks[k][i][0].B=0; sparks[k][i][0].VX += ACX*DT; sparks[k][i][0].VY += ACY*DT; sparks[k][i][0].X += sparks[k][i][0].VX*DT; sparks[k][i][0].Y += sparks[k][i][0].VY*DT; } } } } } void clearBitmap(){ //■ビットマップクリア SelectObject(hBuff,GetStockObject(NULL_PEN)); PatBlt(hBuff,0, 0,1000,400,BLACKNESS); } int setX(double X){ return (int)(X*10+225);} int setY(double Y){ return (int)(Y*10+195);} int drawFig(){ clearBitmap();int iflag=false; for(int k=0;k=0; j--){ if(sparks[k][i][j].R!=0 || sparks[k][i][j].G!=0 ||sparks[k][i][j].B!=0){ iflag=true; int X0=setX(sparks[k][i][j].X), Y0=setY(sparks[k][i][j].Y); int cl=RGB(sparks[k][i][j].R,sparks[k][i][j].G,sparks[k][i][j].B); drawEllipse(X0-1, Y0-1, X0+1, Y0+1,cl,cl); } } } } return iflag; } void procTimer(HWND hw, WPARAM wp,LPARAM lp){ //■タイマー処理 comEq();int iflag=drawFig(); if(!iflag){ initialize(); drawFig(); KillTimer(hw,1);} InvalidateRect(hw,NULL,TRUE); } void procLButtonDown(HWND hw, WPARAM wp,LPARAM lp){ //■左ボタン処理 initialize(); SetTimer(hw,1,50,NULL); //画面キャプチャするときはここをコメント*/ } void procRButtonDown(HWND hw, WPARAM wp,LPARAM lp){ //■左ボタン処理 KillTimer(hw,1); comEq();int iflag=drawFig(); if(!iflag){ initialize(); drawFig();} InvalidateRect(hw,NULL,TRUE); } void initBitmap(HWND hw){ //■ビットマップ初期設定 HDC hdc=GetDC(hw); hBM=CreateCompatibleBitmap(hdc,1000,400); hBuff=CreateCompatibleDC(hdc); SelectObject(hBuff,hBM); clearBitmap(); ReleaseDC(hw,hdc); } void procCreate(HWND hw, WPARAM wp,LPARAM lp){ //■Create時処理 SetWindowText(hw,TEXT("花火シミュレーション")); MoveWindow(hw,0,0,450,450,TRUE); initBitmap(hw); initialize(); drawFig();InvalidateRect(hw,NULL,TRUE); //procLButtonDown(hw,wp,lp); } void procPaint(HWND hw, WPARAM wp,LPARAM lp){ //■Paint時処理 PAINTSTRUCT ps; HDC hdc=BeginPaint(hw, &ps); BitBlt(hdc, 0,0,1000,400,hBuff,0,0,SRCCOPY); EndPaint(hw,&ps); } LRESULT CALLBACK WndProc(HWND hw, UINT msg, WPARAM wp,LPARAM lp){//■Window Procedure switch(msg){ case WM_DESTROY : PostQuitMessage(0) ; return 0; case WM_CREATE : procCreate(hw,wp,lp) ; return 0; case WM_PAINT : procPaint(hw,wp,lp) ; return 0; case WM_TIMER : procTimer(hw,wp,lp) ; return 0; case WM_LBUTTONDOWN : procLButtonDown(hw,wp,lp) ; break; case WM_RBUTTONDOWN : procRButtonDown(hw,wp,lp) ; break; } return DefWindowProc(hw,msg,wp,lp); }