C/C++:实现精灵游戏

您所在的位置:网站首页 精灵游戏网 C/C++:实现精灵游戏

C/C++:实现精灵游戏

2023-08-30 06:27| 来源: 网络整理| 查看: 265

采用面向过程的遍程思想,通过acllib图形库来实现。

acllib下载地址:acllib

tom,jerry,dog,heart以及开始图片,结束图片这些可以自己找,图片的格式必须为BMP、JPEG、GIF这三种。

创建win32项目 创建方式

游戏效果如下: 开始界面 游戏界面 结束界面

#include"acllib.h" #include #include #include const int winWidth = 960, winHeight = 660; ACL_Image tomimg; ACL_Image jerryimg; ACL_Sound sound; ACL_Image dogimg; ACL_Image heartimg; ACL_Image beginimg; ACL_Image endimg; const int maxNum = 2000; const int maxJerryNum = 20; const int maxDogNum = 20; const int maxHeartNum = 20; int jerryNum = 0; int dogNum = 0; int heartNum = 0; int preJerryNum = 0; int preDogNum = 0; int preHeartNum = 0; int flag = 0; void timerEvent(int id);//定时器 void keyEvent(int key, int e);//键盘 void initgame();//初始化函数 int moveid = 0, movetimerInterval = 30; int createid = 1, createtimerInterval = 1000; int dogid1 = 2, dogtimerInterval1 = 5000; int dogid2 = 3, dogtimerInterval2 = 30; int heartid1 = 4, hearttimerInterval1 = 30; int heartid2 = 5, hearttimerInterval2 = 8000; int score1 = 0, score2 = 8; void beginpaint();//开始界面 void Paint();//游戏界面 void endpaint();//结束界面 struct sprite//精灵 { int x, y; int width, height; int distx,disty; }; typedef struct rect { int x, y; int w, h; }rect; int collision(rect r1, rect r2);//检测碰撞 void change(int score);//改变Tom猫的大小 struct sprite tomsprite, *jerrysprite[maxNum]={NULL},*dogsprite[maxNum]={NULL},*heartsprite[maxNum]={NULL}; int Setup() { initWindow("My first game", DEFAULT, DEFAULT, winWidth, winHeight); loadImage("tom.bmp", &tomimg); loadImage("jerry.bmp", &jerryimg); loadSound("tada.wav", &sound); loadImage("dog.bmp", &dogimg); loadImage("heart.bmp", &heartimg); loadImage("begin.bmp", &beginimg); loadImage("end.bmp", &endimg); srand((unsigned)time(NULL)); initgame(); registerTimerEvent(timerEvent); registerKeyboardEvent(keyEvent); beginpaint(); return 0; } void initgame() { memset(jerrysprite, NULL, sizeof(jerrysprite)); memset(dogsprite, NULL, sizeof(dogsprite)); memset(heartsprite, NULL, sizeof(heartsprite)); score1 = 0; score2 = 8; jerryNum = 0; dogNum = 0; heartNum = 0; preJerryNum = 0; preDogNum = 0; preHeartNum = 0; jerrysprite[jerryNum] = (struct sprite*)malloc(sizeof(struct sprite)); jerrysprite[jerryNum]->distx = jerrysprite[jerryNum]->disty = 3; jerrysprite[jerryNum]->height = 50; jerrysprite[jerryNum]->width = 50; jerrysprite[jerryNum]->x = rand() % (winWidth - jerrysprite[jerryNum]->width + 1); jerrysprite[jerryNum]->y = rand() % (winHeight - jerrysprite[jerryNum]->height + 1); tomsprite.width = 100; tomsprite.height = 100; tomsprite.distx = tomsprite.disty = 5; tomsprite.x = rand() % (winWidth - tomsprite.width + 1); tomsprite.y = rand() % (winHeight - tomsprite.height + 1); } void keyEvent(int key, int e) { if (e != KEY_DOWN)return; if (key == 0x52) { initgame(); flag = 1; Paint(); startTimer(moveid, movetimerInterval); startTimer(createid, createtimerInterval); startTimer(dogid1, dogtimerInterval1); startTimer(dogid2, dogtimerInterval2); startTimer(heartid1, hearttimerInterval1); startTimer(heartid2, hearttimerInterval2); } else if (flag == 1) { switch (key) { case VK_UP: tomsprite.y -= tomsprite.disty; if (tomsprite.y = winHeight - tomsprite.height)tomsprite.y = winHeight - tomsprite.height; break; case VK_RIGHT: tomsprite.x += tomsprite.distx; if (tomsprite.x >= winWidth - tomsprite.width)tomsprite.x = winWidth - tomsprite.width; break; case VK_LEFT: tomsprite.x -= tomsprite.distx; if (tomsprite.x r2.x = jerrysprite[i]->x; r2.y = jerrysprite[i]->y; r2.w = jerrysprite[i]->width; r2.h = jerrysprite[i]->height; int c = collision(r1, r2); if (c) { playSound(sound, 0); score1++; change(score1); if (score1 >= 10) { flag = 0; endpaint(); cancelTimer(moveid); cancelTimer(createid); cancelTimer(dogid1); cancelTimer(dogid2); cancelTimer(heartid1); cancelTimer(heartid2); return; } preJerryNum--; delete(jerrysprite[i]); jerrysprite[i] = NULL; } } } for (int i = 1; i r3.x = dogsprite[i]->x; r3.y = dogsprite[i]->y; r3.w = dogsprite[i]->width; r3.h = dogsprite[i]->height; int c = collision(r1, r3); if (c) { playSound(sound, 0); score2--; if (score1 >= 3) score1 -= 3; else score1 = 0; change(score1); if (score2 if (heartsprite[i]) { r4.x = heartsprite[i]->x; r4.y = heartsprite[i]->y; r4.w = heartsprite[i]->width; r4.h = heartsprite[i]->height; int c = collision(r1, r4); if (c) { playSound(sound, 0); score2++; change(score1); preHeartNum--; delete(heartsprite[i]); heartsprite[i] = NULL; } } } Paint(); } } void timerEvent(int id) { int a; if (id == 0) { for (a = 0; a if (jerrysprite[a]->x >= winWidth - jerrysprite[a]->width || jerrysprite[a]->x jerrysprite[a]->disty *= -1; } jerrysprite[a]->x += jerrysprite[a]->distx; jerrysprite[a]->y += jerrysprite[a]->disty; } } //Paint(); } if (id == 1) { if (preJerryNum jerrysprite[jerryNum] = (struct sprite*)malloc(sizeof(struct sprite)); jerrysprite[jerryNum]->width = 50; jerrysprite[jerryNum]->height = 50; jerrysprite[jerryNum]->distx = jerrysprite[jerryNum]->disty = 3; jerrysprite[jerryNum]->x = rand() % (winWidth - jerrysprite[jerryNum]->width+1); jerrysprite[jerryNum]->y = rand() % (winHeight - jerrysprite[jerryNum]->height+1); } } if (id == 2) { if (preDogNum dogsprite[dogNum] = (struct sprite*)malloc(sizeof(struct sprite)); dogsprite[dogNum]->width = 100; dogsprite[dogNum]->height = 100; dogsprite[dogNum]->distx = dogsprite[dogNum]->disty = 2; dogsprite[dogNum]->x = rand() % (winWidth - dogsprite[dogNum]->width+1); dogsprite[dogNum]->y = rand() % (winHeight - dogsprite[dogNum]->height+1); } } if (id == 3) { for (a = 1; a if (dogsprite[a]->x >= winWidth - dogsprite[a]->width || dogsprite[a]->x dogsprite[a]->disty *= -1; } dogsprite[a]->x += dogsprite[a]->distx; dogsprite[a]->y += dogsprite[a]->disty; } } //Paint(); } if (id == 4) { for (a = 1; a if (heartsprite[a]->x >= winWidth - heartsprite[a]->width || heartsprite[a]->x heartsprite[a]->disty *= -1; } heartsprite[a]->x += heartsprite[a]->distx; heartsprite[a]->y += heartsprite[a]->disty; } } //Paint(); } if (id == 5) { if (preHeartNum heartsprite[heartNum] = (struct sprite*)malloc(sizeof(struct sprite)); heartsprite[heartNum]->width = 50; heartsprite[heartNum]->height = 50; heartsprite[heartNum]->distx = heartsprite[heartNum]->disty = 1; heartsprite[heartNum]->x = rand() % (winWidth - heartsprite[heartNum]->width + 1); heartsprite[heartNum]->y = rand() % (winHeight - heartsprite[heartNum]->height + 1); } } rect r1, r2,r3,r4; r1.x = tomsprite.x; r1.y = tomsprite.y; r1.w = tomsprite.width; r1.h = tomsprite.height; for (int i = 0; i r2.x = jerrysprite[i]->x; r2.y = jerrysprite[i]->y; r2.w = jerrysprite[i]->width; r2.h = jerrysprite[i]->height; int c = collision(r1, r2); if (c) { playSound(sound, 0); score1++; change(score1); if (score1 >= 10) { flag = 0; endpaint(); cancelTimer(moveid); cancelTimer(createid); cancelTimer(dogid1); cancelTimer(dogid2); cancelTimer(heartid1); cancelTimer(heartid2); return; } preJerryNum--; delete(jerrysprite[i]); jerrysprite[i] = NULL; } } } for (int i = 1; i r3.x = dogsprite[i]->x; r3.y = dogsprite[i]->y; r3.w = dogsprite[i]->width; r3.h = dogsprite[i]->height; int c = collision(r1, r3); if (c) { playSound(sound, 0); score2--; if (score1 >= 3) score1 -= 3; else score1 = 0; change(score1); if (score2 if (heartsprite[i]) { r4.x = heartsprite[i]->x; r4.y = heartsprite[i]->y; r4.w = heartsprite[i]->width; r4.h = heartsprite[i]->height; int c = collision(r1, r4); if (c) { playSound(sound, 0); score2++; change(score1); preHeartNum--; delete(heartsprite[i]); heartsprite[i] = NULL; } } } Paint(); } void beginpaint() { beginPaint(); clearDevice(); putImageScale(&beginimg, 0, 0, winWidth, winHeight); setTextSize(60); setTextColor(BLUE); setTextBkColor(RGB(64,224,208)); setTextFont("楷体"); paintText(300, 10, "按R开始游戏"); endPaint(); } void Paint() { beginPaint(); //putImage(&img, 10, 10); clearDevice(); putImageTransparent(&tomimg, tomsprite.x, tomsprite.y, tomsprite.width, tomsprite.height,ACL_Color WHITE); //putImageScale(&jerryimg, jerry_x, jerry_y, jerryWidth, jerryHeight); for (int a = 0; a putImageTransparent(&jerryimg, jerrysprite[a]->x, jerrysprite[a]->y, jerrysprite[a]->width, jerrysprite[a]->height,ACL_Color WHITE); } } for (int a = 1; a putImageTransparent(&dogimg, dogsprite[a]->x, dogsprite[a]->y, dogsprite[a]->width, dogsprite[a]->height,ACL_Color WHITE); } } for (int a = 1; a putImageTransparent(&heartimg, heartsprite[a]->x, heartsprite[a]->y, heartsprite[a]->width, heartsprite[a]->height,ACL_Color WHITE); } } char str1[50],str2[50]; sprintf_s(str1, "score:%d", score1); sprintf_s(str2, "HP:%d", score2); setTextSize(30); setTextBkColor(RGB(255, 255, 255)); paintText(10, 10, str1); paintText(200, 10, str2); endPaint(); } void endpaint() { beginPaint(); clearDevice(); putImageScale(&endimg, 0, 0, winWidth, winHeight); setTextBkColor(RGB(255, 255, 255)); paintText(360, 10, "按R重新开始游戏"); endPaint(); } int collision(rect r1, rect r2) { int c = 1; if (r1.x r2.x) { if (r1.y > r2.y && r1.y if (r1.y > r2.y && r1.y


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3