This commit is contained in:
2026-02-08 17:05:17 +08:00
parent 8b88904ef7
commit 0b31c30b38
5 changed files with 46 additions and 42 deletions

View File

@@ -385,6 +385,7 @@ void GameMap::Enter()
void GameMap::OnUpdate(float deltaTime) void GameMap::OnUpdate(float deltaTime)
{ {
Actor::OnUpdate(deltaTime);
RefPtr<GameCamera> Cam = Global_Game::GetInstance().GetCamera(); RefPtr<GameCamera> Cam = Global_Game::GetInstance().GetCamera();
if (Cam == nullptr) if (Cam == nullptr)
@@ -431,7 +432,6 @@ void GameMap::OnUpdate(float deltaTime)
Layer.second->SetPosition(posX, posY); Layer.second->SetPosition(posX, posY);
} }
Actor::OnUpdate(deltaTime);
} }

View File

@@ -25,26 +25,26 @@ void GameWorld::Exit()
void GameWorld::Init() void GameWorld::Init()
{ {
// RefPtr<Animation> ani = new Animation("common/tuguan/maineff.ani"); // RefPtr<Animation> ani = new Animation("common/tuguan/maineff.ani");
RefPtr<Sprite> sp = new Sprite("sprite/live/else/chn/2022/0510_danjin_jar/22_danjineft/0510_danjin_body.img",0); // RefPtr<Sprite> sp = new Sprite("sprite/live/else/chn/2022/0510_danjin_jar/22_danjineft/0510_danjin_body.img",0);
RefPtr<AnimationMap> am = new AnimationMap(); // RefPtr<AnimationMap> am = new AnimationMap();
// am->AddAnimation(ani); // // am->AddAnimation(ani);
am->AddChild(sp); // am->AddChild(sp);
am->CompleteConstruction(); // am->CompleteConstruction();
AddChild(am); // AddChild(am);
// // 构造所有城镇 // 构造所有城镇
// auto &GlobalGame = Global_Game::GetInstance(); auto &GlobalGame = Global_Game::GetInstance();
// for (auto obj : GlobalGame.GetTownMap()) for (auto obj : GlobalGame.GetTownMap())
// { {
// RefPtr<GameTown> town = new GameTown; RefPtr<GameTown> town = new GameTown;
// town->Init(obj.first); town->Init(obj.first);
// m_TownMap[obj.first] = town; m_TownMap[obj.first] = town;
// } }
// // 构造角色 // 构造角色
// RefPtr<CharacterObject> obj = new CharacterObject(); RefPtr<CharacterObject> obj = new CharacterObject();
// obj->Construction(0); obj->Construction(0);
// AddCharacter(obj, 1); AddCharacter(obj, 1);
} }
void GameWorld::AddCharacter(RefPtr<CharacterObject> Chr, int TownId) void GameWorld::AddCharacter(RefPtr<CharacterObject> Chr, int TownId)

View File

