C++是如何从代码到游戏的?

news/2024/7/1 8:46:15

点击上方“小白学视觉”,选择加"星标"或“置顶”

重磅干货,第一时间送达f84da8fabca243276cfcb3f9e3bcb7ee.png

C++是如何从代码到游戏的?

嗯.

这个简单啊。

你既然问C++了,那我问你,现在,我有一个Student类。C++怎么创建一个学生类的对象?

// 嗯我会!有两种方式:
Student s;
Student *s2 = new Student("张三");

那好,现在这学生的行为有:吃饭,睡觉,上网课。现在你执行个上网课的行为,怎么做?

// 简单啊
s2->upNetworkClass();

通过对象调用成员函数不就成了么。

嗯,上面的代码在学校里都写过吧?有这个基础就够了。

那游戏是啥?无非是一堆图形堆叠呗,把上面的Student类换成窗体类,换成控件类,换成游戏中不同的元素类,然后再组合起来不就完了么。

呐现在,我告诉你,有一个窗体类,叫QWidget,它有一个行为叫show,可以显示窗体。你给我生成一个窗体并显示出来。那就照葫芦画瓢呗:

QWidget *w = new QWidget();
w->show();

来我们看看效果:

a0cdf62091fd3f6c7788c9f08aac6e87.png

呀,有点意思哈?但是这距离游戏还差远呢啊。你这窗体也太丑了不是。

没事,窗体丑不要紧,我们给她美化一下!

TDWidget * w = new TDWidget(":/img/welcome.png");
w->show();

QWidget换成了TDWidget,构造函数里传了一张图片,没超纲吧。再看看效果:

54ec997ece5dcabbc975db417f9f1ae9.png

诶?事情好像开始变得有趣了起来?

但还是不够,我这是游戏,要交互的!你这一张死图能干啥。

交互嘛!加个按钮不完了?我给你一个按钮类,这个类有一个move()行为,可以把自己移动到画面的任何地方。你知道你想要的按钮怎么来了吗?

QPushButton * btn = new QPushButton("按钮",w); //第二个参数代表它属于哪个窗体,如果不写,它就会生成在屏幕上而不是窗体里
btn->move(330,450);

瞅瞅:

a93f74374fac79ed4849af66a8926c20.png

em.......你这按钮,有是有,画风有点突兀了吧。

没事,再美化一下嘛:

