一个关于C语言程序指针的用法(其中之一·)
這是一個c語言程序,在網上也能找到相似甚至幾乎相同的程序,但是就是因為很輕松就找到了,會有各種奇怪的錯誤,但大部分都是編譯器(32位(x86)和64位)的問題,還有的就是一些語法的問題,列如scnaf換成scanf_s,字符集的問題,沒有返回值等等,都可以在網上查到相關資料,而我找到的這個程序出現了另外一種錯誤,指針的問題,看代碼:
/********************************************************
*?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?*
*?? ?程序名稱:祝福煙花,祝福朋友?? ??? ??? ??? ??? ??? ?*
*?? ?編譯環境:VC++6.0 && easyx(立冬版)?? ??? ??? ??? ??? ?*
*?? ?作者相關:yy滺滺__<837943056@qq.com>?? ??? ??? ??? ?*
*?? ?最后修改:2012.11.22?? ??? ??? ??? ??? ??? ??? ??? ?*
*?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?*
********************************************************/
/* 【自學去】網站收集 http://www.zixue7.com */
#include <time.h>
#include <stdio.h>
#include <math.h>
#include <graphics.h>
#include <conio.h>
#include <windows.h>
#include <Mmsystem.h>?? ??? ?// 使用該計時器必須包含的文件
#pragma comment ( lib, "Winmm.lib" )
/***** 宏定義區 ******/
#define NUM?? ??? ?13?? ??? ??? ?// 煙花種類數量宏定義
/***** 結構定義區 **********/
// 煙花結構
struct FIRE
{
?? ?int r;?? ??? ??? ??? ??? ?// 當前爆炸半徑
?? ?int max_r;?? ??? ??? ??? ?// 爆炸中心距離邊緣最大半徑
?? ?int x, y;?? ??? ??? ??? ?// 爆炸中心在窗口的坐標
?? ?int cen_x, cen_y;?? ??? ?// 爆炸中心相對圖片左上角的坐標
?? ?int width, height;?? ??? ?// 圖片的寬高
?? ?int xy[240][240];?? ??? ?// 儲存圖片像素點
?? ?bool show;?? ??? ??? ??? ?// 是否綻放
?? ?bool draw;?? ??? ??? ??? ?// 開始輸出像素點
?? ?DWORD t1, t2, dt;?? ??? ?// 綻放速度
}Fire[NUM];
// 煙花彈結構
struct JET
{
?? ?int x, y;?? ??? ??? ??? ?// 噴射點坐標
?? ?int hx, hy;?? ??? ??? ??? ?// 最高點坐標------將賦值給 FIRE 里面的 x, y
?? ?int height;?? ??? ??? ??? ?// 煙花高度
?? ?bool shoot;?? ??? ??? ??? ?// 是否可以發射
?? ?DWORD t1, t2, dt;?? ??? ?// 發射速度
?? ?IMAGE* img[2];?? ??? ??? ?// 儲存花彈一亮一暗圖片?*************這里*****************
?? ?byte n : 1;?? ??? ??? ??? ?// 圖片下標
}Jet[NUM];
// happy birthday 藝術字結構
struct HAPPY?? ??? ??? ??? ?// 儲存 Happy Birthday 藝術字圖片
{
?? ?int x, y;?? ??? ??? ??? ?// 每個字的圖片的左上角坐標
?? ?IMAGE* img;?? ??? ??? ??? ?// 儲存單個字圖片??*************這里*****************
?? ?static int num;?? ??? ??? ?// 字母序號
}Happy[NUM];
int HAPPY::num = 0;
// For.2012の夭女 結構
struct WISH?? ??? ??? ??? ??? ?// 滾動祝福圖片結構
{
?? ?int x, y;?? ??? ??? ??? ?// 圖片左上角坐標
?? ?DWORD t1, t2, dt;?? ??? ?// 圖片運動時間間隔
?? ?IMAGE* img;?? ??? ??? ??? ?// 儲存圖片? ? ??*************這里*****************
?? ?int dxy;?? ??? ??? ??? ?// 每次的移動量
?? ?byte dir : 1;?? ??? ??? ?// 限制兩個滾動方向
}Wish;
/**** 函數申明區 ****/
void Init(int);?? ??? ?// 初始化煙花
void Load();?? ??? ?// 加載煙花圖片
void Shoot();?? ??? ?// 發射煙花
void Chose(DWORD&);?? ??? ?// 篩選煙花
void Wishing();?? ??? ?// 滾動祝福
void Style(DWORD&);?? ??? ?// 發射樣式
void Show(DWORD*);?? ??? ?// 綻放煙花
// 主函數
int main()
{
?? ?initgraph(1200, 800);
?? ?srand(time(0));
?? ?// 播放背景音樂
?? ?mciSendString("open ./fire/bk.mp3 alias bk", 0, 0, 0);
?? ?mciSendString("play bk repeat", 0, 0, 0);
?? ?setfillstyle(0, 0, 0);//實際參數和形式參數應該相同!!!
?? ?setfont(36, 0, "楷體");
?? ?setcolor(YELLOW);
?? ?outtextxy(370, 100, "yy滺滺__出廠 .... ^_^");
?? ?DWORD t1 = timeGetTime();?? ??? ?// 篩選煙花計時
?? ?DWORD st1 = timeGetTime();?? ??? ?// 播放花樣計時
?? ?DWORD* pMem = GetImageBuffer();?? ??? ?// 獲取窗口顯存指針
?? ?for (int i = 0; i < NUM; i++)?? ??? ?// 初始化煙花
?? ?{
?? ??? ?Init(i);
?? ?}
?? ?Load();?? ??? ??? ??? ??? ??? ??? ??? ?// 將煙花圖片信息加載進相應結構中
?? ?BeginBatchDraw();?? ??? ??? ??? ??? ?// 開始批量繪圖
?? ?while (!_kbhit())
?? ?{
?? ??? ?Sleep(10);
?? ??? ?// 隨機選擇 4000 個像素點擦除
?? ??? ?for (int clr = 0; clr < 1000; clr++)
?? ??? ?{
?? ??? ??? ?for (int j = 0; j < 2; j++)
?? ??? ??? ?{
?? ??? ??? ??? ?int px1 = rand() % 1200;
?? ??? ??? ??? ?int py1 = rand() % 800;
?? ??? ??? ??? ?if (py1 < 799)?? ??? ??? ??? ?// 防止越界
?? ??? ??? ??? ??? ?pMem[py1 * 1200 + px1] = pMem[py1 * 1200 + px1 + 1] = BLACK;?? ?// 對顯存賦值擦出像素點
?? ??? ??? ?}
?? ??? ?}
?? ??? ?Chose(t1);?? ??? ?// 篩選煙花
?? ??? ?Shoot();?? ??? ?// 發射煙花
?? ??? ?Show(pMem);?? ??? ?// 綻放煙花
?? ??? ?Wishing();?? ??? ?// 滾動字符
?? ??? ?Style(st1);?? ??? ?// 花樣發射
?? ??? ?FlushBatchDraw();?? ??? ?// 顯示前面的所有繪圖操作
?? ?}
}
// 初始化煙花參數
void Init(int i)
{
?? ?// 分別為:煙花中心到圖片邊緣的最遠距離、煙花中心到圖片左上角的距離 (x、y) 兩個分量
?? ?int r[13] = { 120, 120, 155, 123, 130, 147, 138, 138, 130, 135, 140, 132, 155 };
?? ?int x[13] = { 120, 120, 110, 117, 110, 93, ?102, 102, 110, 105, 100, 108, 110 };
?? ?int y[13] = { 120, 120, 85, ?118, 120, 103, 105, 110, 110, 120, 120, 104, 85 };
?? ?/**** 初始化煙花 *****/
?? ?Fire[i].x = 0;?? ??? ??? ??? ?// 煙花中心坐標
?? ?Fire[i].y = 0;
?? ?Fire[i].width = 240;?? ??? ??? ??? ?// 圖片寬
?? ?Fire[i].height = 240;?? ??? ??? ??? ?// 圖片高
?? ?Fire[i].max_r = r[i];?? ??? ??? ??? ?// 最大半徑
?? ?Fire[i].cen_x = x[i];?? ??? ??? ??? ?// 中心距左上角距離
?? ?Fire[i].cen_y = y[i];
?? ?Fire[i].show = false;?? ??? ??? ?// 是否綻放
?? ?Fire[i].dt = 5;?? ??? ??? ??? ?// 綻放時間間隔
?? ?Fire[i].t1 = timeGetTime();
?? ?Fire[i].r = 0;?? ??? ??? ??? ?// 從 0 開始綻放
?? ?/**** 初始化煙花彈 *****/
?? ?Jet[i].x = 240;?? ??? ??? ??? ?// 煙花彈左上角坐標
?? ?Jet[i].y = 240;
?? ?Jet[i].hx = 240;?? ??? ??? ??? ?// 煙花彈發射最高點坐標
?? ?Jet[i].hy = 240;
?? ?Jet[i].height = 0;?? ??? ??? ??? ?// 發射高度
?? ?Jet[i].t1 = timeGetTime();
?? ?Jet[i].dt = rand() % 10;?? ??? ?// 發射速度時間間隔
?? ?Jet[i].n = 0;?? ??? ??? ??? ?// 煙花彈閃爍圖片下標
?? ?Jet[i].shoot = false;?? ??? ??? ?// 是否發射
}
// 加載圖片
void Load()
{
?? ?/**** 儲存煙花的像素點顏色 ****/
?? ?IMAGE fm, gm;
?? ?loadimage(&fm, "E:/C++/0018/ConsoleApplication1/fire/flower.jpg", 3120, 240);
?? ?for (int i = 0; i < 13; i++)
?? ?{
?? ??? ?SetWorkingImage(&fm);
?? ??? ?getimage(&gm, i * 240, 0, 240, 240);
?? ??? ?SetWorkingImage(&gm);
?? ??? ?for (int a = 0; a < 240; a++)
?? ??? ??? ?for (int b = 0; b < 240; b++)
?? ??? ??? ??? ?Fire[i].xy[a][b] = getpixel(a, b);
?? ?}
?? ?/**** 加載煙花彈 ************/
?? ?IMAGE sm;
?? ?loadimage(&sm, ".E:\\C++\\0018\\ConsoleApplication1\\fire\\shoot.jpg", 200, 70);
?? ?for (int i = 0; i < 13; i++)
?? ?{
?? ??? ?SetWorkingImage(&sm);
?? ??? ?int n = rand() % 5;
?? ??? ?
?? ??? ?getimage(Jet[i].img[0], n * 20, 0, 20, 50);?? ??? ??? ?// 暗
?? ??? ?getimage(Jet[i].img[1], (n + 5) * 20, 0, 20, 50);?? ?// 亮
?? ?}
?? ?/***** 加載 Happy Birthday 圖片 ********/
?? ?IMAGE hm;
?? ?loadimage(&hm, ".E:/C++/0018/ConsoleApplication1/fire/happy.jpg", 689, 115);
?? ?SetWorkingImage(&hm);
?? ?for (int i = 0; i < 13; i++)
?? ?{
?? ??? ?Happy[i].x = i * 90;
?? ??? ?Happy[i].y = rand() % 100 + 500;
?? ??? ?getimage(Happy[i].img, i * 53, 0, 53, 115);
?? ?}
?? ?/***** 加載 For.2012の夭女 圖片 *********/
?? ?Wish.x = 0;
?? ?Wish.y = 100;
?? ?Wish.t1 = timeGetTime();
?? ?Wish.dt = 46;
?? ?Wish.dir = 0;
?? ?Wish.dxy = rand() % 8 + 1;
?? ?loadimage(Wish.img, ".E:/C++/0018/ConsoleApplication1/fire/yaojing.jpg");
?? ?putimage(Wish.x, Wish.y, Wish.img, SRCINVERT);
?? ?SetWorkingImage();?? ??? ?// 設置回繪圖窗口
}
// 在一定范圍內篩選可發射的煙花,并初始化發射參數,輸出煙花彈到屏幕,播放聲音
void Chose(DWORD& t1)
{
?? ?DWORD t2 = timeGetTime();
?? ?if (t2 - t1 > 100)
?? ?{
?? ??? ?int n = rand() % 20;
?? ??? ?if (n < 13 && Jet[n].shoot == false && Fire[n].show == false)
?? ??? ?{
?? ??? ??? ?/**** 重置煙花彈,預備發射 *****/
?? ??? ??? ?Jet[n].x = rand() % 1200;
?? ??? ??? ?Jet[n].y = rand() % 100 + 600;
?? ??? ??? ?Jet[n].hx = Jet[n].x;
?? ??? ??? ?Jet[n].hy = rand() % 400;
?? ??? ??? ?Jet[n].height = Jet[n].y - Jet[n].hy;
?? ??? ??? ?Jet[n].shoot = true;
?? ??? ??? ?putimage(Jet[n].x, Jet[n].y, Jet[n].img[Jet[n].n], SRCINVERT);
?? ??? ??? ?/**** 播放每個煙花彈的聲音 *****/
?? ??? ??? ?char c1[50], c2[30], c3[30];
?? ??? ??? ?sprintf_s(c1, "open ./fire/shoot.mp3 alias s%d", n);
?? ??? ??? ?sprintf_s(c2, "play s%d", n);
?? ??? ??? ?sprintf_s(c3, "close n%d", n);
?? ??? ??? ?mciSendString(c3, 0, 0, 0);
?? ??? ??? ?mciSendString(c1, 0, 0, 0);
?? ??? ??? ?mciSendString(c2, 0, 0, 0);
?? ??? ?}
?? ??? ?t1 = t2;
?? ?}
}
// 掃描煙花彈并發射
void Shoot()
{
?? ?for (int i = 0; i < 13; i++)
?? ?{
?? ??? ?Jet[i].t2 = timeGetTime();
?? ??? ?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].n++;
?? ??? ??? ??? ?Jet[i].y -= 5;
?? ??? ??? ?}
?? ??? ??? ?putimage(Jet[i].x, Jet[i].y, Jet[i].img[Jet[i].n], SRCINVERT);
?? ??? ??? ?/**** 上升到高度的 3 / 4,減速 *****/
?? ??? ??? ?if ((Jet[i].y - Jet[i].hy) * 4 < Jet[i].height)
?? ??? ??? ??? ?Jet[i].dt = rand() % 4 + 10;
?? ??? ??? ?/**** 上升到最大高度 *****/
?? ??? ??? ?if (Jet[i].y <= Jet[i].hy)
?? ??? ??? ?{
?? ??? ??? ??? ?// 播放爆炸聲
?? ??? ??? ??? ?char c1[50], c2[30], c3[30];
?? ??? ??? ??? ?sprintf_s(c1, "open ./fire/bomb.wav alias n%d", i);
?? ??? ??? ??? ?sprintf_s(c2, "play n%d", i);
?? ??? ??? ??? ?sprintf_s(c3, "close s%d", i);
?? ??? ??? ??? ?mciSendString(c3, 0, 0, 0);
?? ??? ??? ??? ?mciSendString(c1, 0, 0, 0);
?? ??? ??? ??? ?mciSendString(c2, 0, 0, 0);
?? ??? ??? ??? ?putimage(Jet[i].x, Jet[i].y, Jet[i].img[Jet[i].n], SRCINVERT);?? ?// 擦掉煙花彈
?? ??? ??? ??? ?Fire[i].x = Jet[i].hx + 10;?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// 在煙花彈中間爆炸
?? ??? ??? ??? ?Fire[i].y = Jet[i].hy;?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// 在最高點綻放
?? ??? ??? ??? ?Fire[i].show = true;?? ??? ??? ??? ??? ?// 開始綻放
?? ??? ??? ??? ?Jet[i].shoot = false;?? ??? ??? ??? ??? ?// 停止發射
?? ??? ??? ??? ?// 顯示對應字母
?? ??? ??? ??? ?putimage(Happy[HAPPY::num].x, Happy[HAPPY::num].y, Happy[HAPPY::num].img, SRCINVERT);
?? ??? ??? ??? ?HAPPY::num++;
?? ??? ??? ??? ?if (HAPPY::num > 12)
?? ??? ??? ??? ??? ?HAPPY::num = 0;
?? ??? ??? ?}
?? ??? ??? ?Jet[i].t1 = Jet[i].t2;
?? ??? ?}
?? ?}
}
// 制作水平、豎直移動的圖片
void Wishing()
{
?? ?Wish.t2 = timeGetTime();
?? ?if (Wish.t2 - Wish.t1 > Wish.dt)
?? ?{
?? ??? ?/**** 圖片的移動 *****/
?? ??? ?putimage(Wish.x, Wish.y, Wish.img, SRCINVERT);
?? ??? ?if (Wish.dir == 0)
?? ??? ??? ?Wish.x += Wish.dxy;
?? ??? ?else
?? ??? ??? ?Wish.y -= Wish.dxy;
?? ??? ?putimage(Wish.x, Wish.y, Wish.img, SRCINVERT);
?? ??? ?/**** 圖片出界后 *****/
?? ??? ?if (Wish.x > 1200 || Wish.y < 0)
?? ??? ?{
?? ??? ??? ?Wish.dir = rand() % 2;?? ??? ??? ?// 獲取隨機方向
?? ??? ??? ?if (Wish.dir == 0)?? ??? ??? ?// 如果左右運動
?? ??? ??? ?{
?? ??? ??? ??? ?Wish.y = rand() % 700;?? ??? ?// 初始位置
?? ??? ??? ??? ?Wish.x = -490;
?? ??? ??? ??? ?Wish.dxy = rand() % 7 + 1;?? ?// 隨機運動分量
?? ??? ??? ?}
?? ??? ??? ?else?? ??? ??? ??? ??? ??? ??? ?// 上下運動
?? ??? ??? ?{
?? ??? ??? ??? ?Wish.dxy = rand() % 7 + 1;
?? ??? ??? ??? ?Wish.x = rand() % 700;
?? ??? ??? ??? ?Wish.y = 800;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?Wish.t1 = Wish.t2;
?? ?}
}
// 顯示花樣
void Style(DWORD& st1)
{
?? ?DWORD st2 = timeGetTime();
?? ?if (st2 - st1 > 266000)?? ??? ?// 一首歌的時間
?? ?{
?? ??? ?// 心形坐標
?? ??? ?int x[13] = { 60, 75, 91, 100, 95, 75, 60, 45, 25, 15, 25, 41, 60 };
?? ??? ?int y[13] = { 65, 53, 40, 22, 5, 4, 20, 4, 5, 22, 40, 53, 65 };
?? ??? ?for (int i = 0; i < NUM; i++)
?? ??? ?{
?? ??? ??? ?cleardevice();
?? ??? ??? ?/**** 規律分布煙花彈 ***/
?? ??? ??? ?Jet[i].x = x[i] * 10;
?? ??? ??? ?Jet[i].y = (y[i] + 75) * 10;
?? ??? ??? ?Jet[i].hx = Jet[i].x;
?? ??? ??? ?Jet[i].hy = y[i] * 10;
?? ??? ??? ?Jet[i].height = Jet[i].y - Jet[i].hy;
?? ??? ??? ?Jet[i].shoot = true;
?? ??? ??? ?Jet[i].dt = 7;
?? ??? ??? ?putimage(Jet[i].x, Jet[i].y, Jet[i].img[Jet[i].n], SRCINVERT);?? ?// 顯示煙花彈
?? ??? ??? ?/**** 設置煙花參數 ***/
?? ??? ??? ?Fire[i].x = Jet[i].x + 10;
?? ??? ??? ?Fire[i].y = Jet[i].hy;
?? ??? ??? ?Fire[i].show = false;
?? ??? ??? ?Fire[i].r = 0;
?? ??? ??? ?/**** 播放發射聲音 ***/
?? ??? ??? ?char c1[50], c2[30], c3[30];
?? ??? ??? ?sprintf_s(c1, "open ./fire/shoot.mp3 alias s%d", i);
?? ??? ??? ?sprintf_s(c2, "play s%d", i);
?? ??? ??? ?sprintf_s(c3, "close n%d", i);
?? ??? ??? ?mciSendString(c3, 0, 0, 0);
?? ??? ??? ?mciSendString(c1, 0, 0, 0);
?? ??? ??? ?mciSendString(c2, 0, 0, 0);
?? ??? ?}
?? ??? ?st1 = st2;
?? ?}
}
// 綻放煙花
void Show(DWORD* pMem)
{
?? ?// 煙花個階段綻放時間間隔,制作變速綻放效果
?? ?int drt[16] = { 5, 5, 5, 5, 5, 6, 25, 25, 25, 25, 55, 55, 55, 55, 55 };
?? ?for (int i = 0; i < NUM; i++)
?? ?{
?? ??? ?Fire[i].t2 = timeGetTime();
?? ??? ?// 增加爆炸半徑,綻放煙花,增加時間間隔做變速效果
?? ??? ?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 = (int)(Fire[i].cen_x + Fire[i].r * cos(a));?? ??? ??? ??? ?// 相對于圖片左上角的坐標
?? ??? ??? ??? ?int y1 = (int)(Fire[i].cen_y - Fire[i].r * sin(a));
?? ??? ??? ??? ?if (x1 > 0 && x1 < Fire[i].width && y1 > 0 && y1 < Fire[i].height)?? ?// 只輸出圖片內的像素點
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?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 xx = (int)(Fire[i].x + Fire[i].r * cos(a));
?? ??? ??? ??? ??? ?int yy = (int)(Fire[i].y - Fire[i].r * sin(a));
?? ??? ??? ??? ??? ?// 較暗的像素點不輸出、防止越界
?? ??? ??? ??? ??? ?if (r > 0x20 && g > 0x20 && b > 0x20 && xx > 0 && xx < 1200 && yy > 0 && yy < 800)
?? ??? ??? ??? ??? ??? ?pMem[yy * 1200 + xx] = BGR(Fire[i].xy[x1][y1]);?? ?// 顯存操作繪制煙花
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?Fire[i].draw = false;
?? ??? ?}
?? ?}
}
?我在VS2022上編譯時,出現了17個錯誤,也就是字符集的問題,重新調整了項目屬性,改為多字節字符集就沒有錯誤了,運行時就又出現了錯誤,然后程序也不動了(能運行),跳出這樣一個錯誤,我上網查了一些資料是指針的問題,但沒具體說,之說了是空指針,野指針或者數組越界的問題,還有程序錯誤,但這可以排除了。
就是因為這個問題,我硬是怎了三天,一直在想這個錯誤,才調試成功,這個錯誤才解決,
看調試成功的代碼:
?
/********************************************************
*?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?*
*?? ?程序名稱:祝福煙花,祝福朋友?? ??? ??? ??? ??? ??? ?*
*?? ?編譯環境:VC++6.0 && easyx(立冬版)?? ??? ??? ??? ??? ?*
*?? ?作者相關:yy滺滺__<837943056@qq.com>?? ??? ??? ??? ?*
*?? ?最后修改:2012.11.22?? ??? ??? ??? ??? ??? ??? ??? ?*
*?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?*
********************************************************/
/* 【自學去】網站收集 http://www.zixue7.com */
#include <graphics.h>
#include <conio.h>
#include <math.h>
#include <time.h>
#include <stdio.h>
#include <Mmsystem.h>?? ??? ?// 使用該計時器必須包含的文件
#pragma comment ( lib, "Winmm.lib" )
/***** 宏定義區 ******/
#define NUM?? ??? ?13?? ??? ??? ?// 煙花種類數量宏定義
/***** 結構定義區 **********/
// 煙花結構
struct FIRE
{
?? ?int r;?? ??? ??? ??? ??? ?// 當前爆炸半徑
?? ?int max_r;?? ??? ??? ??? ?// 爆炸中心距離邊緣最大半徑
?? ?int x, y;?? ??? ??? ??? ?// 爆炸中心在窗口的坐標
?? ?int cen_x, cen_y;?? ??? ?// 爆炸中心相對圖片左上角的坐標
?? ?int width, height;?? ??? ?// 圖片的寬高
?? ?int xy[240][240];?? ??? ?// 儲存圖片像素點
?? ?bool show;?? ??? ??? ??? ?// 是否綻放
?? ?bool draw;?? ??? ??? ??? ?// 開始輸出像素點
?? ?DWORD t1, t2, dt;?? ??? ?// 綻放速度
}Fire[NUM];
// 煙花彈結構
struct JET
{
?? ?int x, y;?? ??? ??? ??? ?// 噴射點坐標
?? ?int hx, hy;?? ??? ??? ??? ?// 最高點坐標------將賦值給 FIRE 里面的 x, y
?? ?int height;?? ??? ??? ??? ?// 煙花高度
?? ?bool shoot;?? ??? ??? ??? ?// 是否可以發射
?? ?DWORD t1, t2, dt;?? ??? ?// 發射速度
?? ?IMAGE img[2];?? ??? ??? ?// 儲存花彈一亮一暗圖片? ?***********看這里*********************
?? ?byte n : 1;?? ??? ??? ??? ?// 圖片下標
}Jet[NUM];
// happy birthday 藝術字結構
struct HAPPY?? ??? ??? ??? ?// 儲存 Happy Birthday 藝術字圖片
{
?? ?int x, y;?? ??? ??? ??? ?// 每個字的圖片的左上角坐標
?? ?IMAGE img;?? ??? ??? ??? ?// 儲存單個字圖片? ??***********看這里*********************
?? ?static int num;?? ??? ??? ?// 字母序號
}Happy[NUM];
int HAPPY::num = 0;
// For.2012の夭女 結構
struct WISH?? ??? ??? ??? ??? ?// 滾動祝福圖片結構
{
?? ?int x, y;?? ??? ??? ??? ?// 圖片左上角坐標
?? ?DWORD t1, t2, dt;?? ??? ?// 圖片運動時間間隔
?? ?IMAGE img;?? ??? ??? ??? ?// 儲存圖片? ??***********看這里*********************
?? ?int dxy;?? ??? ??? ??? ?// 每次的移動量
?? ?byte dir : 1;?? ??? ??? ?// 限制兩個滾動方向
}Wish;
/**** 函數申明區 ****/
void Init?? ?( int?? ? );?? ??? ?// 初始化煙花
void Load?? ?(?? ??? ? );?? ??? ?// 加載煙花圖片
void Shoot?? ?(?? ??? ? );?? ??? ?// 發射煙花
void Chose?? ?( DWORD& );?? ??? ?// 篩選煙花
void Wishing(?? ??? ? );?? ??? ?// 滾動祝福
void Style?? ?( DWORD& );?? ??? ?// 發射樣式
void Show?? ?( DWORD* );?? ??? ?// 綻放煙花
// 主函數
int main()
{
?? ?initgraph( 1200, 800 );
?? ?srand( time(0) );
?? ?// 播放背景音樂
? ? PlaySound("./fire/MYSTERIA_bgm18_終わりの終わり.wav", NULL, SND_LOOP | SND_FILENAME | SND_ASYNC);? ? ? ???***********看這里*********************
?? ?//mciSendString( "open ./fire/bk.mp3 alias bk", 0, 0, 0 );
?? ?//mciSendString( "play bk repeat", 0, 0, 0 );
?? ?setfillstyle( 0,0,0?? ?);//實際參數和形式參數應該相同!!!
?? ?setfont?? ??? ?( 36, 0, "楷體"?? ?);
?? ?setcolor?? ?( YELLOW );
?? ?outtextxy?? ?( 370, 100, "yy滺滺__出廠 .... ^_^" );
?? ?DWORD t1?? ?= timeGetTime();?? ??? ?// 篩選煙花計時
?? ?DWORD st1?? ?= timeGetTime();?? ??? ?// 播放花樣計時
?? ?DWORD* pMem = GetImageBuffer();?? ??? ?// 獲取窗口顯存指針
?? ?for ( int i = 0; i < NUM; i++ )?? ??? ?// 初始化煙花
?? ?{
?? ??? ?Init( i );
?? ?}
?? ?Load();?? ??? ??? ??? ??? ??? ??? ??? ?// 將煙花圖片信息加載進相應結構中
?? ?BeginBatchDraw();?? ??? ??? ??? ??? ?// 開始批量繪圖
?? ?while ( !_kbhit() )
?? ?{
?? ??? ?Sleep( 10 );
?? ??? ?// 隨機選擇 4000 個像素點擦除
?? ??? ?for ( int clr = 0; clr < 1000; clr++ )
?? ??? ?{
?? ??? ??? ?for ( int j = 0; j < 2; j++ )
?? ??? ??? ?{
?? ??? ??? ??? ?int px1 = rand() % 1200;
?? ??? ??? ??? ?int py1 = rand() % 800;
?? ??? ??? ??? ?if ( py1 < 799 )?? ??? ??? ??? ?// 防止越界
?? ??? ??? ??? ??? ?pMem[py1 * 1200 + px1] = pMem[py1 * 1200 + px1 + 1] = BLACK;?? ?// 對顯存賦值擦出像素點
?? ??? ??? ?}
?? ??? ?}
?? ??? ?Chose?? ?( t1?? ?);?? ??? ?// 篩選煙花
?? ??? ?Shoot?? ?(?? ??? ?);?? ??? ?// 發射煙花
?? ??? ?Show?? ?( pMem?? ?);?? ??? ?// 綻放煙花
?? ??? ?Wishing?? ?(?? ??? ?);?? ??? ?// 滾動字符
?? ??? ?Style?? ?( st1?? ?);?? ??? ?// 花樣發射
?? ??? ?FlushBatchDraw(?? ?);?? ??? ?// 顯示前面的所有繪圖操作
?? ?}
}
// 初始化煙花參數
void Init( int i )
{
?? ?// 分別為:煙花中心到圖片邊緣的最遠距離、煙花中心到圖片左上角的距離 (x、y) 兩個分量
?? ?int r[13] = { 120, 120, 155, 123, 130, 147, 138, 138, 130, 135, 140, 132, 155 };
?? ?int x[13] = { 120, 120, 110, 117, 110, 93, ?102, 102, 110, 105, 100, 108, 110 };
?? ?int y[13] = { 120, 120, 85, ?118, 120, 103, 105, 110, 110, 120, 120, 104, 85 ?};
?? ?/**** 初始化煙花 *****/
?? ?Fire[i].x?? ??? ?= 0;?? ??? ??? ??? ?// 煙花中心坐標
?? ?Fire[i].y?? ??? ?= 0;
?? ?Fire[i].width?? ?= 240;?? ??? ??? ??? ?// 圖片寬
?? ?Fire[i].height?? ?= 240;?? ??? ??? ??? ?// 圖片高
?? ?Fire[i].max_r?? ?= r[i];?? ??? ??? ??? ?// 最大半徑
?? ?Fire[i].cen_x?? ?= x[i];?? ??? ??? ??? ?// 中心距左上角距離
?? ?Fire[i].cen_y?? ?= y[i];
?? ?Fire[i].show?? ?= false;?? ??? ??? ?// 是否綻放
?? ?Fire[i].dt?? ??? ?= 5;?? ??? ??? ??? ?// 綻放時間間隔
?? ?Fire[i].t1?? ??? ?= timeGetTime();
?? ?Fire[i].r?? ??? ?= 0;?? ??? ??? ??? ?// 從 0 開始綻放
?? ?/**** 初始化煙花彈 *****/
?? ?Jet[i].x?? ??? ?= -240;?? ??? ??? ??? ?// 煙花彈左上角坐標
?? ?Jet[i].y?? ??? ?= -240;
?? ?Jet[i].hx?? ??? ?= -240;?? ??? ??? ??? ?// 煙花彈發射最高點坐標
?? ?Jet[i].hy?? ??? ?= -240;
?? ?Jet[i].height?? ?= 0;?? ??? ??? ??? ?// 發射高度
?? ?Jet[i].t1?? ??? ?= timeGetTime();
?? ?Jet[i].dt?? ??? ?= rand() % 10;?? ??? ?// 發射速度時間間隔
?? ?Jet[i].n?? ??? ?= 0;?? ??? ??? ??? ?// 煙花彈閃爍圖片下標
?? ?Jet[i].shoot?? ?= false;?? ??? ??? ?// 是否發射
}
// 加載圖片
void Load()
{
/**** 儲存煙花的像素點顏色 ****/
?? ?IMAGE fm, gm;
?? ?loadimage( &fm, "./fire/flower.jpg", 3120, 240 );
?? ?for ( int i = 0; i < 13; i++ )
?? ?{
?? ??? ?SetWorkingImage( &fm );
?? ??? ?getimage( &gm, i * 240, 0, 240, 240 );
?? ??? ?SetWorkingImage( &gm );
?? ??? ?for ( int a = 0; a < 240; a++ )
?? ??? ??? ?for ( int b = 0; b < 240; b++ )
?? ??? ??? ??? ?Fire[i].xy[a][b] = getpixel( a, b );
?? ?}
/**** 加載煙花彈 ************/
?? ?IMAGE sm;
?? ?loadimage( &sm, "./fire/shoot.jpg", 200, 50 );
?? ?for ( int i = 0; i < 13; i++ )
?? ?{
?? ??? ?SetWorkingImage( &sm );
?? ??? ?int n = rand() % 5;
?? ??? ?getimage( &Jet[i].img[0], n * 20, 0, 20, 50 );?? ??? ??? ?// 暗???***********看這里*********************
?? ??? ?getimage( &Jet[i].img[1], (n + 5) * 20, 0, 20, 50 );?? ?// 亮???***********看這里*********************
?? ?}
/***** 加載 Happy Birthday 圖片 ********/
?? ?IMAGE hm;
?? ?loadimage( &hm, "./fire/happy.jpg", 689, 115 );
?? ?
?? ?for ( int i = 0; i < 13; i++ )
?? ?{
? ? ? ? ? ? ? ? ? SetWorkingImage( &hm );
?? ??? ?Happy[i].x = i * 90;
?? ??? ?Happy[i].y = rand() % 100 + 500;
?? ??? ?getimage( &Happy[i].img, i * 53, 0, 53, 115 );???***********看這里*********************
?? ?}
/***** 加載 For.2012の夭女 圖片 *********/
?? ?Wish.x?? ??? ?= 0;
?? ?Wish.y?? ??? ?= 100;
?? ?Wish.t1?? ??? ?= timeGetTime();
?? ?Wish.dt?? ??? ?= 46;
?? ?Wish.dir?? ?= 0;
?? ?Wish.dxy?? ?= rand() % 8 + 1;
?? ?loadimage( ?&Wish.img,"./fire/yaojing.jpg" );???***********看這里*********************
?? ?putimage( Wish.x, Wish.y, &Wish.img, SRCINVERT );? ??***********看這里*********************
?? ?SetWorkingImage();?? ??? ?// 設置回繪圖窗口
}
// 在一定范圍內篩選可發射的煙花,并初始化發射參數,輸出煙花彈到屏幕,播放聲音
void Chose( DWORD& t1 )
{
?? ?DWORD t2 = timeGetTime();
?? ?if ( t2 - t1 > 100 )
?? ?{
?? ??? ?int n = rand() % 20;
?? ??? ?if ( n < 13 && Jet[n].shoot == false && Fire[n].show == false )
?? ??? ?{
?? ??? ??? ?/**** 重置煙花彈,預備發射 *****/
?? ??? ??? ?Jet[n].x?? ??? ?= rand() % 1200;
?? ??? ??? ?Jet[n].y?? ??? ?= rand() % 100 + 600;
?? ??? ??? ?Jet[n].hx?? ??? ?= Jet[n].x;
?? ??? ??? ?Jet[n].hy?? ??? ?= rand() % 400;
?? ??? ??? ?Jet[n].height?? ?= Jet[n].y - Jet[n].hy;
?? ??? ??? ?Jet[n].shoot?? ?= true;
?? ??? ??? ?putimage( Jet[n].x, Jet[n].y, Jet[n].img, SRCINVERT );???***********看這里*********************
?? ??? ??? ?/**** 播放每個煙花彈的聲音 *****/
?? ??? ??? ?char c1[50], c2[30], c3[30];
?? ??? ??? ?sprintf_s( c1, "open ./fire/shoot.mp3 alias s%d", n );
?? ??? ??? ?sprintf_s( c2, "play s%d", n );
?? ??? ??? ?sprintf_s( c3, "close n%d", n );
?? ??? ??? ?mciSendString( c3, 0, 0, 0 );
?? ??? ??? ?mciSendString( c1, 0, 0, 0 );
?? ??? ??? ?mciSendString( c2, 0, 0, 0 );
?? ??? ?}
?? ??? ?t1 = t2;
?? ?}
}
// 掃描煙花彈并發射
void Shoot()
{
?? ?for ( int i = 0; i < 13; i++ )
?? ?{
?? ??? ?Jet[i].t2 = timeGetTime();
?? ??? ?if ( Jet[i].t2 - Jet[i].t1 > Jet[i].dt && Jet[i].shoot == true )
?? ??? ?{
?? ??? ??? ?/**** 煙花彈的上升 *****/
?? ??? ??? ?putimage( Jet[i].x, Jet[i].y, Jet[i].img, SRCINVERT );???***********看這里*********************
?? ??? ??? ?if ( Jet[i].y > Jet[i].hy )
?? ??? ??? ?{
?? ??? ??? ??? ?Jet[i].n++;
?? ??? ??? ??? ?Jet[i].y -= 5;
?? ??? ??? ?}
?? ??? ??? ?putimage( Jet[i].x, Jet[i].y, Jet[i].img, SRCINVERT );???***********看這里*********************
?? ??? ??? ?/**** 上升到高度的 3 / 4,減速 *****/
?? ??? ??? ?if ( (Jet[i].y - Jet[i].hy) * 4 < Jet[i].height )
?? ??? ??? ??? ?Jet[i].dt = rand() % 4 + 10 ;
?? ??? ??? ?/**** 上升到最大高度 *****/
?? ??? ??? ?if ( Jet[i].y <= Jet[i].hy )
?? ??? ??? ?{
?? ??? ??? ??? ?// 播放爆炸聲
?? ??? ??? ??? ?char c1[50], c2[30], c3[30];
?? ??? ??? ??? ?sprintf_s( c1, "open ./fire/bomb.wav alias n%d", i );? ??***********看這里*********************
?? ??? ??? ??? ?sprintf_s( c2, "play n%d", i );
?? ??? ??? ??? ?sprintf_s( c3, "close s%d", i );
?? ??? ??? ??? ?mciSendString( c3, 0, 0, 0 );
?? ??? ??? ??? ?mciSendString( c1, 0, 0, 0 );
?? ??? ??? ??? ?mciSendString( c2, 0, 0, 0 );
?? ??? ??? ??? ?putimage( Jet[i].x, Jet[i].y, Jet[i].img, SRCINVERT );?? ?// 擦掉煙花彈? ??***********看這里*********************
?? ??? ??? ??? ?Fire[i].x = Jet[i].hx + 10;?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// 在煙花彈中間爆炸
?? ??? ??? ??? ?Fire[i].y = Jet[i].hy;?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?// 在最高點綻放
?? ??? ??? ??? ?Fire[i].show = true;?? ??? ??? ??? ??? ?// 開始綻放
?? ??? ??? ??? ?Jet[i].shoot = false;?? ??? ??? ??? ??? ?// 停止發射
?? ??? ??? ??? ?// 顯示對應字母
?? ??? ??? ??? ?putimage( Happy[HAPPY::num].x, Happy[HAPPY::num].y, &Happy[HAPPY::num].img ,SRCINVERT );???***********看這里*********************
?? ??? ??? ??? ?HAPPY::num++;
?? ??? ??? ??? ?if ( HAPPY::num > 12 )
?? ??? ??? ??? ??? ?HAPPY::num = 0;
?? ??? ??? ?}
?? ??? ??? ?Jet[i].t1 = Jet[i].t2;
?? ??? ?}
?? ?}
}
// 制作水平、豎直移動的圖片
void Wishing()
{
?? ?Wish.t2 = timeGetTime();
?? ?if ( Wish.t2 - Wish.t1 > Wish.dt )
?? ?{
?? ??? ?/**** 圖片的移動 *****/
?? ??? ?putimage( Wish.x, Wish.y, &Wish.img, SRCINVERT );???***********看這里*********************
?? ??? ?if ( Wish.dir == 0 )
?? ??? ??? ?Wish.x += Wish.dxy;
?? ??? ?else
?? ??? ??? ?Wish.y -= Wish.dxy;
?? ??? ?putimage( Wish.x, Wish.y, &Wish.img, SRCINVERT );???***********看這里*********************
?? ??? ?/**** 圖片出界后 *****/
?? ??? ?if ( Wish.x > 1200 || Wish.y < 0 )
?? ??? ?{
?? ??? ??? ?Wish.dir = rand() % 2;?? ??? ??? ?// 獲取隨機方向
?? ??? ??? ?if ( Wish.dir == 0 )?? ??? ??? ?// 如果左右運動
?? ??? ??? ?{
?? ??? ??? ??? ?Wish.y = rand() % 700;?? ??? ?// 初始位置
?? ??? ??? ??? ?Wish.x = -490;
?? ??? ??? ??? ?Wish.dxy = rand() % 7 + 1;?? ?// 隨機運動分量
?? ??? ??? ?}
?? ??? ??? ?else?? ??? ??? ??? ??? ??? ??? ?// 上下運動
?? ??? ??? ?{
?? ??? ??? ??? ?Wish.dxy = rand() % 7 + 1;
?? ??? ??? ??? ?Wish.x = rand() % 700;
?? ??? ??? ??? ?Wish.y = 800;
?? ??? ??? ?}
?? ??? ?}
?? ??? ?Wish.t1 = Wish.t2;
?? ?}
}
// 顯示花樣
void Style( DWORD& st1 )
{
?? ?DWORD st2 = timeGetTime();
?? ?if ( st2 - st1 > 266000 )?? ??? ?// 一首歌的時間
?? ?{
?? ??? ?// 心形坐標
?? ??? ?int x[13] = { 60, 75, 91, 100, 95, 75, 60, 45, 25, 15, 25, 41, 60 };
?? ??? ?int y[13] = { 65, 53, 40, 22, 5, 4, 20, 4, 5, 22, 40, 53, 65 };
?? ??? ?for ( int i = 0; i < NUM; i++ )
?? ??? ?{
?? ??? ??? ?cleardevice();
?? ??? ??? ?/**** 規律分布煙花彈 ***/
?? ??? ??? ?Jet[i].x?? ??? ?= x[i] * 10;
?? ??? ??? ?Jet[i].y?? ??? ?= ( y[i] + 75 ) * 10;
?? ??? ??? ?Jet[i].hx?? ??? ?= Jet[i].x;
?? ??? ??? ?Jet[i].hy?? ??? ?= y[i] * 10;
?? ??? ??? ?Jet[i].height?? ?= Jet[i].y - Jet[i].hy;
?? ??? ??? ?Jet[i].shoot?? ?= true;
?? ??? ??? ?Jet[i].dt?? ??? ?= 7;
?? ??? ??? ?putimage( Jet[i].x, Jet[i].y, Jet[i].img, SRCINVERT );?? ?// 顯示煙花彈???***********看這里*********************
?? ??? ??? ?/**** 設置煙花參數 ***/
?? ??? ??? ?Fire[i].x?? ??? ?= Jet[i].x + 10;
?? ??? ??? ?Fire[i].y?? ??? ?= Jet[i].hy;
?? ??? ??? ?Fire[i].show?? ?= false;
?? ??? ??? ?Fire[i].r?? ??? ?= 0;
?? ??? ??? ?/**** 播放發射聲音 ***/
?? ??? ??? ?char c1[50], c2[30], c3[30];
?? ??? ??? ?sprintf_s( c1, "open ./fire/shoot.mp3 alias s%d", i );
?? ??? ??? ?sprintf_s( c2, "play s%d", i );
?? ??? ??? ?sprintf_s( c3, "close n%d", i );
?? ??? ??? ?mciSendString( c3, 0, 0, 0 );
?? ??? ??? ?mciSendString( c1, 0, 0, 0 );
?? ??? ??? ?mciSendString( c2, 0, 0, 0 );
?? ??? ?}
?? ??? ?st1 = st2;
?? ?}
}
// 綻放煙花
void Show( DWORD* pMem )
{
?? ?// 煙花個階段綻放時間間隔,制作變速綻放效果
?? ?int drt[16] = { 5, 5, 5, 5, 5, 6, 25, 25, 25, 25, 55, 55, 55, 55, 55 };
?? ?for ( int i = 0; i < NUM; i++ )
?? ?{
?? ??? ?Fire[i].t2 = timeGetTime();
?? ??? ?// 增加爆炸半徑,綻放煙花,增加時間間隔做變速效果
?? ??? ?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 = (int)( Fire[i].cen_x + Fire[i].r * cos(a) );?? ??? ??? ??? ?// 相對于圖片左上角的坐標
?? ??? ??? ??? ?int y1 = (int)( Fire[i].cen_y - Fire[i].r * sin(a) );
?? ??? ??? ??? ?if ( x1 > 0 && x1 < Fire[i].width && y1 > 0 && y1 < Fire[i].height )?? ?// 只輸出圖片內的像素點
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?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 xx = (int)( Fire[i].x + Fire[i].r * cos(a) );
?? ??? ??? ??? ??? ?int yy = (int)( Fire[i].y - Fire[i].r * sin(a) );
?? ??? ??? ??? ??? ?// 較暗的像素點不輸出、防止越界
?? ??? ??? ??? ??? ?if ( r > 0x20 && g > 0x20 && b > 0x20 && xx > 0 && xx < 1200 && yy > 0 && yy < 800 )
?? ??? ??? ??? ??? ??? ?pMem[yy * 1200 + xx] = BGR( Fire[i].xy[x1][y1] );?? ?// 顯存操作繪制煙花
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?Fire[i].draw = false;
?? ??? ?}
?? ?}
}
“*”這個要刪除,而且對應的語句也要修改,說實話我也不太清楚,知道的可不可以講解一下,你們會說連你都不太清楚是怎樣解決問題的呢?我想說的是我連續3天從早到晚一直查資料,調試程序,刪了又改,困了躺穿上睡一會,到第三天下午,不知怎么的,查看了相類似的程序,我感覺知道問題出自哪里了,然后,就真的成功了!!!
當然,想要運行成功并實現這個程序還要一些圖片,音樂文件,把這個裝有圖片和音樂的文件放在源文件和頭文件當前所在目錄才能調用。這是頭文件 resource.h
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by ico.rc
//
#define IDI_ICON1 ? ? ? ? ? ? ? ? ? ? ? 101
// Next default values for new objects
//?
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE ? ? ? ?102
#define _APS_NEXT_COMMAND_VALUE ? ? ? ? 40001
#define _APS_NEXT_CONTROL_VALUE ? ? ? ? 1000
#define _APS_NEXT_SYMED_VALUE ? ? ? ? ? 101
#endif
#endif
?
在網上可以找到的,實在不想找的話,找我,我發給你,這上面好像復制不了圖片和音樂。
還需注意的一點是,當你能運行后,而又不想每次看這個程序時都要在VS2022中運行出來時,而是直接點exe文件,那你要復制一份裝有圖片和音樂的文件夾放在生成exe文件的文件夾中!!!,才能完美實現。
謝謝啦~。
總結
以上是生活随笔為你收集整理的一个关于C语言程序指针的用法(其中之一·)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 群晖/Linux挂载阿里云盘实现Emby
- 下一篇: 推荐一些适合软件测试从业者的书,以及如何