经典诺基亚游戏Rapid-Roll SDL2实现
Rapid-Roll
A classical game in Nokia, which is implemented by SDL2 & C/C++
项目地址:https://github.com/Joke-Lin/Rapid-Roll
游戏介绍
一个经典的诺基亚小游戏 --------- 彩球滑梯
- 通过 A/D 控制小球左右移动,接触到尖刺失去一条生命;吃到红色小球增加一条生命;生命上限为5条
- 难度随分数的增加越来越大,分数达到10000难度封顶 (通过加大障碍物移动速度增加难度)
- 开始和结束界面均设置按钮,开始界面为开始游戏,结束界面为重新开始,不单独设置退出,直接点击关闭窗口即可退出
- P键即可暂停游戏,在按 A/D 继续游戏
Demo:
1、开始界面
2、运行界面
3、游戏结束界面
文件目录
源代码只有一个main.cpp在Rapid-Roll工程目录下
├─EXE # 项目最后编译结果,exe所在目录
│ └─src # 资源文件
│ ├─Audio # 音效文件
│ └─TTF # 字体文件
└─Rapid-Roll # 工程目录 Visual Studio 结构
├─Debug # Debug文件夹
│ └─src
│ ├─Audio
│ └─TTF
└─Rapid-Roll # 工程文件
├─Debug
│ └─Rapid-Roll.tlog
├─Release
│ └─Rapid-Roll.tlog
├─Audio
└─TTF
项目环境
SDL2 + Visual Studio 2017 开发,代码编码格式为 GB2312
- 外部链接库:SDL2.lib & SDL2_ttf.lib & SDL2_mixer.lib
- 包含目录:SDL2相关库的include所在目录
- 库目录:SDL2相关库libs所在目录
- 常规:取消SDL检查
- 链接器
- 附加依赖项:
- SDL2main.lib
- SDL2.lib
- SDL2_ttf.lib
- SDL2_mixer.lib
- 子系统:
- 窗口 (/SUBSYSTEM:WINDOWS)
- 高级:
- 入口点:mainCRTStartup
- 附加依赖项:
代码解释
#define SDL_MAIN_HANDLED
重定义main函数入口,SDL将main重定义,参考 SDL_main(...)
class BackGround; // 背景图 以及游戏的一些环境参数
class Ball; // 球类
class Board; // 板/障碍物
class BoardManager; // 板管理器:控制障碍物的出现以及运动
class Game; // 游戏流程总控(开始动画,主循环,结束动画)以及音效,图片资源的加载
class Life; // 获取额外生命系统
class BoardThorn; // 含刺的障碍物
游戏未特别设置帧率,采用SDL_RENDERER_PRESENTVSYNC
默认为 60 fps
SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);
init(): 初始化环境
bool init()
{if (SDL_Init(SDL_INIT_EVERYTHING) != 0) {std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl;return false;}if (TTF_Init() == -1) {cout << TTF_GetError() << endl;return false;}if (Mix_Init(MIX_INIT_MP3) != 0) {cout << Mix_GetError() << endl;return false;}window = SDL_CreateWindow(BackGround::windowName, SDL_WINDOWPOS_UNDEFINED, SDL_WINDOWPOS_UNDEFINED, WIDTH, HEIGHT, SDL_WINDOW_SHOWN);render = SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);font = TTF_OpenFont(BackGround::fontPath, 100);Mix_OpenAudio(22050, MIX_DEFAULT_FORMAT, 2, 4096);if (window == NULL || render == NULL || font == NULL) {cout << SDL_GetError() << endl;return false;}return true;
}
Game类:游戏总控制,开始,运行,结束
class Game {private:SDL_Texture *title; // 标题纹理SDL_Texture *startGame; // 开始按钮纹理SDL_Texture *authorInfo; // 开发者信息纹理SDL_Texture *score; // 分数纹理 --- 在GameOver中初始化SDL_Texture *rePlay; // 重新开始纹理SDL_Texture *gameOverTitle; // 结束标题void drawStartGame(SDL_Color color);// 绘制开始游戏按钮,鼠标在上改变颜色void drawGameOver(SDL_Color color); // 同上bool isInStart(int x, int y); // 判断是否点击开始键bool GameOver(); // 和welcome差不多
public:Game();bool welcome(); // 欢迎界面void run(); // 游戏运行void quit();Mix_Music *bgm; // 背景音乐static Mix_Chunk *takeOff; // 球碰到障碍物音效static Mix_Chunk *bump; // 球破裂(损失生命)音效static Mix_Chunk *gameOver; // 游戏结束音效static bool isBump; // 判断是否撞到
};
BackGround类:运行时背景绘制,游戏运行环境参数
class BackGround {private:SDL_Color bkColor;SDL_Rect scoreTextPos;void drawTranigle(int st_, int edgePos_, bool flag_);void drawFence();
public:const static int tranigleSize = 10; // 障碍组成的小三角形的底边大小const static int up = 12; // 上尖刺底边const static int down = HEIGHT; // 下尖刺底边const static int ballSize = 15; // 球大小const static int boardWidth = 80; // 障碍物宽const static int maxLife = 5; // 最多大生命值const static float ballSpeedV; const static float ballSpeedH;const static char *windowName;const static char *fontPath; // 以下,导入外部资源的路径const static char *bumpPath;const static char *takeOffPath;const static char *bgmPath;const static char *gameOverPath;const static char *catImgPath;static int boardHeight;static float boardSpeed;static int life;static int score;static bool isDie;BackGround(SDL_Color bkColor_);void draw();
};
Ball类:移动,碰撞判断
// 由于SDL没有画圆函数所以由两个矩形和一个正方形模拟
class Ball {private:int size; // 球的大小SDL_Point pos; // 位置float speedV;float speedH;public:friend Life;Ball(int size_, SDL_Point pos_, float speedV_ = 0, float speedH_ = 0);bool isBump(Board &board_); // 判断是否与板相撞void move(BoardManager &board_, int type, bool isMusicOn = true);void draw(SDL_Color color = { 0,0,0,0xff });
};
Board类:障碍物
class Board {private:float speedV;int width;int height;SDL_Point pos; // 中心点位置SDL_Color color;// 颜色
public:friend Ball;friend BoardManager;friend Life;friend BoardThorn;Board(SDL_Point pos_, int width_, int height_, float speedV_ = 0, SDL_Color color_ = { 0,0,0,0xff });void move();virtual void draw();
};
BoardThorn类:尖刺障碍物,继承与Board
class BoardThorn :public Board {public:BoardThorn(SDL_Point pos_, int width_, int height_, float speedV_ = 0, SDL_Color color_ = { 0,0,0,0xff });void draw();
};
BoardManager类:管理障碍物的出现及消失
class BoardManager {private:vector<Board> boards; // 管理所有板bool isOut(Board &board_); // 判断是否出界void clearInlegal(); // 清除非法板(即出界)int GAP; // 下一个板生成的时间间隔BoardThorn boardThorn;bool isThornExist;
public:friend Ball;friend Life;BoardManager();void move();void draw();void creatABoard(int* last, int now); // 随机产生一个板
};
Life类:生命球
class Life {const int lifeSize = 10;const SDL_Color lifeColor = { 0xff,0,0,0xff };Ball ball;bool isCreat;
public:Life();void reSet(); // 配合重新开始游戏void creatALife(int clocks, BoardManager boards); // 生成一个生命,生命球移动也在此,每一次主循环均要调用bool isEatALife(Ball ball_); // 判断是否吃到
};
经典诺基亚游戏Rapid-Roll SDL2实现相关推荐
- 诺基亚6300手机游戏下载_回忆杀!重温那些年你一定玩过的经典手机游戏,快看你玩过几个?...
虽然现在的手机功能非常齐全,游戏更是多种多样,游戏体验越来越真实.酷炫,但它们带给我们的乐趣却大不如前了.有时候还挺怀念以前玩着简单游戏的日子,现在想起来还是让人记忆深刻. 今天就来一波回忆杀,带大家 ...
- python经典小游戏-用Python设计一个经典小游戏:猜大小
码农那点事儿 关注我们,一起学习进步 本文主要介绍如何用Python设计一个经典小游戏:猜大小. 游戏规则: 初始本金是1000元,默认赔率是1倍,赢了,获得一倍金额,输了,扣除1倍金额. 玩家选择下 ...
- 20行python代码的入门级小游戏-用Python设计一个经典小游戏
本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...
- python经典小游戏-用Python设计一个经典小游戏
本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...
- [安全攻防进阶篇] 一.什么是逆向分析、逆向分析应用及经典扫雷游戏逆向
从2019年7月开始,我来到了一个陌生的专业--网络空间安全.初入安全领域,是非常痛苦和难受的,要学的东西太多.涉及面太广,但好在自己通过分享100篇"网络安全自学"系列文章,艰难 ...
- python拼图游戏代码_GitHub 上哪些勾起回忆的经典小游戏(Python)
经常有人问我 Python 能开发游戏吗?今天就直接给大家推荐一个汇集多款经典小游戏的Github项目:Free Python Games. 项目地址:grantjenks/free-python-g ...
- c语言经典游戏,C语言——经典小游戏——打砖块
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言--经典小游戏--打砖块 玩法:按A与D控制球拍的移动,按S暂停游戏 百度网盘下载:http://pan.baidu.com/s/1o64ECTc ...
- Windows经典小游戏--扫雷精装版
Windows经典小游戏–扫雷精装版 最开始玩的电脑游戏就是蜘蛛纸牌和扫雷了,那时候觉得很神奇的事情现在自己也可以做了.下面就展示一下C语言扫雷的代码. 首先创建一个"扫雷"的项目 ...
- 经典小游戏(密室逃脱全集+答案)
经典小游戏--密室逃脱全集(有答案) 转自月影梦魇原来玩过的一个小游戏 最近想起来想发给大家玩一下 有一点小难度的哦 看谁可以出得来密室 一共有三个密室 这三个游戏是有一点相连的 蓝色房间 ...
最新文章
- Pentaho Data Integration 界面开发
- Mysql生成连续时间段记录
- 计量经济学计算机答案第三章,计量经济学第三章习题及答案
- 对”命令“操作的命令
- 使用NPOI和委托做EXCEL导出
- catia保存成stp文件时部件丢失_电脑硬盘恢复教程,简单复原硬盘丢失数据的做法...
- mfc编程vc6.0实现进程的创建和通信_免费送书:windows黑客编程技术详解
- 事业编考试计算机专业部分,事业单位考试计算机专业知识汇总-单选题.pdf
- SpringMVC【开发Controller】详解
- NXOPEN/UG二次开发C#---获取NX的版本
- Java学习——生产者-消费者模式与线程通信问题(管程法、信号灯法)
- 【OWASP TOP10】2021全球十大常见安全漏洞
- python怎么计算百分比_python计算两个数的百分比方法
- 哔哩哔哩 B站挂了!完了,5个9可靠性,超时了!
- 生活记录:突然“醒来”
- nginx利用反向代理实现获取用户真实ip
- 简述GPS,GSM,GPRS和GNSS的名称区别
- PHP 正则判断是否是手机号码
- Microsoft Mathematics(微软数学软件)
- 发明专利申请资料包括哪些
热门文章
- JAVA计算斐波那契第100万项的最快算法排名汇总
- 三年级优秀书籍推荐_(完整)小学三年级课外阅读书目推荐
- SED与AWK学习笔记
- 教程篇(7.0) 07. 诊断和故障排除 ❀ FortiClient EMS ❀ Fortinet 网络安全专家 NSE 5
- 简易纸牌游戏(C#)
- 大学计算机机要学什么知识,高考填志愿:如果想学习人工智能,大学应该学什么专业?...
- Java工程师培训课(一)
- 基于嵌入式linux 的车载定位系统设计,基于S3C2410嵌入式车载定位系统设计
- mysql 游标 导出数据库_数据库 游标for
- DIY之配置32G大内存服务器硬件