@@ -40,7 +40,7 @@ void CharacterObject::DisableController()
void CharacterObject::ControllerMsg(CONTROLLER_MSG_TYPE msgType, void *msgData) void CharacterObject::ControllerMsg(CONTROLLER_MSG_TYPE msgType, void *msgData)
{ {
// 摇杆移动(左) // 摇杆移动
if (msgType == CONTROLLER_MSG_TYPE::CONTROLLER_MSG_TYPE_LEFT_JOYSTICK_MOVE) if (msgType == CONTROLLER_MSG_TYPE::CONTROLLER_MSG_TYPE_LEFT_JOYSTICK_MOVE)
{ {
Vec2 *pos = (Vec2 *)msgData; Vec2 *pos = (Vec2 *)msgData;

View File

@@ -26,16 +26,17 @@ void Chr_Animation::CreateSkinmationBySlot(std::string actionName, std::string s
if (Equip) if (Equip)
{ {
Animation::ReplaceData Data(0, 0); Animation::ReplaceData Data(0, 0);
for (auto &Variation : Equip->JobAni[this->chr_parent->Job]) for (auto &Variation : Equip->JobAni[this->chr_parent->Job])
{ {
Data.Param1 = Variation.ImgFormat[0]; Data.Param1 = Variation.ImgFormat[0];
Data.Param2 = Variation.ImgFormat[1]; Data.Param2 = Variation.ImgFormat[1];
// 构造Ani // 构造Ani以后 统一设置为不可见 然后放入ActionAnis表
RefPtr<Animation> Ani = new Animation(path, FormatImgPath, Data); RefPtr<Animation> Ani = new Animation(path, FormatImgPath, Data);
Ani->SetVisible(false);
Ani->SetZOrder(Variation.Layer); Ani->SetZOrder(Variation.Layer);
// 将构造好的Ani 添加进AniMap this->AddChild(Ani);
ActionAnis[actionName]->AddAnimation(Ani); ActionAnis[actionName].push_back(Ani);
// 构造一下阴影对象 //TODO // 构造一下阴影对象 //TODO
// RefPtr<Animation> ShadowAni = new Animation(path, FormatImgPath, Data); // RefPtr<Animation> ShadowAni = new Animation(path, FormatImgPath, Data);
@@ -51,6 +52,7 @@ void Chr_Animation::CreateSkinmationBySlot(std::string actionName, std::string s
RefPtr<Equipment> Equip = ((CharacterObject *)GetParent())->_EquipmentManager->GetEquip(slotName); RefPtr<Equipment> Equip = ((CharacterObject *)GetParent())->_EquipmentManager->GetEquip(slotName);
if (Equip) if (Equip)
{ {
// SDL_Log("CreateSkinmationBySlot %s", slotName.c_str());
Animation::ReplaceData Data(0, 0); Animation::ReplaceData Data(0, 0);
for (auto &Variation : Equip->JobAni[this->chr_parent->Job]) for (auto &Variation : Equip->JobAni[this->chr_parent->Job])
{ {
@@ -62,11 +64,12 @@ void Chr_Animation::CreateSkinmationBySlot(std::string actionName, std::string s
// 组装动画路径 // 组装动画路径
std::string AniPath = EquipPath + Variation.AnimationGroup + path.substr(path.find_last_of("/"), path.length()); std::string AniPath = EquipPath + Variation.AnimationGroup + path.substr(path.find_last_of("/"), path.length());
// 构造Ani // 构造Ani以后 统一设置为不可见 然后放入ActionAnis表
RefPtr<Animation> Ani = new Animation(AniPath, FormatImgPath, Data); RefPtr<Animation> Ani = new Animation(AniPath, FormatImgPath, Data);
Ani->SetVisible(false);
Ani->SetZOrder(Variation.Layer); Ani->SetZOrder(Variation.Layer);
// 将构造好的Ani 添加进AniMap this->AddChild(Ani);
ActionAnis[actionName]->AddAnimation(Ani); ActionAnis[actionName].push_back(Ani);
} }
} }
} }
@@ -74,30 +77,23 @@ void Chr_Animation::CreateSkinmationBySlot(std::string actionName, std::string s
void Chr_Animation::Init(CharacterObject *parent) void Chr_Animation::Init(CharacterObject *parent)
{ {
// 调用RenderBase类的初始化 才能挂上标签
parent->AddChild(this); parent->AddChild(this);
chr_parent = parent; chr_parent = parent;
GlobalCharacterScript::CharacterConfig Config = Global_Game::GetInstance().CharacterConfigs[parent->Job]; GlobalCharacterScript::CharacterConfig Config = Global_Game::GetInstance().CharacterConfigs[parent->Job];
// 遍历所有动作Ani路径 // 遍历所有动作Ani路径
for (const auto &pair : Config.animationPath) for (const auto &pair : Config.animationPath)
{ {
std::string ActionName = pair.first; std::string ActionName = pair.first;
std::string Path = std::string("character/" + Config.jobTag + "/" + Tool_toLowerCase(pair.second)); std::string Path = std::string("character/" + Config.jobTag + "/" + Tool_toLowerCase(pair.second));
//以动作为Key构造AniMap
ActionAnis[ActionName] = new AnimationMap();
ActionAnis[ActionName]->SetVisible(false);
// 遍历所有时装部位构造Ani // 遍历所有时装部位构造Ani
for (auto &AvatarPartPair : AvatarPart) for (auto &AvatarPartPair : AvatarPart)
{ {
std::string AvatarPartName = AvatarPartPair.first; std::string AvatarPartName = AvatarPartPair.first;
CreateSkinmationBySlot(ActionName, AvatarPartName, Path); CreateSkinmationBySlot(ActionName, AvatarPartName, Path);
} }
// 将所有时装部位的Ani添加到动作AniMap以后完成构造
ActionAnis[ActionName]->CompleteConstruction();
this->AddChild(ActionAnis[ActionName]);
} }
// 设置初始动作 // 设置初始动作
SetAction("rest"); SetAction("rest");
@@ -106,9 +102,18 @@ void Chr_Animation::Init(CharacterObject *parent)
void Chr_Animation::SetAction(std::string actionName) void Chr_Animation::SetAction(std::string actionName)
{ {
// 先将原动作的Ani设置为不可见 // 先将原动作的Ani设置为不可见
ActionAnis[CurrentActionTag]->Reset(); for (auto Ani : ActionAnis[CurrentActionTag])
ActionAnis[CurrentActionTag]->SetVisible(false); {
Ani->Reset();
Ani->SetVisible(false);
}
// 再将新动作的Ani设置为可见 // 再将新动作的Ani设置为可见
ActionAnis[actionName]->SetVisible(true); for (auto Ani : ActionAnis[actionName])
{
Ani->SetVisible(true);
}
CurrentActionTag = actionName; CurrentActionTag = actionName;
// 设置阴影的动作
// if(chr_parent->_Shadow)chr_parent->_Shadow->SetAction(actionName);
} }

View File

@@ -1,6 +1,5 @@
#pragma once #pragma once
#include "EngineFrame/Base/Actor.h" #include "EngineFrame/Component/Animation.h"
#include "EngineFrame/Component/AnimationMap.h"
#include <string> #include <string>
#include <vector> #include <vector>
#include <unordered_map> #include <unordered_map>
@@ -8,7 +7,7 @@ class CharacterObject;
class Chr_Animation : public Actor class Chr_Animation : public Actor
{ {
// 动作动画集合 // 动作动画集合
using ActionAniList = std::map<std::string, RefPtr<AnimationMap>>; using ActionAniList = std::map<std::string, std::vector<RefPtr<Animation>>>;
public: public:
inline static const std::unordered_map<std::string, std::string> inline static const std::unordered_map<std::string, std::string>