成品展示
项目链接(带配图)
https://download.csdn.net/download/weixin_45525272/14946034
源代码
tools.h
#ifndef _TOOLS_H_ #define _TOOLS_H_ #include<graphics.h> typedef unsigned long COLORREF; typedef unsigned char byte; typedef struct ARGB { byte a; byte r; byte g; byte b; }ARGB; /// <summary> /// 分解RGB合成的颜色 /// </summary> /// <param name="c">待分解的颜色</param> ARGB DecompositionColor(COLORREF c) { byte r = (byte)c; byte g = (byte)(c >> 8); byte b = (byte)(c >> 16); byte a = (byte)(c >> 24); ARGB res = { a,r,g,b }; return res; } /// <summary> /// 绘制PNG透明图片 /// </summary> /// <param name="x">图片左上角横坐标</param> /// <param name="y">图片左上角纵坐标</param> /// <param name="img">要绘制的图片指针</param> void showimage(int x, int y, IMAGE* img) { DWORD* pdraw = GetImageBuffer(); DWORD* pImg = GetImageBuffer(img); int win_w = getwidth(); int win_h = getheight(); int img_w = img->getwidth(); int img_h = img->getheight(); int imgx = 0; for (int i = 0; i < img->getwidth(); i++) { for (int k = 0; k < img->getheight(); k++) { int index = k * img_w + i;//当前IMG操作位置 ARGB img_argb = DecompositionColor(pImg[index]); imgx = (y + k) * win_w + (i + x); if (img_argb.a != 0 && imgx >= 0 && imgx < win_w * win_h) { pdraw[imgx] = pImg[index]; } } } } #endif // !_TOOLS_H_
racingGame.cpp
#define _CRT_SECURE_NO_WARNINGS #include "tool.h" #include <stdio.h> #include <time.h> #include <mmsystem.h> #pragma comment(lib,"winmm.lib") #define COLS 4 #define ROW 6 #define IMGW 128 #define IMGH 128 #define WINDOWW IMGW*COLS #define WINDOWH IMGH*ROW #define isMoveL(i) (carInfo[i].carX>IMGW) #define isMoveR(i) (carInfo[i].carX<IMGW*3-40) #define isMoveU(i) (carInfo[i].carY>=0) #define isMoveD(i) (carInfo[i].carY<=WINDOWH-65) #define isInitD(i) (carInfo[i].carY>=WINDOWH) IMAGE background; IMAGE track; IMAGE car[4]; struct Line { int FL_x; int FL_y; int SL_x; int SL_y; int height; }; enum Dir {down,up}; struct Car { int carX; int carY; int carDir; }; //40*62 struct Car carInfo[4] = { IMGH * 2,WINDOWH-100,up, IMGH * 1 + 10,-62,down, //1 IMGH * 2 + 10,-62*2,down, //2 //IMGH*2+64+10,-62*2,down, //2-2 IMGH * 1 + 64+10,-62*3,down //1-2 }; struct Car carEmemy[4] = { IMGH * 1 + 10,-62,down , IMGH * 1 + 64 + 10,-62 ,down, IMGH * 2 + 10, -62,down , IMGH * 2 + 64 + 10,-62,down }; void initCarEmemy(int index) { carInfo[index] = carEmemy[rand() % 4]; carInfo[index].carY = rand() %8*-128; } int Timer(time_t m, int id) { static time_t start[5] = { clock(),clock(),clock(),clock(),clock()}; time_t end = clock(); if (end - start[id] >= m) { start[id] = end; return 1; } return 0; } void showCar(int index) { showimage(carInfo[index].carX, carInfo[index].carY, car+index); } void moveCar(int index) { if (carInfo[index].carDir == down&&Timer(10,index)) { carInfo[index].carY += 1; } if (carInfo[index].carDir == up&&Timer(25,0)) { if(GetAsyncKeyState('A')||GetAsyncKeyState(VK_LEFT)&& isMoveL(index)) { carInfo[index].carX -= 5; } if (GetAsyncKeyState('D') || GetAsyncKeyState(VK_RIGHT)&& isMoveR(index)) { carInfo[index].carX+= 5; } if (GetAsyncKeyState('W') || GetAsyncKeyState(VK_UP)&& isMoveU(index)) { carInfo[index].carY -= 5; } if (GetAsyncKeyState('S') || GetAsyncKeyState(VK_DOWN) &&isMoveD(index)) { carInfo[index].carY += 5; } } } struct Line lineSegment[16]; void initLine(int index) { lineSegment[index].FL_x = IMGW + 64; lineSegment[index].SL_x = IMGW * 2 + 64; lineSegment[index].FL_y = index * IMGH + 32; lineSegment[index].height = 32; lineSegment[index].SL_y = index * IMGH + 32; } void reInitLine(int index) { lineSegment[index].FL_x = IMGW + 64; lineSegment[index].SL_x = IMGW * 2 + 64; lineSegment[index].FL_y = IMGH*-1 + 32; lineSegment[index].height = 32; lineSegment[index].SL_y = IMGH *-1 + 32; } void loadResource() { loadimage(&background, "background.png"); loadimage(&track, "track.png"); for (int i = 0; i < 4; i++) { char fileName[20] = ""; sprintf(fileName, "%03d.png", i); loadimage(car + i, fileName); } } void drawLayout() { for (int i = 0; i < ROW; i++) { for (int j = 0; j < COLS; j++) { int x = IMGW * j; int y = IMGH * i; if (j == 1 || j == 2) { putimage(x, y, &track); } else { putimage(x, y, &background); } } } setlinecolor(BLACK); setlinestyle(PS_SOLID, 4); line(IMGW, 0, IMGW, WINDOWH); line(IMGW*3, 0, IMGW * 3, WINDOWH); setlinecolor(WHITE); line(IMGW*2, 0, IMGW * 2, WINDOWH); } void drawLine(int i) { setlinecolor(WHITE); line(lineSegment[i].FL_x, lineSegment[i].FL_y, lineSegment[i].FL_x, lineSegment[i].FL_y + lineSegment[i].height); line(lineSegment[i].SL_x, lineSegment[i].SL_y, lineSegment[i].SL_x, lineSegment[i].SL_y + lineSegment[i].height); } void moveLine(int index) { lineSegment[index].FL_y += 10; lineSegment[index].SL_y += 10; } int main() { mciSendString("open racing.mp3", 0, 0, 0); mciSendString("play racing.mp3 repeat", 0, 0, 0); srand((unsigned int)time(NULL)); loadResource(); initgraph(WINDOWW,WINDOWH,1); for (int i = 0; i < 16; i++) { initLine(i); } for (int i = 1; i < 4; i++) { initCarEmemy(i); } while (1) { BeginBatchDraw(); drawLayout(); for (int i = 0; i < 16; i++) { drawLine(i); } if (Timer(25,4)) { for (int i = 15; i >=0; i--) { moveLine(i); if (lineSegment[i].FL_y >= WINDOWH) { reInitLine(i); } } } for (int i = 1; i < 4; i++) { showCar(i); moveCar(i); if (isInitD(i)) { initCarEmemy(i); } } showCar(0); moveCar(0); EndBatchDraw(); } closegraph(); return 0; }