在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:lcyzgdy/AnEngine开源软件地址:https://github.com/lcyzgdy/AnEngine开源编程语言:C++ 62.3%开源软件介绍:AnEngineAnEngine是一个使用DirectX 12开发的尚未完成的游戏引擎。之前的作用是完成图形学作业,现在没什么作用。 目前已经支持C++ 17标准。 特征
正在开发的功能
已完成功能
ECS-Behaviour目前只实现了 Transform 系列,如坐标变换功能。System 有两种,一种是可并行的,继承自 IParaller,另一种是不可并行的。
class IParaller
{
public:
bool Check() = 0;
void Execute(size_t index) = 0;
size_t Length;
} Check中判断当前 index 的 GameObject 是否可被该 System 执行,每次执行都检查会降低效率,但目前没有找到更好的办法。 内存分布(以 Transform 为例):
对于不可并行却要用 ECS System 的,继承自该类。但对于串行执行的,一般都有彼此间的依赖,如果数量不多建议使用 Behaviour。
对于 ECS 模式,数据和逻辑是分离的,但对于 Behaviour,数据和逻辑是放在一起的。其中 BeforeUpdate() 在 System 调度前调用,Update()和 LateUpdate() 在 System 调度后调用。 状态机状态机(State Machine)在命名空间AnEngine::Game中,继承自 ObjectBehaviour 类。一个状态机包括参数、状态和转移条件。在引入 ECS 后,状态机暂时只针对 Behaviour 起作用。
void SetInt(std::wstring&& name, int value);
void SetBool(std::wstring&& name, bool value);
void SetFloat(std::wstring&& name, float value);
void SetTrigger(std::wstring&& name);
int CreateNewState(std::wstring&& name, const std::function<void()>& func);
int CreateNewState(std::wstring&& name, std::function<void()>&& func);
void CreateStateTransCondition(uint32_t from, uint32_t to, std::wstring&& paramName, uint32_t newValue, Condition cond);
void CreateStateTransCondition(uint32_t from, uint32_t to, std::wstring&& paramName, float newValue, Condition cond);
void CreateStateTransCondition(uint32_t from, uint32_t to, std::wstring&& paramName, bool newValue, Condition cond);
void CreateStateTransCondition(uint32_t from, uint32_t to, std::wstring&& tiggerName); 系统要求
开始在Window项目中新建头文件和源文件(Test.h,Test.cpp),头文件中引用 Driver.h。
#pragma once
#include "Driver.h"
void LoadScene();
class TestCamera : public AnEngine::Game::ObjectBehaviour
{
protected:
virtual void Update() override;
public:
TestCamera();
};
为了保证最基本的图形渲染,我们需要一个场景,并在场景中添加照相机。因此在Test.h中声明了一个函数LoadScene()和一个类TestCamera。TestCamera继承自ObjectBehaviour,表示这是场景中一个组件。这里测试状态机类StateMachine
#include "Test.h"
using namespace AnEngine;
using namespace AnEngine::Game;
using namespace AnEngine::RenderCore;
Scene* testScene;
Camera* testCamera;
void LoadScene()
{
testScene = new Scene(L"Test Scene");
GameObject* testCameraObject = new GameObject(L"Test Object");
testCamera = new Camera();
testCamera->ClearFlag(Camera::ClearFlags::SolidColor);
testCamera->ClearColor(Color::Black);
testCameraObject->AddComponent(testCamera);
TestCamera* cameraScript = new TestCamera();
testCameraObject->AddComponent(cameraScript);
StateMachine* fsm = new StateMachine();
int s1 = fsm->CreateNewState(L"State1", [] {});
int s2 = fsm->CreateNewState(L"State2", [] {});
fsm->AddFloatParam(L"Sin", 0f);
fsm->AddTrigerParam(L"Trigger");
fsm->CreateStateTransCondition(s1, s2, L"Sin", 0f, StateMachine::Condition::LessOrEqual);
fsm->CreateStateTransCondition(s2, s1, L"Sin", 0f, StateMachine::Condition::Greater);
testCameraObject->AddComponent(fsm);
// 使用D2D显示文字
GameObject* canvas = new GameObject(L"Canvas");
canvas->AddComponent<Canvas>();
GameObject* debugText = new GameObject(L"Text");
debugText->AddComponent<UIText>();
debugText->GetComponent<UIText>()->Text(L"Test");
canvas->AddChildObject(debugText);
testScene->AddObject(testCameraObject);
Driver::GetInstance()->StartScene(testScene);
}
void TestCamera::Update()
{
var stateMachine = gameObject->GetComponent<StateMachine>();
stateMachine->SetFloat(L"Sin", sin((float)Timer::GetTotalTicks() / 240000));
GameObject::Find(L"Text")->GetComponent<UIText>()->Text(stateMachine->GetCurrectStateName());
}
TestCamera::TestCamera() : ObjectBehaviour() { } 在CPP文件中对TestCamera的构造函数进行定义,这个对象并没有什么用,所以不需要在构造函数中做任何事情,只需要调用基类构造函数即可。 在LoadScene()中,我们创建了一个空场景testScene,一个照相机testCamera,将清空标志设置为纯色,可以通过Update()实时改变填充颜色。然后实例化一个TestCamera对象cameraScript,将脚本作为该对象的组件,即调用testCameraObject的AddComponent方法将testCamera和testCameraScript挂上去。然后创建一个状态机,设置两个状态State1和State2,当Sin值大于0的时候是State1,否则是State2。最后,将testCameraObject对象加入到场景中,使用Driver的BeginBehaviour()方法加载场景。
......
ShowWindow(window, nCmdShow);
LoadScene();
MSG msg = {};
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
...... 计划
合作者
第三方引用 |
2022-08-15
2022-08-17
2022-09-23
2023-10-27
2022-08-18
请发表评论