Skip to content

Commit f199805

Browse files
committed
projectiles work in progress
1 parent 42016a8 commit f199805

29 files changed

Lines changed: 761 additions & 310 deletions

src/Carnage3D.vcxproj

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,7 @@
182182
<ClInclude Include="MapRenderer.h" />
183183
<ClInclude Include="GameMapManager.h" />
184184
<ClInclude Include="HumanCharacterController.h" />
185+
<ClInclude Include="Projectile.h" />
185186
<ClInclude Include="RenderView.h" />
186187
<ClInclude Include="rtti.h" />
187188
<ClInclude Include="Sprite2D.h" />
@@ -264,6 +265,7 @@
264265
<ClCompile Include="GameMapHelpers.cpp" />
265266
<ClCompile Include="GameMapManager.cpp" />
266267
<ClCompile Include="HumanCharacterController.cpp" />
268+
<ClCompile Include="Projectile.cpp" />
267269
<ClCompile Include="RenderView.cpp" />
268270
<ClCompile Include="Sprite2D.cpp" />
269271
<ClCompile Include="SpriteBatch.cpp" />

src/Carnage3D.vcxproj.filters

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -332,6 +332,9 @@
332332
<ClInclude Include="Box2D_Helpers.h">
333333
<Filter>Game\Physics</Filter>
334334
</ClInclude>
335+
<ClInclude Include="Projectile.h">
336+
<Filter>Game\GameObjects</Filter>
337+
</ClInclude>
335338
</ItemGroup>
336339
<ItemGroup>
337340
<ClCompile Include="stdafx.cpp">
@@ -519,6 +522,9 @@
519522
<ClCompile Include="TimeManager.cpp">
520523
<Filter>Application</Filter>
521524
</ClCompile>
525+
<ClCompile Include="Projectile.cpp">
526+
<Filter>Game\GameObjects</Filter>
527+
</ClCompile>
522528
</ItemGroup>
523529
<ItemGroup>
524530
<None Include="..\gamedata\config\sys_config.json.default">

src/CarnageGame.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -226,7 +226,7 @@ void CarnageGame::SetupHumanCharacter(int humanIndex, Pedestrian* pedestrian)
226226
{
227227
pedestrian->mRemapIndex = humanIndex - 1;
228228
}
229-
mHumanSlot[humanIndex].mCharController.mSpawnPosition = pedestrian->mPhysicsComponent->GetPosition();
229+
mHumanSlot[humanIndex].mCharController.mSpawnPosition = pedestrian->mPhysicsBody->GetPosition();
230230
mHumanSlot[humanIndex].mCharPedestrian = pedestrian;
231231
mHumanSlot[humanIndex].mCharController.SetCharacter(pedestrian);
232232
mHumanSlot[humanIndex].mCharView.mFollowCameraController.SetFollowTarget(pedestrian);

src/FollowCameraController.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ void FollowCameraController::Setup(GameCamera* gameCamera)
2727

2828
if (mFollowPedestrian)
2929
{
30-
glm::vec3 position = mFollowPedestrian->mPhysicsComponent->GetPosition();
30+
glm::vec3 position = mFollowPedestrian->mPhysicsBody->GetPosition();
3131
mCamera->SetPosition({position.x, position.y + mStartupCameraHeight, position.z});
3232
}
3333
else
@@ -42,14 +42,14 @@ void FollowCameraController::UpdateFrame()
4242
if (mFollowPedestrian == nullptr)
4343
return;
4444

45-
glm::vec3 position = mFollowPedestrian->mPhysicsComponent->GetPosition();
45+
glm::vec3 position = mFollowPedestrian->mPhysicsBody->GetPosition();
4646
position.y = position.y + (mFollowPedCameraHeight + mScrollHeightOffset);
4747

