Добавил shared_from_this как основной способ создать умный указатель на "себя". Добавил пример работы с ним
This commit is contained in:
@@ -1,12 +1,26 @@
|
||||
#include "TestActor.h"
|
||||
|
||||
#include "Game/Actors/Camera.hpp"
|
||||
#include "Game/SaveMap/SaveMap.hpp"
|
||||
#include "Game/World/World.hpp"
|
||||
#include "Log/Log.hpp"
|
||||
|
||||
void TestActor::print_when_main_camera_rotate(const Vector3D& rot)
|
||||
{
|
||||
std::string msg = + "(" + name_ + ") camera move to x: " + std::to_string(rot.x) +
|
||||
" y: " + std::to_string(rot.y) +
|
||||
" z: " + std::to_string(rot.z);
|
||||
Loging::Message(msg);
|
||||
}
|
||||
|
||||
void TestActor::BeginPlay()
|
||||
{
|
||||
Actor::BeginPlay();
|
||||
Loging::Log("TestActor::BeginPlay");
|
||||
GetWorld()->GetActorsByClass<Camera>()[0].lock()->OnSetActorRotate.bind<TestActor>(
|
||||
std::static_pointer_cast<TestActor>(shared_from_this()),
|
||||
&TestActor::print_when_main_camera_rotate
|
||||
);
|
||||
}
|
||||
|
||||
std::shared_ptr<SaveMap> TestActor::save()
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
GENERATE_META(TestActor)
|
||||
class TestActor final : public Actor
|
||||
{
|
||||
const std::string name_ = "First test actor";
|
||||
void print_when_main_camera_rotate(const Vector3D& rot);
|
||||
public:
|
||||
void BeginPlay() override;
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
#include "TestWorld.h"
|
||||
|
||||
#include <glm/glm.hpp>
|
||||
#include <glm/ext/scalar_constants.hpp>
|
||||
|
||||
#include "../Actors/TestActor.h"
|
||||
@@ -10,6 +9,14 @@
|
||||
#include "Log/Log.hpp"
|
||||
#include "Game/Actors/Mesh/Mesh.hpp"
|
||||
|
||||
void TestWorld::print_when_camera_move(const Vector3D& loc_)
|
||||
{
|
||||
std::string msg = + "(" + name_ + ") camera move to x: " + std::to_string(loc_.x) +
|
||||
" y: " + std::to_string(loc_.y) +
|
||||
" z: " + std::to_string(loc_.z);
|
||||
Loging::Message(msg);
|
||||
}
|
||||
|
||||
TestWorld::TestWorld(GameInstance& game_instance) : World(game_instance)
|
||||
{}
|
||||
|
||||
@@ -22,10 +29,15 @@ void TestWorld::BeginPlay()
|
||||
Loging::Log("Load actor: " + i.lock()->GetName());
|
||||
}
|
||||
|
||||
GetActorsByClass<Camera>()[0].lock()->SetActive();
|
||||
//SpawnActorFormClass<TestActor>("TestActor1");
|
||||
//std::shared_ptr<SaveMap> save_world = save();
|
||||
//Loging::Log(save_world->serialize());
|
||||
main_camera_ = GetActorsByClass<Camera>()[0];
|
||||
std::shared_ptr<Camera> lock_main_camera = main_camera_.lock();
|
||||
lock_main_camera->SetActive();
|
||||
lock_main_camera->OnSetActorLocate.bind<TestWorld>(
|
||||
std::static_pointer_cast<TestWorld>(shared_from_this()),
|
||||
&TestWorld::print_when_camera_move
|
||||
);
|
||||
std::shared_ptr<SaveMap> save_world = save();
|
||||
Loging::Message(save_world->serialize());
|
||||
}
|
||||
|
||||
void TestWorld::Tick(double delta_time)
|
||||
@@ -36,8 +48,12 @@ void TestWorld::Tick(double delta_time)
|
||||
time1 += delta_time;
|
||||
double delta1 = sin(time1);
|
||||
double delta2 = sin(3*time1);
|
||||
GetActorsByClass<Camera>()[0].lock()->SetActorLocate(Vector3D{2 + delta2, 2 + delta2, 2 + delta2});
|
||||
GetActorsByClass<Camera>()[0].lock()->SetActorRotate(Vector3D{-3*glm::pi<double>()/4 + glm::pi<double>()/4 * delta1, glm::pi<double>() / -4, 0});
|
||||
std::shared_ptr<Camera> lock_main_camera = main_camera_.lock();
|
||||
if (lock_main_camera != nullptr)
|
||||
{
|
||||
lock_main_camera->SetActorLocate(Vector3D{2 + delta2, 2 + delta2, 2 + delta2});
|
||||
lock_main_camera->SetActorRotate(Vector3D{-3*glm::pi<double>()/4 + glm::pi<double>()/4 * delta1, glm::pi<double>() / -4, 0});
|
||||
}
|
||||
|
||||
time += delta_time;
|
||||
if (time >= 10.0)
|
||||
|
||||
@@ -2,10 +2,16 @@
|
||||
|
||||
#include "Game/World/World.hpp"
|
||||
|
||||
class Camera;
|
||||
GENERATE_META(TestWorld)
|
||||
|
||||
class TestWorld final : public World
|
||||
{
|
||||
double time = 0;
|
||||
std::weak_ptr<Camera> main_camera_;
|
||||
const std::string name_ = "First test world";
|
||||
|
||||
void print_when_camera_move(const Vector3D& loc_);
|
||||
public:
|
||||
TestWorld(GameInstance& game_instance);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user