add: Game::Update
This commit is contained in:
parent
318103b148
commit
1c8de670ac
|
|
@ -215,6 +215,9 @@ namespace e2d
|
||||||
// 开始
|
// 开始
|
||||||
virtual void Start() = 0;
|
virtual void Start() = 0;
|
||||||
|
|
||||||
|
// 更新
|
||||||
|
virtual void Update(float dt) {}
|
||||||
|
|
||||||
// 运行
|
// 运行
|
||||||
void Run(
|
void Run(
|
||||||
const Options& options = Options()
|
const Options& options = Options()
|
||||||
|
|
@ -271,7 +274,9 @@ namespace e2d
|
||||||
bool IsTransitioning() const;
|
bool IsTransitioning() const;
|
||||||
|
|
||||||
// 更新场景内容
|
// 更新场景内容
|
||||||
void UpdateScene();
|
void UpdateScene(
|
||||||
|
float dt
|
||||||
|
);
|
||||||
|
|
||||||
// 渲染场景画面
|
// 渲染场景画面
|
||||||
void DrawScene();
|
void DrawScene();
|
||||||
|
|
|
||||||
|
|
@ -153,7 +153,7 @@ namespace e2d
|
||||||
virtual void OnExit() {}
|
virtual void OnExit() {}
|
||||||
|
|
||||||
// 更新场景
|
// 更新场景
|
||||||
virtual void Update() {}
|
virtual void Update(float dt) {}
|
||||||
|
|
||||||
// 设置根节点
|
// 设置根节点
|
||||||
void SetRoot(
|
void SetRoot(
|
||||||
|
|
@ -270,7 +270,6 @@ namespace e2d
|
||||||
class Node
|
class Node
|
||||||
: public Ref
|
: public Ref
|
||||||
{
|
{
|
||||||
friend class Game;
|
|
||||||
friend class Scene;
|
friend class Scene;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
@ -629,11 +628,14 @@ namespace e2d
|
||||||
virtual void Draw() const {}
|
virtual void Draw() const {}
|
||||||
|
|
||||||
// 更新节点
|
// 更新节点
|
||||||
virtual void Update() {}
|
virtual void Update(float dt) {}
|
||||||
|
|
||||||
// 渲染节点边缘
|
// 渲染节点边缘
|
||||||
void DrawBorder();
|
void DrawBorder();
|
||||||
|
|
||||||
|
// 更新子节点
|
||||||
|
void UpdateChildren(float dt);
|
||||||
|
|
||||||
// 分发鼠标消息
|
// 分发鼠标消息
|
||||||
virtual bool Dispatch(
|
virtual bool Dispatch(
|
||||||
const MouseEvent& e,
|
const MouseEvent& e,
|
||||||
|
|
|
||||||
|
|
@ -89,7 +89,7 @@ void e2d::Game::Run(const Options& options)
|
||||||
// 刷新场景
|
// 刷新场景
|
||||||
::ShowWindow(hwnd_, SW_SHOWNORMAL);
|
::ShowWindow(hwnd_, SW_SHOWNORMAL);
|
||||||
::UpdateWindow(hwnd_);
|
::UpdateWindow(hwnd_);
|
||||||
UpdateScene();
|
UpdateScene(0);
|
||||||
|
|
||||||
// 运行
|
// 运行
|
||||||
const int min_interval = 5;
|
const int min_interval = 5;
|
||||||
|
|
@ -103,10 +103,12 @@ void e2d::Game::Run(const Options& options)
|
||||||
|
|
||||||
if (dur.Milliseconds() > min_interval)
|
if (dur.Milliseconds() > min_interval)
|
||||||
{
|
{
|
||||||
|
float dt = (now - last).Seconds();
|
||||||
last = now;
|
last = now;
|
||||||
Device::GetInput()->Flush();
|
|
||||||
|
|
||||||
UpdateScene();
|
Device::GetInput()->Flush();
|
||||||
|
Update(dt);
|
||||||
|
UpdateScene(dt);
|
||||||
DrawScene();
|
DrawScene();
|
||||||
|
|
||||||
while (::PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
|
while (::PeekMessage(&msg, nullptr, 0, 0, PM_REMOVE))
|
||||||
|
|
@ -179,8 +181,20 @@ bool e2d::Game::IsTransitioning() const
|
||||||
return transition_ != nullptr;
|
return transition_ != nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Game::UpdateScene()
|
void e2d::Game::UpdateScene(float dt)
|
||||||
{
|
{
|
||||||
|
if (curr_scene_)
|
||||||
|
{
|
||||||
|
curr_scene_->Update(dt);
|
||||||
|
curr_scene_->GetRoot()->UpdateChildren(dt);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (next_scene_)
|
||||||
|
{
|
||||||
|
next_scene_->Update(dt);
|
||||||
|
next_scene_->GetRoot()->UpdateChildren(dt);
|
||||||
|
}
|
||||||
|
|
||||||
if (transition_)
|
if (transition_)
|
||||||
{
|
{
|
||||||
transition_->Update();
|
transition_->Update();
|
||||||
|
|
@ -209,16 +223,6 @@ void e2d::Game::UpdateScene()
|
||||||
curr_scene_ = next_scene_;
|
curr_scene_ = next_scene_;
|
||||||
next_scene_ = nullptr;
|
next_scene_ = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (curr_scene_)
|
|
||||||
{
|
|
||||||
curr_scene_->Update();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (next_scene_)
|
|
||||||
{
|
|
||||||
next_scene_->Update();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void e2d::Game::DrawScene()
|
void e2d::Game::DrawScene()
|
||||||
|
|
@ -490,7 +494,7 @@ LRESULT e2d::Game::WndProc(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
bool has_handled = false;
|
bool was_handled = false;
|
||||||
Game * game = reinterpret_cast<Game*>(
|
Game * game = reinterpret_cast<Game*>(
|
||||||
static_cast<LONG_PTR>(
|
static_cast<LONG_PTR>(
|
||||||
::GetWindowLongPtrW(hwnd, GWLP_USERDATA)
|
::GetWindowLongPtrW(hwnd, GWLP_USERDATA)
|
||||||
|
|
@ -523,7 +527,7 @@ LRESULT e2d::Game::WndProc(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
result = 0;
|
result = 0;
|
||||||
has_handled = true;
|
was_handled = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// 处理按键消息
|
// 处理按键消息
|
||||||
|
|
@ -540,7 +544,7 @@ LRESULT e2d::Game::WndProc(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
result = 0;
|
result = 0;
|
||||||
has_handled = true;
|
was_handled = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// 处理窗口大小变化消息
|
// 处理窗口大小变化消息
|
||||||
|
|
@ -584,7 +588,7 @@ LRESULT e2d::Game::WndProc(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param)
|
||||||
::InvalidateRect(hwnd, nullptr, FALSE);
|
::InvalidateRect(hwnd, nullptr, FALSE);
|
||||||
}
|
}
|
||||||
result = 0;
|
result = 0;
|
||||||
has_handled = true;
|
was_handled = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// 重绘窗口
|
// 重绘窗口
|
||||||
|
|
@ -594,7 +598,7 @@ LRESULT e2d::Game::WndProc(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param)
|
||||||
::ValidateRect(hwnd, nullptr);
|
::ValidateRect(hwnd, nullptr);
|
||||||
}
|
}
|
||||||
result = 0;
|
result = 0;
|
||||||
has_handled = true;
|
was_handled = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// 窗口关闭消息
|
// 窗口关闭消息
|
||||||
|
|
@ -606,7 +610,7 @@ LRESULT e2d::Game::WndProc(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
result = 0;
|
result = 0;
|
||||||
has_handled = true;
|
was_handled = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
// 窗口销毁消息
|
// 窗口销毁消息
|
||||||
|
|
@ -615,12 +619,12 @@ LRESULT e2d::Game::WndProc(HWND hwnd, UINT msg, WPARAM w_param, LPARAM l_param)
|
||||||
::PostQuitMessage(0);
|
::PostQuitMessage(0);
|
||||||
}
|
}
|
||||||
result = 1;
|
result = 1;
|
||||||
has_handled = true;
|
was_handled = true;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!has_handled)
|
if (!was_handled)
|
||||||
{
|
{
|
||||||
result = ::DefWindowProc(hwnd, msg, w_param, l_param);
|
result = ::DefWindowProc(hwnd, msg, w_param, l_param);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -71,11 +71,6 @@ void e2d::Node::Visit()
|
||||||
if (!visible_)
|
if (!visible_)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Update();
|
|
||||||
UpdateActions();
|
|
||||||
UpdateTasks();
|
|
||||||
UpdateTransform();
|
|
||||||
|
|
||||||
auto render_target = Device::GetGraphics()->GetRenderTarget();
|
auto render_target = Device::GetGraphics()->GetRenderTarget();
|
||||||
if (clip_enabled_)
|
if (clip_enabled_)
|
||||||
{
|
{
|
||||||
|
|
@ -134,6 +129,43 @@ void e2d::Node::Visit()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void e2d::Node::UpdateChildren(float dt)
|
||||||
|
{
|
||||||
|
if (children_.empty())
|
||||||
|
{
|
||||||
|
Update(dt);
|
||||||
|
UpdateActions();
|
||||||
|
UpdateTasks();
|
||||||
|
UpdateTransform();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
size_t i;
|
||||||
|
for (i = 0; i < children_.size(); ++i)
|
||||||
|
{
|
||||||
|
auto child = children_[i];
|
||||||
|
// 访问 Order 小于零的节点
|
||||||
|
if (child->GetOrder() < 0)
|
||||||
|
{
|
||||||
|
child->UpdateChildren(dt);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Update(dt);
|
||||||
|
UpdateActions();
|
||||||
|
UpdateTasks();
|
||||||
|
UpdateTransform();
|
||||||
|
|
||||||
|
// 访问剩余节点
|
||||||
|
for (; i < children_.size(); ++i)
|
||||||
|
children_[i]->UpdateChildren(dt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void e2d::Node::DrawBorder()
|
void e2d::Node::DrawBorder()
|
||||||
{
|
{
|
||||||
if (visible_)
|
if (visible_)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue