添加场景在运行时会临时复制一个场景功能,添加克隆实体功能

This commit is contained in:
2025-06-18 20:59:26 +08:00
parent 99782ea11b
commit ea59c82f35
8 changed files with 185 additions and 22 deletions

View File

@ -280,7 +280,8 @@ namespace Hazel
const float windowWidth = ImGui::GetWindowWidth();
const float windowHeight = ImGui::GetWindowHeight();
const ImVec2 windowPos = ImGui::GetWindowPos();
ImVec2 windowPos = ImGui::GetWindowPos();
windowPos.y += m_ViewPortSize.y - windowsSize.y;
ImGuizmo::SetRect(windowPos.x, windowPos.y, windowWidth, windowHeight);
@ -366,12 +367,30 @@ namespace Hazel
void EditorLayer::OpenScene(const std::filesystem::path& scenePath)
{
if (m_SceneState != SceneState::Edit)
OnSceneStop();
Ref<Scene> newScene = CreateRef<Scene>();
SceneSerializer serializer(newScene);
if (serializer.Deserialize(scenePath.string()))
{
m_EditorScene = newScene;
m_EditorScene->OnViewportResize((uint32_t)m_ViewPortSize.x, (uint32_t)m_ViewPortSize.y);
m_ActiveScene = m_EditorScene;
m_SceneHierachyPanel.SetContext(m_ActiveScene);
}
/*
m_ActiveScene = CreateRef<Scene>();
m_ActiveScene->OnViewportResize((uint32_t)m_ViewPortSize.x, (uint32_t)m_ViewPortSize.y);
m_SceneHierachyPanel.SetContext(m_ActiveScene);
SceneSerializer serializer(m_ActiveScene);
serializer.Deserialize(scenePath.string());
*/
}
void EditorLayer::NewScene()
@ -381,6 +400,34 @@ namespace Hazel
m_SceneHierachyPanel.SetContext(m_ActiveScene);
}
void EditorLayer::OnDuplicateEntity()
{
if (m_SceneState != SceneState::Edit)
return;
Entity selectedEntity = m_SceneHierachyPanel.GetSelectedEntity();
if (selectedEntity)
m_EditorScene->DuplicateEntity(selectedEntity);
}
void EditorLayer::OnScenePlay()
{
m_SceneState = SceneState::Play;
m_ActiveScene = Scene::Copy(m_EditorScene);
m_ActiveScene->OnRuntimeStart();
m_SceneHierachyPanel.SetContext(m_ActiveScene);
}
void EditorLayer::OnSceneStop()
{
m_SceneState = SceneState::Edit;
m_ActiveScene->OnRuntimeStop();
m_ActiveScene = m_EditorScene;
m_SceneHierachyPanel.SetContext(m_ActiveScene);
}
void EditorLayer::ChangeOptMode(unsigned int mode)
{
if (m_ViewportHovered)
@ -401,11 +448,12 @@ namespace Hazel
#define SHORTCUT_NEW (SDL_KMOD_CTRL | SDLK_N)
#define SHORTCUT_OPEN (SDL_KMOD_CTRL | SDLK_O)
#define SHORTCUT_SAVE_ALL (SDL_KMOD_CTRL | SDL_KMOD_SHIFT | SDLK_S)
#define SHORTCUT_CTRL_D (SDL_KMOD_CTRL | SDLK_D)
const auto mod = SDL_GetModState();
const auto ctrl = (mod & SDL_KMOD_CTRL) ? SDL_KMOD_CTRL : 0;
const auto shift = (mod & SDL_KMOD_SHIFT) ? SDL_KMOD_SHIFT : 0;
if (e.key.down && e.key.repeat == 0)
switch (ctrl | shift | e.key.key)
{
case SHORTCUT_EXIT:
@ -420,6 +468,9 @@ namespace Hazel
case SHORTCUT_SAVE_ALL:
SaveScene();
break;
case SHORTCUT_CTRL_D:
OnDuplicateEntity();
break;
// GIZMO
case SDLK_Q:
@ -475,15 +526,4 @@ namespace Hazel
ImGui::End();
}
void EditorLayer::OnScenePlay()
{
m_SceneState = SceneState::Play;
m_ActiveScene->OnRuntimeStart();
}
void EditorLayer::OnSceneStop()
{
m_SceneState = SceneState::Edit;
m_ActiveScene->OnRuntimeStop();
}
}