Skip to content

Commit 8888f2f

Browse files
committed
Tweak subweapons collision handling, add weapon category in devtool
- Make subweapons hit enemies easier by checking collision with sprite frame instead of bounding box (which is usually smaller) - Refactor RangedWeapon: remove owner dependency - Add ranged weapon type in devtool: Now you can throw weapons from mouse cursor's position - Other misc cleanup
1 parent 1ba080f commit 8888f2f

31 files changed

+158
-237
lines changed

src/GameCuaTao/Castlevania.vcxproj

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,6 @@
194194
<ClCompile Include="Castlevania\Models\GameObject.cpp" />
195195
<ClCompile Include="Castlevania\Models\Items\Door.cpp" />
196196
<ClCompile Include="Castlevania\Models\Items\DoorRenderingSystem.cpp" />
197-
<ClCompile Include="Castlevania\Models\Items\Fireball.cpp" />
198197
<ClCompile Include="Castlevania\Models\Items\MoneyBag.cpp" />
199198
<ClCompile Include="Castlevania\Models\Systems\Rendering\ItemRenderingSystem.cpp" />
200199
<ClCompile Include="Castlevania\Models\Items\Powerup.cpp" />
@@ -222,8 +221,9 @@
222221
<ClCompile Include="Castlevania\Models\Weapons\HolyWater.cpp" />
223222
<ClCompile Include="Castlevania\Models\Weapons\HolyWaterRenderingSystem.cpp" />
224223
<ClCompile Include="Castlevania\Models\Weapons\HolyWaterResponseSystem.cpp" />
224+
<ClCompile Include="Castlevania\Models\Weapons\PoisonResponseSystem.cpp" />
225225
<ClCompile Include="Castlevania\Models\Weapons\RangedWeapon.cpp" />
226-
<ClCompile Include="Castlevania\Models\Weapons\WhipCollisionSystem.cpp" />
226+
<ClCompile Include="Castlevania\Models\Weapons\WeaponCollisionSystem.cpp" />
227227
<ClCompile Include="Castlevania\Models\Weapons\WhipFlashingRenderingSystem.cpp" />
228228
<ClCompile Include="Castlevania\Models\Weapons\WhipRenderingSystem.cpp" />
229229
<ClCompile Include="Castlevania\Models\Weapons\WeaponResponseSystem.cpp" />
@@ -354,7 +354,6 @@
354354
<ClInclude Include="Castlevania\Models\IBoss.h" />
355355
<ClInclude Include="Castlevania\Models\Items\Door.h" />
356356
<ClInclude Include="Castlevania\Models\Items\DoorRenderingSystem.h" />
357-
<ClInclude Include="Castlevania\Models\Items\Fireball.h" />
358357
<ClInclude Include="Castlevania\Models\IAttackable.h" />
359358
<ClInclude Include="Castlevania\Models\Items\MoneyBag.h" />
360359
<ClInclude Include="Castlevania\Models\IThrowable.h" />
@@ -391,8 +390,9 @@
391390
<ClInclude Include="Castlevania\Models\Weapons\HolyWater.h" />
392391
<ClInclude Include="Castlevania\Models\Weapons\HolyWaterRenderingSystem.h" />
393392
<ClInclude Include="Castlevania\Models\Weapons\HolyWaterResponseSystem.h" />
393+
<ClInclude Include="Castlevania\Models\Weapons\PoisonResponseSystem.h" />
394394
<ClInclude Include="Castlevania\Models\Weapons\RangedWeapon.h" />
395-
<ClInclude Include="Castlevania\Models\Weapons\WhipCollisionSystem.h" />
395+
<ClInclude Include="Castlevania\Models\Weapons\WeaponCollisionSystem.h" />
396396
<ClInclude Include="Castlevania\Models\Weapons\WhipFlashingRenderingSystem.h" />
397397
<ClInclude Include="Castlevania\Models\Weapons\WhipRenderingSystem.h" />
398398
<ClInclude Include="Castlevania\Models\Weapons\WeaponResponseSystem.h" />

