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实现相关推荐

  1. 诺基亚6300手机游戏下载_回忆杀!重温那些年你一定玩过的经典手机游戏,快看你玩过几个?...

    虽然现在的手机功能非常齐全,游戏更是多种多样,游戏体验越来越真实.酷炫,但它们带给我们的乐趣却大不如前了.有时候还挺怀念以前玩着简单游戏的日子,现在想起来还是让人记忆深刻. 今天就来一波回忆杀,带大家 ...

  2. python经典小游戏-用Python设计一个经典小游戏:猜大小

    码农那点事儿 关注我们,一起学习进步 本文主要介绍如何用Python设计一个经典小游戏:猜大小. 游戏规则: 初始本金是1000元,默认赔率是1倍,赢了,获得一倍金额,输了,扣除1倍金额. 玩家选择下 ...

  3. 20行python代码的入门级小游戏-用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  4. python经典小游戏-用Python设计一个经典小游戏

    本文主要介绍如何用Python设计一个经典小游戏:猜大小. 在这个游戏中,将用到前面我介绍过的所有内容:变量的使用.参数传递.函数设计.条件控制和循环等,做个整体的总结和复习. 游戏规则: 初始本金是 ...

  5. [安全攻防进阶篇] 一.什么是逆向分析、逆向分析应用及经典扫雷游戏逆向

    从2019年7月开始,我来到了一个陌生的专业--网络空间安全.初入安全领域,是非常痛苦和难受的,要学的东西太多.涉及面太广,但好在自己通过分享100篇"网络安全自学"系列文章,艰难 ...

  6. python拼图游戏代码_GitHub 上哪些勾起回忆的经典小游戏(Python)

    经常有人问我 Python 能开发游戏吗?今天就直接给大家推荐一个汇集多款经典小游戏的Github项目:Free Python Games. 项目地址:grantjenks/free-python-g ...

  7. c语言经典游戏,C语言——经典小游戏——打砖块

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 C语言--经典小游戏--打砖块 玩法:按A与D控制球拍的移动,按S暂停游戏 百度网盘下载:http://pan.baidu.com/s/1o64ECTc ...

  8. Windows经典小游戏--扫雷精装版

    Windows经典小游戏–扫雷精装版 最开始玩的电脑游戏就是蜘蛛纸牌和扫雷了,那时候觉得很神奇的事情现在自己也可以做了.下面就展示一下C语言扫雷的代码. 首先创建一个"扫雷"的项目 ...

  9. 经典小游戏(密室逃脱全集+答案)

    经典小游戏--密室逃脱全集(有答案) 转自月影梦魇原来玩过的一个小游戏 最近想起来想发给大家玩一下   有一点小难度的哦   看谁可以出得来密室   一共有三个密室 这三个游戏是有一点相连的 蓝色房间 ...

最新文章

  1. Pentaho Data Integration 界面开发
  2. Mysql生成连续时间段记录
  3. 计量经济学计算机答案第三章,计量经济学第三章习题及答案
  4. 对”命令“操作的命令
  5. 使用NPOI和委托做EXCEL导出
  6. catia保存成stp文件时部件丢失_电脑硬盘恢复教程,简单复原硬盘丢失数据的做法...
  7. mfc编程vc6.0实现进程的创建和通信_免费送书:windows黑客编程技术详解
  8. 事业编考试计算机专业部分,事业单位考试计算机专业知识汇总-单选题.pdf
  9. SpringMVC【开发Controller】详解
  10. NXOPEN/UG二次开发C#---获取NX的版本
  11. Java学习——生产者-消费者模式与线程通信问题(管程法、信号灯法)
  12. 【OWASP TOP10】2021全球十大常见安全漏洞
  13. python怎么计算百分比_python计算两个数的百分比方法
  14. 哔哩哔哩 B站挂了!完了,5个9可靠性,超时了!
  15. 生活记录:突然“醒来”
  16. nginx利用反向代理实现获取用户真实ip
  17. 简述GPS,GSM,GPRS和GNSS的名称区别
  18. PHP 正则判断是否是手机号码
  19. Microsoft Mathematics(微软数学软件)
  20. 发明专利申请资料包括哪些

热门文章

  1. JAVA计算斐波那契第100万项的最快算法排名汇总
  2. 三年级优秀书籍推荐_(完整)小学三年级课外阅读书目推荐
  3. SED与AWK学习笔记
  4. 教程篇(7.0) 07. 诊断和故障排除 ❀ FortiClient EMS ❀ Fortinet 网络安全专家 NSE 5
  5. 简易纸牌游戏(C#)
  6. 大学计算机机要学什么知识,高考填志愿:如果想学习人工智能,大学应该学什么专业?...
  7. Java工程师培训课(一)
  8. 基于嵌入式linux 的车载定位系统设计,基于S3C2410嵌入式车载定位系统设计
  9. mysql 游标 导出数据库_数据库 游标for
  10. DIY之配置32G大内存服务器硬件