520馬上就要到了,學完c語言想要自己嘗試給女朋友一個驚喜,屬于程式員的浪漫,今天三玖就帶你手把手打出煙花代碼
學完c的小伙伴對于easyx有不懂的地方可以進入easyx的官網下載檔案,里面對它的各種函式都進行了解釋,
先準備兩張圖片


1.首先下載easyx庫,在我們學習的初期,我們身為初學者要想嘗試一些小專案,easyx是一個不錯的選擇,
2.安裝完easyx后,我們打開自己的編譯器,創建一個cpp的小專案,準備開始寫代碼,
3.首先將我們需要用到的頭檔案宣告,
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<math.h>
#include<easyx.h>
#include<graphics.h>//創建一個視窗及其進行一系列的操作
#define NUM 13//最多13個煙花
4.`在主函式內創建一個視窗
initgraph(1200, 800);
開始定義一個煙花的結構體
思考煙花有何屬性
(1)坐標表示其位置
(2)存在最高點
(3)發射狀態
(4)出現及消失時間等
struct Jet
{
int x;
int y;
int hx;
int hy;
bool shoot;
DWORD t1, t2, dt;
MAGE img[2];
byte n : 1;
}Jet[NUM];//煙花炸彈陣列
5.初始化煙花
(1)煙花的出現時間不同;
(2)煙花的上升速度也不同等
void Init(int i)
{
Jet[i].t1 = GetTickCount();
Jet[i].dt = rand() % 10 + 1;//1-10ms
Jet[i].n = 0;
Jet[i].shoot = false;
}
6.將圖片加載到視窗中
(1)首先將圖片制定為一個檔案夾,復制進入你的專案檔案夾中去確保能夠訪問到圖片
(2)`
void Loadimg()
{
IMAGE image;//定義圖片
loadimage(&image, "./煙花/shoot.jpg", 200, 50);
SetWorkingImage(&image);
int n;
for (int i = 0; i < NUM; i++)
{
n = rand() % 5;//0-4
getimage(&Jet[i].img[0],n*20,0,20,50);
getimage(&Jet[i].img[1], (n+5)*20,0,20,50);
}
SetWorkingImage(NULL);
IMAGE Fireimg;
IMAGE img;
loadimage(&Fireimg, "./煙花/shoot2.jpg",3120,240);
for (int i = 0; i < NUM; i++)
{
SetWorkingImage(&Fireimg);
getimage(&img, i * 240, 0, 240, 240);
SetWorkingImage(&img);
for (int a = 0; a < 240; a++)
{
for (int b = 0; b < 240; b++)
{
Fire[i].xy[a][b] = getpixel(a, b);
}
}
}
SetWorkingImage(NULL);
}
7.煙花炸彈的定義及初始化同上
struct FIRE
{
int r;
int max_r;
int x, y;//煙花爆炸點相對于視窗初始的坐標
int cenx, ceny;//煙花中心相對于煙花圖片的坐標
int width, height;//圖片高度及寬度
int xy[240][240];//像素
bool show;//是否開始顯示
bool draw;//是否開始渲染
DWORD t1, t2, dt;
}Fire[NUM];
void Init(int i)
{
Fire[i].cenx=120;
Fire[i].ceny=120;
Fire[i].max_r = 120;
Fire[i].width=240;
Fire[i].height=240;
Fire[i].dt=5;
Fire[i].r=0;
Fire[i].t1=GetTickCount();
Fire[i].show=false;
}
8.開始考慮如何選擇煙花
(1)很明顯煙花的出現時間不同,存在時間間隔;
(2)在圖片中有13張煙花,所以我們需要考慮隨機取(rand);
(3)我們在開始時定義了視窗的大小,隨機取必須考慮到取到視窗外的情況;
(4)下面我們考慮煙花是否發射時,在這必須保證它可以開始發射;
void Choice(DWORD &t1)
{
DWORD t2 = GetTickCount();
if (t2 - t1 > 100)//時間間隔
{
int n = rand() % NUM;//隨機
if (Jet[n].shoot == false&&Fire[n].show==false)
{
Jet[n].x = rand() % 1180;
Jet[n].y = rand() % 100 + 600;//
Jet[n].hx = Jet[n].x;
Jet[n].hy =rand()%400;
Jet[n].shoot = true;
putimage(Jet[n].x, Jet[n].y, &Jet[n].img[Jet[n].n], SRCINVERT);
}
t1 = t2;
}
}
9.開始考慮發射狀態的煙花
(1)首先思考煙花的狀態是否滿足發射;
(2)發射后到達最高點時該怎么處理;
(3)開始承接煙花爆炸的開始;
void Shoot()
{
for (int i = 0; i < NUM; i++)
{
//速度 //是否發射
Jet[i].t2 = GetTickCount();
if (Jet[i].t2 - Jet[i].t1 > Jet[i].dt && Jet[i].shoot == true)
{
putimage(Jet[i].x, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINVERT);
if (Jet[i].y >= Jet[i].hy)
{
Jet[i].y -= 5;//上升
Jet[i].n++;
}
putimage(Jet[i].x, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINVERT);
if (Jet[i].y <= Jet[i].hy)//到達最高點
{
putimage(Jet[i].x, Jet[i].y, &Jet[i].img[Jet[i].n], SRCINVERT);
Fire[i].x=Jet[i].x;
Fire[i].y = Jet[i].y;//傳遞給煙花的最高點
Fire[i].show = true;
Jet[i].shoot = false;
}
Jet[i].t1 = Jet[i].t2;
}
}
}
10.煙花到達最高點煙花炸彈開始準備
(1)首先考慮爆炸的速度是否相同;
(2)煙花到達最高點煙花及煙花炸彈的半徑的判斷及處理;
(3)判斷是否開始渲染像素
(4)利用位欄位開始將圖片渲染;
void SHOWFIRE(DWORD* pmem)
{
int drt[16] = { 5,5,5,5,5,8,25,25,25,25,55,55,65,65,65,70 };//爆炸速度
for (int i = 0; i < NUM; i++)
{
Fire[i].t2 = GetTickCount();
if (Fire[i].t2 - Fire[i].t1 >= Fire[i].dt && Fire[i].show == true)
{
if (Fire[i].r < Fire[i].max_r)
{
Fire[i].r++;
Fire[i].dt = drt[Fire[i].r / 10];
Fire[i].draw = true;
}
if (Fire[i].r >= Fire[i].max_r - 1)//爆炸到最大半徑
{
Fire[i].draw = false;
Init(i);
}
Fire[i].t1 = Fire[i].t2;
}
if (Fire[i].draw)
{
for (double a = 0; a <= 6.28; a += 0.01)
{
int x1 = Fire[i].cenx+Fire[i].r * cos(a);
int y1 = Fire[i].ceny+ Fire[i].r * sin(a);
if (x1 > 0 && x1 < 240 && y1>0 && y1 < 240)
{
int b = Fire[i].xy[x1][y1] & 0xff;
int g= Fire[i].xy[x1][y1] >>8 & 0xff;
int r= Fire[i].xy[x1][y1]>>16;
int x2 = Fire[i].x + Fire[i].r * cos(a);
int y2 = Fire[i].y + Fire[i].r * sin(a);
if (r > 0x20 && g > 0x20 && b > 0x20 && x2 > 0 && x2 < 1200 && y2>0 && y2 < 800)
{
pmem[y2 * 1200 + x2] = BGR(Fire[i].xy[x1][y1]);
}
}
}
Fire[i].draw = false;
}
}
}
11.主函式內函式呼叫
int main(void)
{
initgraph(1200, 800);
srand(time(NULL));
DWORD t1 = GetTickCount();
DWORD* pmem = GetImageBuffer();
Loadimg();
for (int i = 0; i < NUM; i++)
{
Init(i);
}
BeginBatchDraw();
while (1)
{
Choice( t1);
Shoot();
SHOWFIRE(pmem);
FlushBatchDraw();
}
getchar();
return 0;
}
12.最后新手發表,不喜勿噴,(此代碼均為自己查詢資料,搜集視頻,純手打)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/282712.html
標籤:其他
上一篇:Time.deltaTime
下一篇:C++ 物件 & 類