4848
float catchSpeed = mFollowPedCameraCatchSpeed;
4949
// todo: temporary implementation
5050
if (mFollowPedestrian->IsCarPassenger())
5151
{
52-
glm::vec2 carVelocity = mFollowPedestrian->mCurrentCar->mPhysicsComponent->GetLinearVelocity();
52+
glm::vec2 carVelocity = mFollowPedestrian->mCurrentCar->mPhysicsBody->GetLinearVelocity();
5353
float carSpeed = glm::length(carVelocity);
5454
carVelocity = glm::normalize(carVelocity);
5555
position.x += (carVelocity.x * carSpeed * 0.35f);

src/GameCheatsWindow.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -79,12 +79,12 @@ void GameCheatsWindow::DoUI(ImGuiIO& imguiContext)
7979
if (Pedestrian* pedestrian = gCarnageGame.mHumanSlot[0].mCharPedestrian)
8080
{
8181
ImGui::HorzSpacing();
82-
glm::vec3 pedPosition = pedestrian->mPhysicsComponent->GetPosition();
82+
glm::vec3 pedPosition = pedestrian->mPhysicsBody->GetPosition();
8383
ImGui::Text("physical pos: %.3f, %.3f, %.3f", pedPosition.x, pedPosition.y, pedPosition.z);
8484
glm::vec3 logicalPosition = Convert::MetersToMapUnits(pedPosition);
8585
ImGui::Text("logical pos: %.3f, %.3f, %.3f", logicalPosition.x, logicalPosition.y, logicalPosition.z);
8686

87-
cxx::angle_t pedHeading = pedestrian->mPhysicsComponent->GetRotationAngle();
87+
cxx::angle_t pedHeading = pedestrian->mPhysicsBody->GetRotationAngle();
8888
ImGui::Text("heading: %f", pedHeading.mDegrees);
8989
ImGui::Text("weapon: %s", cxx::enum_to_string(pedestrian->mCurrentWeapon));
9090
ImGui::Text("state: %s", cxx::enum_to_string(pedestrian->GetCurrentStateID()));
@@ -189,10 +189,10 @@ void GameCheatsWindow::DoUI(ImGuiIO& imguiContext)
189189
ImGui::TextColored(physicsPropsColor, "Front Brake Bias : %.3f", carInformation->mFrontBrakeBias);
190190
ImGui::HorzSpacing();
191191

192-
ImGui::Text("Current velocity : %.3f", currCar->mPhysicsComponent->GetCurrentSpeed());
192+
ImGui::Text("Current velocity : %.3f", currCar->mPhysicsBody->GetCurrentSpeed());
193193
if (ImGui::Button("Clear forces"))
194194
{
195-
currCar->mPhysicsComponent->ClearForces();
195+
currCar->mPhysicsBody->ClearForces();
196196
}
197197
}
198198
}
@@ -219,7 +219,7 @@ void GameCheatsWindow::CreateCarNearby(CarStyle* carStyle, Pedestrian* pedestria
219219
if (carStyle == nullptr || pedestrian == nullptr)
220220
return;
221221

222-
glm::vec3 currPosition = pedestrian->mPhysicsComponent->GetPosition();
222+
glm::vec3 currPosition = pedestrian->mPhysicsBody->GetPosition();
223223
currPosition.x += 0.5f;
224224
currPosition.z += 0.5f;
225225

src/GameDefs.h

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,10 @@
6161
#define CANONICAL_FPS 25 // gta1 game speed
6262

6363
// forwards
64+
6465
class Pedestrian;
6566
class Vehicle;
67+
class Projectile;
6668

6769
// some game objects has null identifier, they are dacals, projectiles and short-lived effects
6870
#define GAMEOBJECT_ID_NULL 0
@@ -716,6 +718,11 @@ enum eSpriteAnimID
716718
eSpriteAnimID_Ped_ShootRPGWhileRunning,
717719
// cops
718720

721+
// projectiles
722+
eSpriteAnimID_Projectile_Rocket,
723+
eSpriteAnimID_Projectile_Bullet,
724+
eSpriteAnimID_Projectile_Flame,
725+
719726
eSpriteAnimID_COUNT
720727
};
721728

@@ -813,4 +820,28 @@ enum ePedestrianDeathReason
813820
ePedestrianDeathReason_HitByCar,
814821
};
815822

816-
decl_enum_strings(ePedestrianDeathReason);
823+
decl_enum_strings(ePedestrianDeathReason);
824+
825+
enum eProjectileType
826+
{
827+
eProjectileType_Bullet, // pistol, machinegun
828+
eProjectileType_Flame, // flamethrower
829+
eProjectileType_Rocket, // rocket launcher, tank rocket
830+
eProjectileType_COUNT
831+
};
832+
decl_enum_strings(eProjectileType);
833+
834+
// projectile type info
835+
struct ProjectileStyle
836+
{
837+
public:
838+
eProjectileType mTypeID;
839+
eSpriteAnimID mAnimID;
840+
float mBaseDistance; // how far projectile can fly, meters
841+
float mProjectileRadius; // size, meters
842+
float mSpeed; // how fast projectile moves, meters
843+
float mBasePrimaryDamageRadius; // how far projectile can impact, meters
844+
float mBaseSecondaryDamageRadius; // // how far projectile can impact, meters
845+
// todo: damage
846+
// todo: impact type
847+
};

