仿写酷跑小程序-----C语言

一.项目说明:

原作者:奇牛编程 Rock老师

链接:C语言手写天天酷跑_哔哩哔哩_bilibili

二.完整代码

/*
	天天酷跑开发日志
	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 
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值