FDU oop贪吃蛇大作业 学习知识与debug血泪教训
首先先来看一下大作业要求
提供的源代码在https://github.com/jhpy1024/sfSnake,需要使用SFML2.5库
那么我完成大作业过程主要是两个阶段:看代码 + 自己写。而这篇文章主要是在这个过程中我学到了什么。
目录
二、 HandleInput-Update-Render 结构
知识学习
一、 使用SFML库创造一个可以多界面跳转的窗口
重点:shared_ptr
首先是在Game类中使用 sf::RenderWindow window_; 创建一个可视化窗口,然后是该窗口所指向的界面内容,用shared_ptr来实现,static std::shared_ptr Screen; 这里就要学习shared_ptr 是什么了。
shared_ptr作为智能指针,可有效防止指针指向已被释放的内容,并且当没有智能指针指向某内容时,该内容自动释放。具体可参考其他人的文章,在这里主要是利用自动释放的功能。
使用它时,常调用如下函数
std::shared_ptr<Screen> Game::Screen = std::make_shared<MenuScreen>();
其中 是一个类,是的子类。make_shared 函数是创造一个对象,类似于new,返回一个shared_ptr,当没有shared_ptr指向该对象时,该对象自动释放。因此当界面转换时,可以自由将Screen 指向其他对象(再使用一次make_shared)而不用担心释放问题。这个样子可以基本实现创建窗口,并且窗口在不同内容之间转换。
二、 HandleInput-Update-Render 结构
这个结构在源代码中已经做出来了。但需要理解,并且如果要新建一个界面,例如我自己写的setting界面,也是需要自己写这个结构的。
首先,应该通过名字可以显然理解这个结构。在运行程序时,处理输入-更新数据-可视化更新,并且始终执行着这一循环。而循环是这样子实现的:
while (window_.isOpen())
{
sf::Time delta = clock.restart(); // a
timeSinceLastUpdate += delta; // b
while (timeSinceLastUpdate > Game::TimePerFrame)
{
timeSinceLastUpdate -= TimePerFrame;
handleInput();
update(TimePerFrame);
}
render(); // c
}
不难看到,里面有一个很重要的参数:TimePerFrame。它用来控制刷新时间间隔,当超过了该间隔时,才会执行handleInput等操作。但我仍有一点疑问:这样子的话程序在不断地执行a、b、c行的操作,是否会很占cpu?不解。而事实上,运行它的时候我的电脑都开始启动风扇了,明明只是一个贪吃蛇啊= = ----疑问点一
不过这里循环是源代码就有的,不太需要自己处理。接下来看一下这一循环中的函数。</