#include "GameWorld.h" #include "Global/Global_Game.h" #include "EngineCore/Game.h" #include "EngineFrame/Component/AnimationMap.h" #include "EngineFrame/Component/Animation.h" GameWorld::GameWorld() { } GameWorld::~GameWorld() { } void GameWorld::Enter() { SetScale(1.2f, 1.2f); Init(); } void GameWorld::Exit() { } void GameWorld::Init() { // RefPtr ani = new Animation("common/tuguan/maineff.ani"); // RefPtr sp = new Sprite("sprite/live/else/chn/2022/0510_danjin_jar/22_danjineft/0510_danjin_body.img",0); // RefPtr am = new AnimationMap(); // // am->AddAnimation(ani); // am->AddChild(sp); // am->CompleteConstruction(); // AddChild(am); // 构造所有城镇 auto &GlobalGame = Global_Game::GetInstance(); for (auto obj : GlobalGame.GetTownMap()) { RefPtr town = new GameTown; town->Init(obj.first); m_TownMap[obj.first] = town; } // 构造角色 RefPtr obj = new CharacterObject(); obj->Construction(0); AddCharacter(obj, 1); } void GameWorld::AddCharacter(RefPtr Chr, int TownId) { // 游戏世界类赋值我的角色 m_MyCharacter = Chr; // 记录当前城镇 m_CurTown = TownId; // 进入城镇 m_TownMap[TownId]->AddCharacter(Chr); // 渲染并更新城镇 AddChild(m_TownMap[TownId]); } void GameWorld::MoveCharacter(RefPtr Chr, int TownId, int Area) { // 当前所在城镇 int curTown = m_CurTown; // 当前所在区域 int curArea = m_TownMap[curTown]->GetCurAreaIndex(); // 获取目标城镇移动信息表 auto MapObj = m_TownMap[TownId]->GetArea(Area); auto MoveInfo = MapObj->GetMoveAreaInfo(); // 传送后的目标区域 SDL_Rect destArea = {0, 0, 0, 0}; // 遍历移动信息表 for (size_t i = 0; i < MoveInfo.size(); ++i) { auto info = MoveInfo[i]; if (info.town == curTown && info.area == curArea) { destArea = MapObj->GetMovablePositionArea(i); } } // 读取出应该存在的坐标以后设置角色的坐标 float Xpos = destArea.x + destArea.w / 2; float Ypos = destArea.y + destArea.h / 2; Chr->SetPosition({Xpos, Ypos, 0}); // 将角色添加到目标城镇 m_TownMap[TownId]->AddCharacter(Chr, Area); // 停止渲染更新旧城镇 RemoveChild(m_TownMap[curTown]); // 记录当前城镇 m_CurTown = TownId; // 渲染并更新城镇 AddChild(m_TownMap[TownId]); } GameWorld *GameWorld::GetWorld() { return (GameWorld *)Game::GetInstance().GetScene().Get(); }