TDPushButton *btn = new TDPushButton(":/img/begin_normal.png", // 常规图片":/img/begin_hover.png", // 鼠标悬停的图片":/img/begin_press.png", // 鼠标按下的图片w);    // 父控件
btn->move(330,450);

效果:

70e567121343590deb5fd1350eac0468.png

呀 可以啊。快快快,然后呢,点开始游戏,进入游戏界面!这个咋做?

嗯.....其实界面切换你自己已经会了。

你这个界面不就是一个窗体,想切换界面的话.....你把这个窗体关了,再换张图片开一个新的不就完了。

新的窗体用一张传新的图片做背景,我再顺手给加上四个按钮,代码不贴了,就是上面的代码复制粘贴改改坐标,改改图片:

接下来就是游戏的主体部分了,也巨简单,有图就行:

TDMenuButton *btn1 = new TDMenuButton(":/img/1_normal.png",":/img/1_hover.png",":/img/1_selected.png",this);
btn1->move(100,100);
TDMenuButton *btn2 = new TDMenuButton(":/img/1_normal.png",":/img/1_hover.png",":/img/1_selected.png",this);
btn2->move(165,100);
TDMenuButton *btn3 = new TDMenuButton(":/img/1_normal.png",":/img/1_hover.png",":/img/1_selected.png",this);
btn3->move(100,165);

三个按钮,和上面的TDPushButton没区别,就是换成了TDMenuButton对不对,没超纲吧。

只要你的图片够美,就能生成这样:

6f645b40c403824efdd15d2027e8041a.png

一个按钮会写,三个按钮也会写,既然学了点C++都想做游戏了,循环总会写吧:

for(int i = 0; i < 11 ; i++){for(int j = 0; j < 6; j++){TDMenuButton * btn = new TDMenuButton(":/img/1_normal.png",":/img/1_hover.png",":/img/1_selected.png",this);btn->move(100+i*65,100+j*65);}}

效果:(密恐福利)

5cfcfb558e099aafedbda490dadf8978.png

这.....怎么还有点一言难尽呢......

循环会写,随机数会写吗?随机个头像行吗?

09f2cbc5921a7c78f1827dea97d7ec9b.png

嗯......这下终于像点样了。

最后再加亿点点核心逻辑:点击两个相同的图片,判断它能不能连通,如果能连通,就把这两个按钮直接delete掉,效果就是酱紫:

d4b6435ebeeda3554b5feedd95cae453.gif

就是这样咯,从你学过的C++基础语法,结合现有的框架控件,就可以撸这样一个简单的连连看。

当然了,为了点燃你题目里想要的学习热情,我故意避开一些以你现有知识可能听不懂的部分,还有一些逻辑比较绕的部分。比如:

避开了注册按钮的回调,

避开了随机生成图片的时候要保证成对出现的算法,

避开了把这些按钮和数据做关联,

避开了如何通过数据计算两点能否连通,

等等

但这都不重要,不妨碍你简单体验一下C++是如何从代码到游戏的这个过程。

分割线

从图片素材上你们也看出来了,这代码是两三年前的,那个时候还在做培训机构的辅导老师,学生们爱打游戏,不好好上课,就做的这个上课带她们写:

https://github.com/TheThreeDog/PictureMatching

因为本身我不打荣耀,所以里面的头像确实一个也不认识,都是那时候为了勾引学生好好上课,现在游戏里的头像应该有不少都更新好几茬儿了。

这个玩意儿是用Qt C++写的。因为本身对帧率没什么要求,所以基于Qt就可以搞。如果要玩一些真正的游戏(画面需要帧率级别的刷新的),一定要上游戏引擎写的。cocos2d unity3d 什么的。

当然,我上面说游戏无非是一堆图形堆叠呗只是为了讲解故意压低一下难度,真正的游戏开发是非常复杂庞大的。

这个小项目确实像上面写的一样,用了大量的TD开头的控件。这个源自于我的一个开源框架叫做TD-Framework

http://www.threedog.top/

因为我叫三级狗(ThreeDog)所以控件普遍用TD开头。Qt本身没有提供这种直接用图片构造控件的方法,所以就自己造了一些。

写下它的时候还是大四刚毕业,那时候我还把这玩意儿叫框架,现在... 我觉得还是叫玩具更合适些:跨平台编译不过,函数指针强转有问题,代码也写的乱七八糟....

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

b5640ca1d6512973075e2a3327002a01.png

abe792497ee8c59d622ddf74ddf3c76b.png


http://lihuaxi.xjx100.cn/news/272488.html

相关文章

Ubuntu 系统 文件操作命令

文件和目录的操作 用户主目录下有一个 Desktop (对应,桌面)mkdir dir1 建立一个目录cd 不添加参数,默认回到主目录(用户目录)touch a.txt 建立一个文件mv a.txt Desktop/ 移动到Desktop/中 mkdir dir1cp -r dir1/ dir2 不加-r或者&#xff0d;R的时候&#xff0c;只拷贝文件&am…

Zookeeper集群部署和使用

Zookeeper 由 Apache Hadoop 的 Zookeeper 子项目发展而来&#xff0c;Google Chubby的一个开源实现。它是一个分布式应用程序协调服务&#xff0c;提供的功能包括&#xff1a;配置管理&#xff0c;名字服务&#xff0c;提供分布式同步、队列管理、集群管理等。 从设计模式角度…

python爬虫如何配置动态爬虫代理

很多网站会检测某一段时间某个IP的访问次数(通过流量统计&#xff0c;系统日志等)&#xff0c;如果访问次数多的不像正常人&#xff0c;它会禁止这个IP的访问。 所以我们可以设置一些代理服务器&#xff0c;每隔一段时间换一个代理&#xff0c;就算IP被禁止&#xff0c;依然可以…

用于小型图形挖掘研究的瑞士军刀:空手道俱乐部的图表学习Python库

作者 | Benedek Rozemberczki译者 | 天道酬勤 责编 | Carol出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09;空手道俱乐部&#xff08;Karate Club&#xff09;是NetworkX Python软件包的无监督机器学习扩展库。详细可以参阅此处的文档&#xff1a;https://github.com…

送一台高清航拍无人机

最近有粉丝留言让我多搞些抽奖活动&#xff0c;为了感谢大家对本公众号的大力支持本次联合了11个号主&#xff0c;送无人机4K航拍&#xff0c;祝所有人新的一年工作顺利&#xff0c;工资芝麻开花节节高&#xff0c;希望本次抽奖可以给你带来好运。生活不易&#xff0c;望大家来…

实战:使用Nginx限流

点击上方“方志朋”&#xff0c;选择“设为星标”回复”666“获取新整理的面试文章来源&#xff1a;深入浅出大型网站架构设计Nginx不仅可以做Web服务器、做反向代理、负载均衡&#xff0c;还可以做限流系统。此处我们就Nginx为例&#xff0c;介绍一下如何配置一个限流系统。Ng…

ucos

优先级反转&#xff1a;有信号量的时候&#xff0c;不同任务共用一个信号量&#xff0c;如果信号量没释放就可能出现优先级反转。 μC/OS-Ⅱ支持的处理器的堆栈既可以从上(高地址)往下(低地址)递减也可以从下往上递增。用户在调用OSTaskCreate() 的时候必须知道堆栈是递增的还是…

一步一步粗谈linux文件系统(三)----超级块(superblock)【转】

本文转载自&#xff1a;https://blog.csdn.net/fenglifeng1987/article/details/8302921 超级块是来描述整个文件系统信息的&#xff0c;可以说是一个全局的数据结构&#xff0c;可以把它理解成文件系统的心脏 比较简单的文件系统中&#xff08;如ramfs和sysfs&#xff09;&…