【2D平台跳跃游戏 - 03】场景
场景基类
思路
场景基类有五个方法:
on_enter()
:处理进入场景时的逻辑on_exit()
:处理退出场景时的逻辑on_input()
:处理场景接收输入时的逻辑on_update()
:处理场景更新的逻辑on_draw()
:处理场景绘制时的逻辑
场景基类中的方法都定义为了虚函数,后续的具体子类场景都需要重写自己的方法
使用继承的方法实现场景是为了使用指针配合虚函数实现跳转场景
每个子类具体场景中实现自己的逻辑
具体实现
#include "camera.h"
#include <graphics.h>
// 场景基类
class Scene
{
public:
Scene() = default;
~Scene() = default;
virtual void on_enter() { }
virtual void on_update(int delta) { }
virtual void on_draw(const Camera& camera) { }
virtual void on_input(const ExMessage& msg) { }
virtual void on_exit() { }
};
场景管理器
思路
场景管理器持有所有场景的引用(指针)
场景管理器中使用指针维护着当前是哪个场景;
并使用虚函数继承的方式,切换指针指向来跳转场景
在场景管理器中的跳转场景方法中,使用了枚举类用于屏蔽具体的指针
场景跳转方法中:
- 调用当前场景的退出方法
- 根据传递的参数修改当前场景指针的指向
- 调用当前场景的进入方法
场景管理器中同样有输入、绘图和更新三个方法,每个方法中都调用了当前场景对应的方法;
这样可以使主函数中只需要调用场景管理器的对应方法,不需要关注当前场景;
具体方法调用由场景管理器维护
具体实现
#include "scene.h"
extern Scene* menu_scene;
extern Scene* game_scene;
extern Scene* selector_scene;
// 场景管理器
class SceneManager
{
public:
enum class SceneType
{
Menu,
Game,
Selector
};
public:
SceneManager() = default;
~SceneManager() = default;
// 设置当前场景
void set_current_scene(Scene* scene)
{
current_scene = scene;
current_scene->on_enter();
}
// 场景切换
void switch_to(SceneType type)
{
current_scene->on_exit();
switch (type)
{
case SceneType::Menu:
current_scene = menu_scene;
break;
case SceneType::Game:
current_scene = game_scene;
break;
case SceneType::Selector:
current_scene = selector_scene;
break;
default:
break;
}
current_scene->on_enter();
}
void on_update(int delta)
{
current_scene->on_update(delta);
}
void on_draw(const Camera& camera)
{
current_scene->on_draw(camera);
}
void on_input(const ExMessage& msg)
{
current_scene->on_input(msg);
}
private:
Scene* current_scene = nullptr;
};
评论区