src/GameObject.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,9 @@ GameObject::GameObject(eGameObjectType objectTypeID, GameObjectID uniqueID)
1717

1818
GameObject::~GameObject()
1919
{
20-
}
20+
}
21+
22+
void GameObject::MarkForDeletion()
23+
{
24+
gGameObjectsManager.MarkForDeletion(this);
25+
}

src/GameObject.h

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,21 @@ class GameObject: public cxx::noncopyable
3030
{
3131
}
3232

33+
// schedule object to despawn
34+
void MarkForDeletion();
35+
36+
// shortcuts
37+
inline bool IsPedestrianObject() const { return mObjectTypeID == eGameObjectType_Pedestrian; }
38+
inline bool IsProjectileObject() const { return mObjectTypeID == eGameObjectType_Projectile; }
39+
inline bool IsDecorationObject() const { return mObjectTypeID == eGameObjectType_Decoration; }
40+
inline bool IsCarObject() const { return mObjectTypeID == eGameObjectType_Car; }
41+
inline bool IsPowerupObject() const { return mObjectTypeID == eGameObjectType_Powerup; }
42+
inline bool IsObstacleObject() const { return mObjectTypeID == eGameObjectType_Obstacle; }
43+
3344
protected:
3445
GameObject(eGameObjectType objectTypeID, GameObjectID uniqueID);
3546

3647
private:
37-
// internal stuff that can be touched only by PedestrianManager
3848
cxx::intrusive_node<GameObject> mObjectsNode; // updatable and drawable entities
3949
cxx::intrusive_node<GameObject> mDeleteObjectsNode; // to remove queue
4050
};

src/GameObjectsManager.cpp

Lines changed: 71 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
#include "Pedestrian.h"
55
#include "PhysicsComponents.h"
66
#include "GameMapManager.h"
7+
#include "Projectile.h"
78

89
GameObjectsManager gGameObjectsManager;
910

@@ -40,29 +41,38 @@ void GameObjectsManager::UpdateFrame()
4041
DestroyPendingObjects();
4142

4243
// update pedestrians
43-
for (Pedestrian* currentPed: mPedestriansList) // warning: dont add or remove peds during this loop
44+
for (Pedestrian* currObject: mPedestriansList) // warning: dont add or remove peds during this loop
4445
{
45-
if (mDeleteList.contains(&currentPed->mDeleteObjectsNode))
46+
if (mDeleteList.contains(&currObject->mDeleteObjectsNode))
4647
continue;
4748

48-
currentPed->UpdateFrame();
49+
currObject->UpdateFrame();
4950
}
5051

5152
// update cars
52-
for (Vehicle* currentCar: mCarsList) // warning: dont add or remove cars during this loop
53+
for (Vehicle* currObject: mCarsList) // warning: dont add or remove cars during this loop
5354
{
54-
if (mDeleteList.contains(&currentCar->mDeleteObjectsNode))
55+
if (mDeleteList.contains(&currObject->mDeleteObjectsNode))
5556
continue;
5657

57-
currentCar->UpdateFrame();
58+
currObject->UpdateFrame();
59+
}
60+
61+
// update projectiles
62+
for (Projectile* currObject: mProjectilesList) // warning: dont add or remove cars during this loop
63+
{
64+
if (mDeleteList.contains(&currObject->mDeleteObjectsNode))
65+
continue;
66+
67+
currObject->UpdateFrame();
5868
}
5969
}
6070

6171
void GameObjectsManager::DebugDraw()
6272
{
6373
}
6474

