2D_Game_Engine
Loading...
Searching...
No Matches
scene.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <entity.hpp>
4#include <camera.hpp>
5
6class Scene{
7public:
12 m_ScalingFactor=0.5f;
14 }
19 Scene(const std::string &name);
20
21 std::string &GetName();
26 void SetScalingFactor(float scaling_factor);
33 void SetGravity(float x,float y);
34
41 void SetGravity(Vec2 gravity);
42
47 [[nodiscard]] uint32_t AddEntity();
53 void AddEntity(uint32_t uid);
59 Entity* GetEntity(uint32_t uid);
64 void RemoveEntity(uint32_t uid);
65
70 void MoveEntity(uint32_t uid,float x_offset,float y_offset);
71 void SetEntityPosition(uint32_t uid,float x,float y);
72
78 template<typename T,typename ...Args>
79 void AddComponent(uint32_t uid,Args...args){
80 PROFILE_FUNCTION();
81
82 T temp(std::forward<Args>(args)...,uid);
83
84 // auto printArg=[](const auto &arg){ std::cout<<arg<<' '; };
85 // (printArg(args),...);
86
87 // std::cout<<std::endl;
88
89 if constexpr(std::is_same<T,RigidbodyComponent>::value){
90 Entity *entity=GetEntity(uid);
91 b2BodyDef body_def;
92 body_def.type=RigidbodyTypeToBox2DBody(temp.m_BodyType);
93 body_def.position.Set(entity->m_X*m_ScalingFactor,entity->m_Y*m_ScalingFactor);
94 body_def.angle=0.0f;
95
96 b2Body *body=m_PhysicsWorld->CreateBody(&body_def);
97 body->SetFixedRotation(temp.m_FixedRotation);
98 temp.m_RuntimeBody=body;
99 }else if constexpr(std::is_same<T,BoxColliderComponent>::value){
101 if(rigidbody==nullptr){
102 printf("Entity %d does not have a rigidbody\n",uid);
103 return;
104 }
105
107 box_shape.SetAsBox(temp.m_Width/2.0f*m_ScalingFactor,temp.m_Height/2.0f*m_ScalingFactor,b2Vec2((temp.m_XOffset+temp.m_Width/2.0f)*m_ScalingFactor,(temp.m_YOffset+temp.m_Height/2.0f)*m_ScalingFactor),0.0f);
108
110 fixture_def.shape=&box_shape;
111 fixture_def.density=temp.m_Density;
112 fixture_def.friction=temp.m_Friction;
113 fixture_def.restitution=temp.m_Restitution;
114 fixture_def.restitutionThreshold=temp.m_RestitutionThreshold;
115 temp.m_RuntimeFixture=rigidbody->m_RuntimeBody->CreateFixture(&fixture_def);
116 }else if constexpr(std::is_same<T,CircleColliderComponent>::value){
118 if(rigidbody==nullptr){
119 printf("Entity %d does not have a rigidbody\n",uid);
120 return;
121 }
122
124 circle_shape.m_p.Set((temp.m_XOffset)*m_ScalingFactor,(temp.m_YOffset)*m_ScalingFactor);
125 circle_shape.m_radius=(temp.m_Radius)*m_ScalingFactor;
126
129 fixture_def.density=temp.m_Density;
130 fixture_def.friction=temp.m_Friction;
131 fixture_def.restitution=temp.m_Restitution;
132 fixture_def.restitutionThreshold=temp.m_RestitutionThreshold;
133 temp.m_RuntimeFixture=rigidbody->m_RuntimeBody->CreateFixture(&fixture_def);
134 }
135
137 }
138
143 template<typename T>
145
151 template<typename T>
153
157 void OnPhysicsStart();
162 void OnPhysicsUpdate(double frame_time);
166 void OnPhysicsStop();
167
172 void Update(double frame_time);
176 void Render();
177
182 std::vector<Entity> &GetEntities();
187 template<typename T,ComponentType<T> = 0>
188 std::vector<T> &GetComponents();
189
190 inline Camera &GetCamera(){ return m_Camera; }
191
192 inline b2World *GetPhysicsWorld(){ return m_PhysicsWorld; }
193
194 void DebugDraw();
195private:
196 friend class SceneSerializer;
197 friend class Application;
198
204 template<typename T>
205 void AddComponentToContainer(T &component,uint32_t uid);
206
207 b2World *m_PhysicsWorld=nullptr;
208 float m_ScalingFactor=0.5f;
210
211 Camera m_Camera;
212
213 std::vector<Entity> m_Entities;
214 ComponentManager<TagComponent> m_TagComponents;
215 ComponentManager<TextureComponent> m_TextureComponents;
216 ComponentManager<AnimatedTextureComponent> m_AnimatedTextureComponents;
217 ComponentManager<RigidbodyComponent> m_RigidbodyComponents;
218 ComponentManager<BoxColliderComponent> m_BoxColliderComponents;
219 ComponentManager<CircleColliderComponent> m_CircleColliderComponents;
220 ComponentManager<LightComponent> m_LightComponents;
221 ComponentManager<NativeScriptComponent> m_NativeScriptComponents;
222 ComponentManager<TextComponent> m_TextComponents;
223
224 std::vector<std::vector<uint32_t>> m_TexturesEntities;
225 std::vector<std::vector<uint32_t>> m_AnimatedTexturesEntities;
226
227 std::string m_Name;
228};
float m_X
Definition entity.hpp:333
float m_Y
Definition entity.hpp:333
Definition scene.hpp:6
void OnPhysicsUpdate(double frame_time)
Definition scene.cpp:311
void OnPhysicsStart()
Definition scene.cpp:307
void AddComponent(uint32_t uid, Args...args)
Definition scene.hpp:79
uint32_t AddEntity()
Definition scene.cpp:42
void MoveEntity(uint32_t uid, float x_offset, float y_offset)
Definition scene.cpp:291
void RemoveComponent(uint32_t uid)
T * GetComponent(uint32_t uid)
void SetEntityPosition(uint32_t uid, float x, float y)
Definition scene.cpp:142
void DebugDraw()
Definition scene.cpp:381
std::string & GetName()
Definition scene.cpp:24
void SetGravity(float x, float y)
Definition scene.cpp:32
void Render()
Definition scene.cpp:282
void SetScalingFactor(float scaling_factor)
Definition scene.cpp:28
void RemoveEntity(uint32_t uid)
Definition scene.cpp:60
Entity * GetEntity(uint32_t uid)
Definition scene.cpp:51
b2World * GetPhysicsWorld()
Definition scene.hpp:192
Camera & GetCamera()
Definition scene.hpp:190
void Update(double frame_time)
Definition scene.cpp:275
std::vector< T > & GetComponents()
Scene()
Definition scene.hpp:11
std::vector< Entity > & GetEntities()
Definition scene.cpp:337
void OnPhysicsStop()
Definition scene.cpp:332
b2BodyType RigidbodyTypeToBox2DBody(RigidbodyComponent::BodyType bodyType)
Definition entity.hpp:431
m_Scene m_Name
m_Scene m_ScalingFactor
m_Scene m_Gravity