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