src/GameCuaTao/Castlevania.vcxproj.filters

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -345,15 +345,9 @@
345345
<ClCompile Include="Castlevania\Models\Characters\Enemies\FishmanControlSystem.cpp">
346346
<Filter>Source Files</Filter>
347347
</ClCompile>
348-
<ClCompile Include="Castlevania\Models\Items\Fireball.cpp">
349-
<Filter>Source Files</Filter>
350-
</ClCompile>
351348
<ClCompile Include="Castlevania\Models\Spawners\SpawnArea.cpp">
352349
<Filter>Source Files</Filter>
353350
</ClCompile>
354-
<ClCompile Include="Castlevania\Models\Weapons\WhipCollisionSystem.cpp">
355-
<Filter>Source Files</Filter>
356-
</ClCompile>
357351
<ClCompile Include="Castlevania\Models\Spawners\ZombieSpawnArea.cpp">
358352
<Filter>Source Files</Filter>
359353
</ClCompile>
@@ -477,6 +471,12 @@
477471
<ClCompile Include="Castlevania\Models\Weapons\HolyWaterRenderingSystem.cpp">
478472
<Filter>Source Files</Filter>
479473
</ClCompile>
474+
<ClCompile Include="Castlevania\Models\Weapons\PoisonResponseSystem.cpp">
475+
<Filter>Source Files</Filter>
476+
</ClCompile>
477+
<ClCompile Include="Castlevania\Models\Weapons\WeaponCollisionSystem.cpp">
478+
<Filter>Source Files</Filter>
479+
</ClCompile>
480480
</ItemGroup>
481481
<ItemGroup>
482482
<ClInclude Include="Library\pugixml.hpp">
@@ -950,9 +950,6 @@
950950
<ClInclude Include="Castlevania\Models\IAttackable.h">
951951
<Filter>Header Files</Filter>
952952
</ClInclude>
953-
<ClInclude Include="Castlevania\Models\Items\Fireball.h">
954-
<Filter>Header Files</Filter>
955-
</ClInclude>
956953
<ClInclude Include="Castlevania\Models\Spawners\SpawnArea.h">
957954
<Filter>Header Files</Filter>
958955
</ClInclude>
@@ -962,9 +959,6 @@
962959
<ClInclude Include="Castlevania\Models\Spawners\ISpawner.h">
963960
<Filter>Header Files</Filter>
964961
</ClInclude>
965-
<ClInclude Include="Castlevania\Models\Weapons\WhipCollisionSystem.h">
966-
<Filter>Header Files</Filter>
967-
</ClInclude>
968962
<ClInclude Include="Castlevania\Models\Spawners\ZombieSpawnArea.h">
969963
<Filter>Header Files</Filter>
970964
</ClInclude>
@@ -1109,6 +1103,12 @@
11091103
<ClInclude Include="Castlevania\Models\Weapons\HolyWaterRenderingSystem.h">
11101104
<Filter>Header Files</Filter>
11111105
</ClInclude>
1106+
<ClInclude Include="Castlevania\Models\Weapons\PoisonResponseSystem.h">
1107+
<Filter>Header Files</Filter>
1108+
</ClInclude>
1109+
<ClInclude Include="Castlevania\Models\Weapons\WeaponCollisionSystem.h">
1110+
<Filter>Header Files</Filter>
1111+
</ClInclude>
11121112
</ItemGroup>
11131113
<ItemGroup>
11141114
<None Include="cpp.hint" />

src/GameCuaTao/Castlevania/Content/GameStats/Items/Fireball.xml renamed to src/GameCuaTao/Castlevania/Content/GameStats/Weapons/Fireball.xml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44

55
<Dictionary
66
Name="Fireball"
7-
Speed="300.0"
7+
ThrowSpeed_X="300.0"
8+
ThrowSpeed_Y="0.0"
89
Attack="2">
910
</Dictionary>
1011

src/GameCuaTao/Castlevania/Content/Items/Holy_Water.atlas.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,27 +10,27 @@
1010

1111
<Sprite ID="holy_water_flame_01">
1212
<SpriteFrame Left="34" Top="0" Width="34" Height="30" />
13-
<SpriteBoundary Left="45" Top="0" Width="12" Height="30" />
13+
<SpriteBoundary Left="39" Top="0" Width="24" Height="30" />
1414
</Sprite>
1515

1616
<Sprite ID="holy_water_flame_02">
1717
<SpriteFrame Left="68" Top="0" Width="34" Height="30" />
18-
<SpriteBoundary Left="79" Top="0" Width="12" Height="30" />
18+
<SpriteBoundary Left="73" Top="0" Width="24" Height="30" />
1919
</Sprite>
2020