65-
Pedestrian* GameObjectsManager::CreatePedestrian(const glm::vec3& startPosition, cxx::angle_t startRotation)
75+
Pedestrian* GameObjectsManager::CreatePedestrian(const glm::vec3& position, cxx::angle_t heading)
6676
{
6777
GameObjectID pedestrianID = GenerateUniqueID();
6878

@@ -73,15 +83,14 @@ Pedestrian* GameObjectsManager::CreatePedestrian(const glm::vec3& startPosition,
7383
mObjectsList.insert(&instance->mObjectsNode);
7484

7585
// init
76-
instance->Spawn(startPosition, startRotation);
86+
instance->Spawn(position, heading);
7787
return instance;
7888
}
7989

80-
Vehicle* GameObjectsManager::CreateCar(const glm::vec3& startPosition, cxx::angle_t carRotation, CarStyle* carStyle)
90+
Vehicle* GameObjectsManager::CreateCar(const glm::vec3& position, cxx::angle_t heading, CarStyle* carStyle)
8191
{
82-
StyleData& styleData = gGameMap.mStyleData;
83-
84-
debug_assert(styleData.IsLoaded());
92+
debug_assert(gGameMap.mStyleData.IsLoaded());
93+
debug_assert(carStyle);
8594
GameObjectID carID = GenerateUniqueID();
8695

8796
Vehicle* instance = mCarsPool.create(carID);
@@ -92,22 +101,53 @@ Vehicle* GameObjectsManager::CreateCar(const glm::vec3& startPosition, cxx::angl
92101

93102
// init
94103
instance->mCarStyle = carStyle;
95-
instance->Spawn(startPosition, carRotation);
104+
instance->Spawn(position, heading);
96105
return instance;
97106
}
98107

99-
Vehicle* GameObjectsManager::CreateCar(const glm::vec3& position, cxx::angle_t carRotation, eCarModel carModel)
108+
Vehicle* GameObjectsManager::CreateCar(const glm::vec3& position, cxx::angle_t heading, eCarModel carModel)
100109
{
101-
StyleData& styleData = gGameMap.mStyleData;
102-
debug_assert(styleData.IsLoaded());
103-
104-
for (CarStyle& currStyle: styleData.mCars)
110+
Vehicle* vehicle = nullptr;
111+
for (CarStyle& currStyle: gGameMap.mStyleData.mCars)
105112
{
106113
if (currStyle.mModelId == carModel)
107-
return CreateCar(position, carRotation, &currStyle);
114+
{
115+
vehicle = CreateCar(position, heading, &currStyle);
116+
break;
117+
}
108118
}
109-
debug_assert(false);
110-
return nullptr;
119+
debug_assert(vehicle);
120+
return vehicle;
121+
}
122+
123+
Projectile* GameObjectsManager::CreateProjectile(const glm::vec3& position, cxx::angle_t heading, eProjectileType typeID)
124+
{
125+
Projectile* projectile = nullptr;
126+
debug_assert(typeID < eProjectileType_COUNT);
127+
for (ProjectileStyle& currStyle: gGameMap.mStyleData.mProjectiles)
128+
{
129+
if (currStyle.mTypeID == typeID)
130+
{
131+
projectile = CreateProjectile(position, heading, &currStyle);
132+
break;
133+
}
134+
}
135+
debug_assert(projectile);
136+
return projectile;
137+
}
138+
139+
Projectile* GameObjectsManager::CreateProjectile(const glm::vec3& position, cxx::angle_t heading, ProjectileStyle* desc)
140+
{
141+
debug_assert(gGameMap.mStyleData.IsLoaded());
142+
debug_assert(desc);
143+
144+
Projectile* instance = mProjectilesPool.create(desc);
145+
debug_assert(instance);
146+
mObjectsList.insert(&instance->mObjectsNode);
147+
mProjectilesList.insert(&instance->mProjectilesListNode);
148+
// init
149+
instance->Spawn(position, heading);
150+
return instance;
111151
}
112152

113153
Vehicle* GameObjectsManager::GetCarByID(GameObjectID objectID) const
@@ -185,14 +225,21 @@ void GameObjectsManager::DestroyGameObject(GameObject* object)
185225

186226
case eGameObjectType_Car:
187227
{
188-
Vehicle* car = static_cast<Vehicle*>(object);
228+
Vehicle* vehicle = static_cast<Vehicle*>(object);
189229

190-
mCarsList.remove(&car->mCarsListNode);
191-
mCarsPool.destroy(car);
230+
mCarsList.remove(&vehicle->mCarsListNode);
231+
mCarsPool.destroy(vehicle);
192232
}
193233
break;
194234

195235
case eGameObjectType_Projectile:
236+
{
237+
Projectile* projectile = static_cast<Projectile*>(object);
238+
239+
mProjectilesList.remove(&projectile->mProjectilesListNode);
240+
mProjectilesPool.destroy(projectile);
241+
}
242+
break;
196243
case eGameObjectType_Powerup:
197244
case eGameObjectType_Decoration:
198245
case eGameObjectType_Obstacle:

0 commit comments

Comments
 (0)