自制小游戏 《逆行》
2021-1-29 ~ 2022-1-16
(0)
A,D键躲避迎面而来的车辆。
所需图片资源:
#include <graphics.h>
#include <time.h>
#include <stdio.h>
#include <string>
#include <tchar.h>
#include <iostream>
#include <conio.h>
using namespace std;
IMAGE Texture_BK; //背景图
IMAGE Texture_Car; //车
IMAGE Texture_Car2; //车2
IMAGE Texture_BCar; //车掩码
IMAGE Texture_BCar2;//车掩码2
struct player
{
int x;
int road_type;
int time;
bool Ctrl;
void init() {
Ctrl = false;
time = 0;
}
void Draw()
{
if (Ctrl == true)
{
if (time == 0)
{
Ctrl = false;
time = 0;
}
if (time > 0)
{
time--;
}
}
if (road_type == 0)
{
x = 5 + (100 / 30)*time;
putimage(5 + (100 / 30)*time, 420, &Texture_BCar, NOTSRCERASE);
putimage(5 + (100 / 30)*time, 420, &Texture_Car, SRCINVERT);
}
else if (road_type == 1)
{
x = 115 - (100 / 30)*time;
putimage(115 - (100 / 30)*time, 420, &Texture_BCar, NOTSRCERASE);
putimage(115 - (100 / 30)*time, 420, &Texture_Car, SRCINVERT);
}
}
}Player;
struct Car {
int road_type;//在哪条道
int y;//高度
int speed;
void initCar() {
y = -98;
road_type = 0;
speed = 10;
}
bool Draw()
{
if(y<610)y+=speed;
else
{
return false;
}
if (road_type == 0)
{
putimage(5, y, &Texture_BCar2, NOTSRCERASE);
putimage(5, y, &Texture_Car2, SRCINVERT);
return true;
}
if (road_type == 1)
{
putimage(115, y, &Texture_BCar2, NOTSRCERASE);
putimage(115, y, &Texture_Car2, SRCINVERT);
return true;
}
}
};
//返回游戏分数
int PlayGame()
{
int By = 0;
long int Time=0;//坚持时间
Car car;
car.initCar();
car.speed = 6;
while (true)
{
switch (Time /60)
{
case 100:car.speed = 7; break;
case 200:car.speed = 8; break;
case 400:car.speed = 9; break;
case 600:car.speed = 10; break;
default:
break;
}
//清屏
cleardevice();
//控制Player
if (Player.road_type == 1 && GetAsyncKeyState('A') && Player.Ctrl == false)
{
Player.road_type = 0;
Player.time = 30;
Player.Ctrl = true;
}
if (Player.road_type == 0 && GetAsyncKeyState('D') && Player.Ctrl == false)
{
Player.road_type = 1;
Player.time = 30;
Player.Ctrl = true;
}
//移动背景图
if (By < 610) {
By += 5;
}
else {
By = 0;
}
//绘制背景图
putimage(0, By, &Texture_BK);
putimage(0, By - 610, &Texture_BK);
//绘制玩家
Player.Draw();
//绘制车辆
if (car.Draw() == false)
{
if (rand() % 20 == 1)
{
car.y = -190;
if (rand() % 2 == 0)
{
car.road_type = 0;
}
else
{
car.road_type = 1;
}
}
}
//绘制分数
settextcolor(RGB(255,255,255));
char dit[32];
sprintf_s(dit, "时间:%d秒", Time / 60);
outtextxy(0, 0, dit);
int x = 5;
if (car.road_type == 1)x = 115;
//对玩家和车数据进行判断是否发生碰撞
//判断玩家4个顶点,是否在 其他车的四个顶点中心,只要有一个在中心就被判断为被碰撞
if (( //判断左上角
Player.x >= x&&
Player.x<=x + 98 &&
420 >=car.y &&
420 <= car.y + 180
) || (//判断右上角
Player.x +98>= x &&
Player.x +98<= x + 98 &&
420 >= car.y &&
420 <= car.y + 180
) || (//判断左下角
Player.x >= x &&
Player.x <= x + 98 &&
420+180 >= car.y &&
420 +180 <= car.y + 180
) || (//判断右下角
Player.x + 98 >= x &&
Player.x + 98 <= x + 98 &&
420 + 180 >= car.y &&
420 + 180 <= car.y + 180
)
)
{
setlinecolor(RGB(255, 0, 0));
rectangle(x, car.y, x + 98, car.y + 180);
setlinecolor(RGB(0, 255, 0));
rectangle(Player.x, 420, Player.x + 98, 420 + 180);
FlushBatchDraw();
Sleep(1000);
return Time/60;
}
//输出之前绘制的缓冲
FlushBatchDraw();
//锁帧60帧,1000/60=16.6..
Sleep(16.6);
Time++;
}
return -1;
}
int _tmain(int argc, _TCHAR* argv[])
{
//加载素材
loadimage(&Texture_BK, "res\\road.png");
loadimage(&Texture_Car, "res\\Car.png");
loadimage(&Texture_BCar, "res\\Car0.png");
loadimage(&Texture_BCar2, "res\\Car01.png");
loadimage(&Texture_Car2, "res\\Car2.png");
initgraph(218, 610);
setbkcolor(RGB(255, 255, 255));
BeginBatchDraw();
int score=-1;
while (true)
{
if (MouseHit()&& GetMouseMsg().mkLButton==true)
{
FlushMouseMsgBuffer();//清空鼠标缓存
score=PlayGame();
}
putimage(0,0,&Texture_BK);
setbkmode(TRANSPARENT);
settextcolor(RGB(0,0,0));
char ps[] = "点击任意处开始游戏";
outtextxy(210/2-textwidth(ps)/2,610/2-textheight(ps)/2, ps);
if (score != -1)
{
settextcolor(RGB(0, 255, 64));
char Sscore[32];
sprintf_s(Sscore, "分数:%d", score);
outtextxy(210 / 2 - textwidth(Sscore) / 2, 610 / 2 - textheight(Sscore) / 2-32, Sscore);
}
FlushBatchDraw();
}
return 0;
}
添加评论
取消回复