2121
<Sprite ID="holy_water_flame_03">
2222
<SpriteFrame Left="102" Top="0" Width="34" Height="30" />
23-
<SpriteBoundary Left="113" Top="0" Width="12" Height="30" />
23+
<SpriteBoundary Left="107" Top="0" Width="24" Height="30" />
2424
</Sprite>
2525

2626
<Sprite ID="holy_water_flame_04">
2727
<SpriteFrame Left="136" Top="0" Width="34" Height="30" />
28-
<SpriteBoundary Left="147" Top="0" Width="12" Height="30" />
28+
<SpriteBoundary Left="141" Top="0" Width="24" Height="30" />
2929
</Sprite>
3030

3131
<Sprite ID="holy_water_flame_05">
3232
<SpriteFrame Left="170" Top="0" Width="34" Height="30" />
33-
<SpriteBoundary Left="181" Top="0" Width="12" Height="30" />
33+
<SpriteBoundary Left="175" Top="0" Width="24" Height="30" />
3434
</Sprite>
3535
</Spritesheet>
3636

src/GameCuaTao/Castlevania/Models/Characters/Enemies/Fishman.cpp

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -67,9 +67,12 @@ void Fishman::WalkLeft()
6767
SetFishmanState(FishmanState::WALKING);
6868
}
6969

70-
void Fishman::Shoot(std::unique_ptr<GameObject> fireball)
70+
void Fishman::Shoot(std::unique_ptr<RangedWeapon> fireball)
7171
{
7272
this->fireball = std::move(fireball);
73+
this->fireball->GetBody().Enabled(false);
74+
this->fireball->SetVisibility(false);
75+
7376
velocity.x = 0.0f;
7477
SetFishmanState(FishmanState::SHOOTING);
7578
shootingTimer.Start();
@@ -106,14 +109,6 @@ void Fishman::ReleaseFireball()
106109
fishmanRect.top + 6
107110
};
108111

109-
fireball->SetPosition(position);
110-
111-
auto fireballSpeed = fireball->GetSpeed();
112-
113-
if (facing == Facing::Right)
114-
fireball->SetVelocity_X(fireballSpeed);
115-
else
116-
fireball->SetVelocity_X(-fireballSpeed);
117-
112+
fireball->Throw(position);
118113
collisionGrid->Add(std::move(fireball), CollisionObjectType::Entity);
119114
}

src/GameCuaTao/Castlevania/Models/Characters/Enemies/Fishman.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
#include "Direct2DGame/Utilities/Stopwatch.h"
44
#include "Enemy.h"
5+
#include "../../Weapons/RangedWeapon.h"
56
#include "../../Factories/ObjectCollection.h"
67

78
namespace Castlevania
@@ -27,14 +28,14 @@ namespace Castlevania
2728
void Launch();
2829
void WalkRight();
2930
void WalkLeft();
30-
void Shoot(std::unique_ptr<GameObject> fireball);
31+
void Shoot(std::unique_ptr<RangedWeapon> fireball);
3132

3233
private:
3334
float launchSpeed;
3435
FishmanState fishmanState;
3536
Stopwatch shootingTimer;
3637

37-
std::unique_ptr<GameObject> fireball;
38+
std::unique_ptr<RangedWeapon> fireball;
3839

3940
// Fishman animation stop updating when in falling state
4041
void Freeze();

src/GameCuaTao/Castlevania/Models/Characters/Enemies/GiantBat.cpp

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,7 @@ void GiantBat::Update(UpdateData &updateData)
121121
case GiantBatState::SHOOTING:
122122
if (shootingTimer.ElapsedMilliseconds() > SHOOTING_TIME)
123123
{
124-
if (fireball != nullptr)
125-
collisionGrid->Add(std::move(fireball), CollisionObjectType::Entity);
126-
124+
ReleaseFireball();
127125
Hover();
128126
shootingTimer.Reset();
129127
}
@@ -159,13 +157,18 @@ void GiantBat::Dive(Vector2 playerPosition)
159157
DoDiveAttack();
160158
}
161159

