dc420c3b7a
2. 顺便完善了底层通信类的封装,基于websocket,基准测试通过,但存在一点很小的线程bug,似乎是来自于esp32 idf底层的问题,待解决
122 lines
4.6 KiB
C++
122 lines
4.6 KiB
C++
//
|
|
// Created by misaki on 2025/9/2.
|
|
//
|
|
#include "CppHandle.h"
|
|
|
|
#include "OTAClass.h"
|
|
#include "PetBaseClass.h"
|
|
#include "PetDao.h"
|
|
#include <iostream>
|
|
|
|
void testPetSystem() {
|
|
std::cout << "Test point1" << std::endl;
|
|
// 创建阶段策略
|
|
auto stageStrategy = std::make_unique<PetStageStrategy>();
|
|
stageStrategy->addStage(PetStageType::PET_STAGE_YOUNG, "models/young.obj");
|
|
stageStrategy->addStage(PetStageType::PET_STAGE_ADULT, "models/adult.obj");
|
|
stageStrategy->addStage(PetStageType::PET_STAGE_OLD, "models/old.obj");
|
|
stageStrategy->addStageAudio(PetStageType::PET_STAGE_YOUNG, "audio/young.mp3");
|
|
stageStrategy->addStageAudio(PetStageType::PET_STAGE_ADULT, "audio/adult.mp3");
|
|
stageStrategy->addStageAudio(PetStageType::PET_STAGE_OLD, "audio/old.mp3");
|
|
|
|
// 创建动作策略
|
|
auto actionStrategy = std::make_unique<PetActionStrategy>();
|
|
actionStrategy->addAction(PetActionType::PET_ACTION_EAT, "models/eat.obj");
|
|
actionStrategy->addAction(PetActionType::PET_ACTION_HAPPY, "models/happy.obj");
|
|
actionStrategy->addAction(PetActionType::PET_ACTION_SLEEP, "models/sleep.obj");
|
|
actionStrategy->addAction(PetActionType::PET_ACTION_ANGRY, "models/angry.obj");
|
|
actionStrategy->addAction(PetActionType::PET_ACTION_SAD, "models/sad.obj");
|
|
actionStrategy->addAction(PetActionType::PET_ACTION_EVOLVE, "models/evolve.obj");
|
|
actionStrategy->addAction(PetActionType::PET_ACTION_TOUCH, "models/touch.obj");
|
|
|
|
actionStrategy->addActionAudio(PetActionType::PET_ACTION_EAT, "audio/eat.mp3");
|
|
actionStrategy->addActionAudio(PetActionType::PET_ACTION_HAPPY, "audio/happy.mp3");
|
|
actionStrategy->addActionAudio(PetActionType::PET_ACTION_SLEEP, "audio/sleep.mp3");
|
|
std::cout << "Test point2" << std::endl;
|
|
|
|
// 创建宠物信息
|
|
PetBaseInfo info;
|
|
info.pet_name = "芝士雪豹";
|
|
info.pet_hp = 100;
|
|
info.pet_density = 50;
|
|
info.pet_identity = "我是顶真";
|
|
|
|
// 创建宠物
|
|
auto pet = std::make_shared<PetBase>(info, std::move(stageStrategy), std::move(actionStrategy));
|
|
std::cout << "Test point3" << std::endl;
|
|
|
|
// 创建音频观察者
|
|
auto audioStrategy = std::make_shared<PetAudioStrategy>();
|
|
audioStrategy->setAudioCallback([](const std::string& audioPath) {
|
|
std::cout << "Playing audio: " << audioPath << std::endl;
|
|
});
|
|
audioStrategy->subscribe(pet);
|
|
std::cout << "Test point4" << std::endl;
|
|
|
|
// 创建渲染器观察者
|
|
auto rendererStrategy = std::make_shared<PetRendererStrategy>(
|
|
pet->getStageStrategy(),
|
|
pet->getActionStrategy()
|
|
);
|
|
rendererStrategy->setRenderCallback([](const std::string& modelPath) {
|
|
std::cout << "Rendering model: " << modelPath << std::endl;
|
|
});
|
|
rendererStrategy->subscribe(pet);
|
|
std::cout << "Test point5" << std::endl;
|
|
|
|
// 执行一些动作
|
|
std::cout << "=== Testing basic actions ===" << std::endl;
|
|
pet->feed();
|
|
pet->play();
|
|
pet->touch();
|
|
std::cout << "Test point6" << std::endl;
|
|
|
|
// 检查当前状态
|
|
std::cout << "Current HP: " << pet->getPetInfo().pet_hp << std::endl;
|
|
std::cout << "Current density: " << pet->getPetInfo().pet_density << std::endl;
|
|
std::cout << "Current stage: " << static_cast<int>(pet->getCurrentStage()) << std::endl;
|
|
std::cout << "Current action: " << static_cast<int>(pet->getCurrentAction()) << std::endl;
|
|
std::cout << "Test point7" << std::endl;
|
|
|
|
// 测试进化
|
|
std::cout << "\n=== Testing evolution ===" << std::endl;
|
|
// 直接修改亲密度来测试进化
|
|
PetBaseInfo newInfo = pet->getPetInfo();
|
|
newInfo.pet_density = 100; // 达到进化条件
|
|
pet->setPetInfo(newInfo);
|
|
std::cout << "Test point8" << std::endl;
|
|
|
|
if (pet->checkEvolution()) {
|
|
std::cout << "Evolution successful!" << std::endl;
|
|
} else {
|
|
std::cout << "Evolution failed!" << std::endl;
|
|
}
|
|
|
|
// 进一步增加亲密度到150,尝试再次进化
|
|
newInfo.pet_density = 150;
|
|
pet->setPetInfo(newInfo);
|
|
if (pet->checkEvolution()) {
|
|
std::cout << "Second evolution successful!" << std::endl;
|
|
} else {
|
|
std::cout << "Second evolution failed!" << std::endl;
|
|
}
|
|
|
|
std::cout << "Final stage: " << static_cast<int>(pet->getCurrentStage()) << std::endl;
|
|
|
|
PetDAO petDAO(SDFileManager::getInstance());
|
|
petDAO.savePet(pet, "my_pet.json");
|
|
// 列出所有宠物文件
|
|
auto petFiles = petDAO.listPetFiles();
|
|
for (const auto& file : petFiles) {
|
|
std::cout << "Pet file: " << file << std::endl;
|
|
}
|
|
std::cout << SDFileManager::getInstance()->catCommand("/sdcard/pet_data/my_pet.json") << std::endl;
|
|
}
|
|
|
|
void Cpp_Hand() {
|
|
testPetSystem();
|
|
|
|
OTAClass oc;
|
|
oc.Init();
|
|
}
|