一.项目说明:
原作者:奇牛编程 Rock老师
二.完整代码
/*
天天酷跑开发日志
1.创建项目
2.导入素材 res文件夹
3.实际的开发流程
对于初学者开发的最好方式,建议从用户界面入手
选择图形库或者其它引擎
该游戏基于‘easyx'图形库
安装‘easyx'步骤:
在网站上搜索该名字直接下载
成功#include<graphics.h>不标红
1)创建游戏窗口
2)设计游戏背景
a.3层背景不同速度滚动
b.滚动背景的实现,重复滚动同一张图片
3)实现游戏背景
a.加载背景资源
b.渲染(背景知识:坐标)
问题:背景图片的png格式图片出现黑色
引入头文件’tools.h'
4.实现玩家奔跑
角色跑动图形数组循环
c语言 c++ 算法 数据库 windows(win32+mfc) Qt linux服务器
5. 实现玩家跳跃(空格)
6.实现随机小乌龟
7.创建障碍物结构体数据类型
8.使用障碍物结构体后重新初始化
9.封装后多个障碍物的显示
10.实现玩家下蹲技能
11.实现“柱子”障碍物
12.实现血条与计分
13.判断游戏胜利
*/
#include<stdio.h>
#include<graphics.h>
#include<conio.h>
#include<vector>
#include"tools.h"
using namespace std;
#define WIN_WIDTH 1012
#define WIN_HEIGHT 396
#define OBSTACLE_COUNT 10
#define WIN_SCORE 100
IMAGE imgBgs[3];//背景图片 'easyx'带的图片对象
int bgX[3];//背景图片的横坐标
int bgSpeed[3] = {
2,4,8 };//背景移动速度
IMAGE imgHeros[12];
int heroX;//玩家X坐标
int heroY;//玩家Y坐标
int heroIndex;//当前显示第几张玩家图片
bool heroJump;//玩家跳跃状态
int jumpHeightMax;//玩家跳跃的最大高度
int heroJumpOff;//跳跃的偏移量
bool update;//表示是否需要马上刷新画面
int heroBlood;
int score;//分数
//IMAGE imgTortoise;//小乌龟
//int torToiseX;//小乌龟的水平坐标
//int torToiseY;//小乌龟的垂直坐标
//bool torToiseExist;//当前窗口是否有小乌龟
typedef enum {
TORTOISE,
LION,
HOOK1,
HOOK2,
HOOK3,
HOOK4,
OBSTACLE_TYPE_COUNT //表示一共多少怪
}obstacle_type;
//vector<int> data;//可变数组
//IMAGE obstacleImgs[3][12];
vector<vector<IMAGE>>obstacleImgs;//存放所有障碍物的各个图片 行表示哪一种怪,列表示怪的图片
//必须加typedef
typedef struct obstacle{
int type;//障碍物的类型
int imgIndex;//当前显示图片的序号
int x, y;//障碍物坐标
int speed;
int power;//杀伤力
bool exist;
bool hited;//表示是否碰撞
bool passed;//表示是否被跨越
}obstacle_t;
obstacle_t obstacles[OBSTACLE_COUNT];//建立一个怪物池,看有多少怪
int lastObsIndex;
IMAGE imgHeroDown[2];
bool heroDown;
IMAGE imgSZ[10];
//游戏的初始化
void init() {
//创建游戏窗口 长 宽 最好用宏定义,便于日后修改
//'easyx'带的函数 功能:实现窗口初始化
initgraph(WIN_WIDTH, WIN_HEIGHT,EW_SHOWCONSOLE);//EW_SHOWCONSOLE控制台和exe同时出现
//加载背景资源
char name[64];
for (int i = 0; i < 3; i++) {
//'res/bg001.png' 'res/bg002.png' 'res/bg003.png'
//函数功能将各种类型的数据结构造成字符串
//在这里是格式化字符串 03 左边补0 3位数
sprintf(name, "res/bg%03d.png",i+1);
//'easyx'带的函数
//loadimage会报错,解决方案将字符集改为’使用多字节字符集‘
loadimage(&imgBgs[i], name);
}
//加载角色奔跑的图片帧素材
for (int i = 0; i < 12; i++) {
//'res/hero1.png' 'res/hero12.png'
sprintf(name, "res/hero%d.png", i+1);
loadimage(&imgHeros[i], name);
}
//设置玩家的初始位置
heroX = WIN_WIDTH * 0.5 - imgHeros[0].getwidth() * 0.5;
heroY = 345 - imgHeros[0].getheight();
heroIndex=0;
heroJump = false;
jumpHeightMax= 345 - imgHeros[0].getheight()-120;
heroJumpOff = -4;
update = true;
//加载小乌龟素材
//loadimage(&imgTortoise, "res/t1.png");
//torToiseExist = false;
//torToiseY = 345 - imgTortoise.getheight()+4;
//
//加载所有障碍物素材
/*IMAGE imgTort;
loadimage(&imgTort, "res/t1.png");
vector<IMAGE>imgTortArray;
imgTortArray.push_back(imgTort);
obstacleImgs.push_back(imgTortArray);*/
IMAGE imgTort;
vector<IMAGE>imgTortArray;
for (int i = 0; i < 7; i++) {
sprintf(name, "res/t%d.png", i + 1);
loadimage(&imgTort, name);
imgTortArray.push_back(imgTort);
}
obstacleImgs.push_back(imgTortArray);
IMAGE imgLion;
vector<IMAGE>imgLionArray;
for (int i = 0; i < 6; i++) {
sprintf(name, "res/p%d.png", i+1);
loadimage(&imgLion, name);
imgLionArray.push_back(imgLion);
}
obstacleImgs.push_back(imgLionArray);
//初始化障碍物
for (int i = 0; i < OBSTACLE_COUNT; i++) {
obstacles[i].exist = false;
}
//加载下蹲图层
loadimage(&imgHeroDown[0], "res/d1.png");
loadimage(&imgHeroDown[1], "res/d2.png");
heroDown = false;
IMAGE imgH;
for (int i = 0; i < 4; i++) {
vector<IMAGE>imgHookArray;
sprintf(name, "res/h%d.png", i + 1);
loadimage(&imgH, name, 63, 260, true);
imgHookArray.push_back(imgH);
obstacleImgs.push_back(imgHookArray);
}
heroBlood = 100;
//预加载音效
preLoadSound("res/hit.mp3");
mciSendString("play res/bg.mp3 repeat",0,0,0);
lastObsIndex = -1;
score = 0;
//加载得分图片
for (int i = 0; i < 10; i++) {
sprintf(name, "res/sz/%d.png", i);
loadimage(&imgSZ[i], name);
}
}
void createObstacle() {
int i;
for (i = 0; i < OBSTACLE_COUNT; i++) {
if (obstacles[i].exist == false) {
break;
}
}
if (i >= OBSTACLE_COUNT