162-
void GiantBat::Shoot(std::unique_ptr<GameObject> fireball, Vector2 destination)
160+
void GiantBat::Shoot(std::unique_ptr<RangedWeapon> fireball, Vector2 destination)
163161
{
164162
auto fireballPosition = GetOriginPosition();
165163
auto direction = Vector2::Normalize(destination - fireballPosition);
166-
auto fireballSpeed = fireball->GetSpeed();
164+
auto fireballSpeed = fireball->GetThrowVelocity().x;
165+
166+
if (direction.x > 0)
167+
fireball->SetFacing(Facing::Right);
168+
else
169+
fireball->SetFacing(Facing::Left);
167170

168-
fireball->SetVelocity(direction * fireballSpeed);
171+
fireball->SetThrowVelocity(direction * fireballSpeed);
169172
fireball->SetPosition(fireballPosition);
170173

171174
this->fireball = std::move(fireball);
@@ -191,3 +194,12 @@ void GiantBat::DoDiveAttack()
191194
{
192195
SetGiantBatState(GiantBatState::DIVING);
193196
}
197+
198+
void GiantBat::ReleaseFireball()
199+
{
200+
if (fireball == nullptr)
201+
return;
202+
203+
fireball->Throw(fireball->GetPosition());
204+
collisionGrid->Add(std::move(fireball), CollisionObjectType::Entity);
205+
}

src/GameCuaTao/Castlevania/Models/Characters/Enemies/GiantBat.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
#include "Direct2DGame/Utilities/Stopwatch.h"
44
#include "Enemy.h"
55
#include "../../IBoss.h"
6-
#include "../../Items/Fireball.h"
6+
#include "../../Weapons/RangedWeapon.h"
77

88
namespace Castlevania
99
{
@@ -46,7 +46,7 @@ namespace Castlevania
4646
void Hover();
4747
void Fly(float distance);
4848
void Dive(Vector2 playerPosition);
49-
void Shoot(std::unique_ptr<GameObject> fireball, Vector2 destination);
49+
void Shoot(std::unique_ptr<RangedWeapon> fireball, Vector2 destination);
5050

5151
private:
5252
Vector2 playerPosition;
@@ -62,8 +62,9 @@ namespace Castlevania
6262
void SetGiantBatState(GiantBatState state);
6363
void Rise();
6464
void DoDiveAttack();
65+
void ReleaseFireball();
6566

66-
std::unique_ptr<GameObject> fireball;
67+
std::unique_ptr<RangedWeapon> fireball;
6768
Stopwatch shootingTimer;
6869

6970
friend class GiantBatMovementSystem;

src/GameCuaTao/Castlevania/Models/Characters/Enemies/PantherCollisionSystem.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ void PantherCollisionSystem::Update(UpdateData &updateData)
3131
}
3232

3333
// TODO: do we need to sort?
34-
body.SetCollisionData(FilterCollision(results));
34+
body.SetCollisionData(FilterCollisionResults(results));
3535

3636
// Check if player is inside active zone
3737
if (!parent.IsActive())

src/GameCuaTao/Castlevania/Models/Characters/Player/Player.cpp

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,6 @@ void Player::Update(UpdateData &updateData)
106106
{
107107
GameObject::Update(updateData);
108108
UpdateStates();
109-
UpdateSubWeapons(updateData);
110109

111110
whip->Update(updateData);
112111
}
@@ -169,15 +168,6 @@ void Player::UpdateStates()
169168
}
170169
}
171170

172-
void Player::UpdateSubWeapons(UpdateData &updateData)
173-
{
174-
if (subWeapon == nullptr)
175-
return;
176-
177-
if (subWeapon->GetBody().Enabled()) // weapon is flying and active
178-
collisionGrid->Add(std::move(subWeapon), CollisionObjectType::Entity);
179-
}
180-
181171
void Player::OnAttackComplete()
182172
{
183173
switch (attackState)
@@ -365,7 +355,6 @@ void Player::Throw(std::unique_ptr<RangedWeapon> weapon)
365355
return;
366356

367357
subWeapon = std::move(weapon);
368-
subWeapon->SetOwner(this);
369358
subWeapon->GetBody().Enabled(false);
370359
subWeapon->SetVisibility(false);
371360

@@ -439,7 +428,15 @@ void Player::DoThrow()
439428
if (subWeapon == nullptr)
440429
return;
441430

442-
subWeapon->Throw();
431+
auto playerBbox = GetBoundingBox();
432+
auto position = Vector2{
433+
playerBbox.left,
434+
playerBbox.top + 5
435+
};
436+
437+
subWeapon->SetFacing(facing);
438+
subWeapon->Throw(position);
439+
collisionGrid->Add(std::move(subWeapon), CollisionObjectType::Entity);
443440
}
444441

445442
void Player::Fall()

0 commit comments

Comments
 (0)