目 录CONTENT

文章目录

【2D平台跳跃游戏 - 03】场景

千年的霜雪
2024-09-17 / 0 评论 / 0 点赞 / 8 阅读 / 0 字 / 正在检测是否收录...

【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() { }
};

场景管理器

思路

场景管理器持有所有场景的引用(指针)

场景管理器中使用指针维护着当前是哪个场景;
并使用虚函数继承的方式,切换指针指向来跳转场景

在场景管理器中的跳转场景方法中,使用了枚举类用于屏蔽具体的指针

场景跳转方法中:

  1. 调用当前场景的退出方法
  2. 根据传递的参数修改当前场景指针的指向
  3. 调用当前场景的进入方法

场景管理器中同样有输入、绘图和更新三个方法,每个方法中都调用了当前场景对应的方法;
这样可以使主函数中只需要调用场景管理器的对应方法,不需要关注当前场景;
具体方法调用由场景管理器维护

具体实现

#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;
};
0

评论区