Skip to content

Commit

Permalink
#11: Update projectile to use raycast instead of area2d while area2d …
Browse files Browse the repository at this point in the history
…to support projectile to projectile collision. This resolves the collision problem
  • Loading branch information
Danil Ko committed Apr 14, 2021
1 parent 828e4cf commit 6f1862d
Show file tree
Hide file tree
Showing 15 changed files with 120 additions and 107 deletions.
2 changes: 1 addition & 1 deletion agents/AIAgent.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,11 @@
extents = Vector2( 29.6973, 47.915 )

[node name="AIAgent" instance=ExtResource( 2 )]
collision_mask = 27
script = ExtResource( 4 )
MaxSpeed = 300
MaxHealth = 100
RotationSpeed = 5.0
MaxEnergy = 100
TurretSpeed = 10
DetectRadius = 1000.0

Expand Down
6 changes: 6 additions & 0 deletions agents/Agent.cs
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,12 @@ public void setHealth(int health)
EmitSignal(nameof(HealthChangedSignal), health * 100 / MaxHealth);
}

public void setEnergy(int energy)
{
_energy = energy;
EmitSignal(nameof(HealthChangedSignal), energy * 100 / MaxEnergy);
}

public int getHealth()
{
return _health;
Expand Down
3 changes: 2 additions & 1 deletion agents/Agent.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@ radius = 50.0
[node name="Agent" type="KinematicBody2D" groups=[
"Obstacles",
]]
collision_layer = 31
collision_layer = 2
collision_mask = 15
script = ExtResource( 1 )

[node name="Body" type="Sprite" parent="."]
Expand Down
4 changes: 3 additions & 1 deletion agents/Player.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,9 @@ public void SetHUD(HUD hud, InventoryManager _inventoryManager)
Connect(nameof(Agent.HealthChangedSignal), _hud, nameof(HUD.UpdateHealth));
Connect(nameof(Agent.DefeatedAgentChangedSignal), _hud, nameof(HUD.UpdateDefeatedAgent));

setHealth(MaxHealth);
setEnergy(MaxEnergy);

for (int index = 0; index <= (int)Weapon.WeaponOrder.Left; index++)
{
Weapon.WeaponOrder weaponOrder = (Weapon.WeaponOrder)index;
Expand Down Expand Up @@ -78,7 +81,6 @@ public void SetHUD(HUD hud, InventoryManager _inventoryManager)
_inventoryUI = (InventoryUI)_hud.GetNode("controlGame/InventoryUI");
_inventoryUI.Initialize(_inventoryManager, CurrentInventory);


if (!_teamMapAI.IsConnected(nameof(TeamMapAI.TeamUnitUsageAmountChangeSignal), _hud, nameof(HUD.UpdateTeamUnitUsageAmount)))
{
_teamMapAI.Connect(nameof(TeamMapAI.TeamUnitUsageAmountChangeSignal), _hud, nameof(HUD.UpdateTeamUnitUsageAmount));
Expand Down
9 changes: 4 additions & 5 deletions agents/Player.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -7,19 +7,18 @@
extents = Vector2( 30.8586, 12.6283 )

[node name="Player" instance=ExtResource( 1 )]
collision_layer = 2
collision_mask = 31
script = ExtResource( 3 )
MaxSpeed = 1200
MaxHealth = 100
RotationSpeed = 100.0
MaxEnergy = 100

[node name="LeftHand" parent="." index="3"]
[node name="LeftHand" parent="." index="2"]
region_rect = Rect2( 882, 250, 56, 89 )

[node name="RightHand" parent="." index="4"]
[node name="RightHand" parent="." index="3"]
region_rect = Rect2( 882, 250, 56, 89 )

[node name="CollisionShape2D" parent="." index="11"]
[node name="CollisionShape2D" parent="." index="18"]
scale = Vector2( 1, 3.99872 )
shape = SubResource( 1 )
1 change: 1 addition & 0 deletions godot.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
<Compile Include="projectiles\Projectile.cs" />
<Compile Include="projectiles\LaserRay.cs" />
<Compile Include="projectiles\Missle.cs" />
<Compile Include="projectiles\ProjectileArea2D.cs" />
<Compile Include="projectiles\RifileBullet.cs" />
<Compile Include="environments\Obstacle.cs" />
<Compile Include="GameStates.cs" />
Expand Down
3 changes: 1 addition & 2 deletions projectiles/LaserRay.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,8 +62,7 @@ public override void _PhysicsProcess(float delta)
// Projectile will collide
if (GetCollider().HasMethod("_onProjectileAreaEntered"))
{

Projectile collider = (Projectile)GetCollider();
ProjectileArea2D collider = (ProjectileArea2D)(GetCollider());

// Only bullets from different team will cloide
if (collider.GetTeam() != _sourceTeam.CurrentTeamCode)
Expand Down
24 changes: 9 additions & 15 deletions projectiles/Missle.tscn
Original file line number Diff line number Diff line change
@@ -1,32 +1,29 @@
[gd_scene load_steps=10 format=2]
[gd_scene load_steps=9 format=2]

[ext_resource path="res://projectiles/Projectile.tscn" type="PackedScene" id=1]
[ext_resource path="res://assets/allSprites_retina_rotated.png" type="Texture" id=2]
[ext_resource path="res://assets/spr_smoke_strip24.png" type="Texture" id=3]
[ext_resource path="res://projectiles/Missle.cs" type="Script" id=4]

[sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 27.0382, 9.10533 )

[sub_resource type="CanvasItemMaterial" id=2]
[sub_resource type="CanvasItemMaterial" id=1]
resource_local_to_scene = true
particles_animation = true
particles_anim_h_frames = 24
particles_anim_v_frames = 1
particles_anim_loop = false

[sub_resource type="Curve" id=3]
[sub_resource type="Curve" id=2]
_data = [ Vector2( 0, 0 ), 0.0, 0.201237, 0, 0, Vector2( 1, 1 ), -0.0628936, 0.0, 0, 0 ]

[sub_resource type="CurveTexture" id=4]
curve = SubResource( 3 )
[sub_resource type="CurveTexture" id=3]
curve = SubResource( 2 )

[sub_resource type="ParticlesMaterial" id=5]
[sub_resource type="ParticlesMaterial" id=4]
flag_disable_z = true
gravity = Vector3( 0, 0, 0 )
orbit_velocity = 0.0
orbit_velocity_random = 0.0
scale_curve = SubResource( 4 )
scale_curve = SubResource( 3 )
anim_speed = 1.0

[node name="Missle" instance=ExtResource( 1 )]
Expand All @@ -41,15 +38,12 @@ texture = ExtResource( 2 )
region_enabled = true
region_rect = Rect2( 361, 37, 58, 30 )

[node name="CollisionShape2D" parent="." index="1"]
shape = SubResource( 1 )

[node name="Trail" type="Particles2D" parent="." index="4"]
show_behind_parent = true
material = SubResource( 2 )
material = SubResource( 1 )
position = Vector2( -40, 0 )
amount = 32
lifetime = 0.4
local_coords = false
process_material = SubResource( 5 )
process_material = SubResource( 4 )
texture = ExtResource( 3 )
57 changes: 29 additions & 28 deletions projectiles/Projectile.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using Godot;
using System;

public class Projectile : Area2D
public class Projectile : RayCast2D
{
[Signal]
public delegate void ProjectileDamageSignal();
Expand All @@ -26,11 +26,13 @@ public class Projectile : Area2D

protected Vector2 Velocity;
private Vector2 acceleration;

// https://gamesounds.xyz/?dir=FXHome
private AudioStream _musicClip = (AudioStream)GD.Load("res://assets/sounds/Future Weapons 2 - Energy Gun - shot_single_2.wav");
private AudioStream _musicHitClip = (AudioStream)GD.Load("res://assets/sounds/Bullet Impact 22.wav");

private bool isProjectileStart = false;

public void Initialize(Vector2 position, Vector2 direction, Node2D inSource, Team sourceTeam, Node2D inTarget)
{
Connect(nameof(ProjectileDamageSignal), GetParent(), "_onDamageCalculation");
Expand All @@ -50,6 +52,9 @@ public void Initialize(Vector2 position, Vector2 direction, Node2D inSource, Tea
timer.WaitTime = Lifetime;
timer.Start();

isProjectileStart = true;
Enabled = isProjectileStart;

AudioManager audioManager = (AudioManager)GetNode("/root/AUDIOMANAGER");
audioManager.playSoundEffect(_musicClip);

Expand All @@ -69,6 +74,8 @@ private Vector2 seek()

public override void _PhysicsProcess(float delta)
{
if (isProjectileStart)
{
// Validate if target is available or is freed up (maybe no longer in scene)
if (target != null && IsInstanceValid(target))
{
Expand All @@ -81,12 +88,31 @@ public override void _PhysicsProcess(float delta)
Velocity += acceleration * delta;
Rotation = Velocity.Angle();
}
Position = Position + Velocity * delta;

if (IsColliding())
{
isProjectileStart = false;
Enabled = isProjectileStart;

// This is the code responsible for able to shoot down bullet with bullet
EmitSignal(nameof(ProjectileDamageSignal), Damage, GetCollisionNormal(), source, _sourceTeam, GetCollider());

Explode();

AudioManager audioManager = (AudioManager)GetNode("/root/AUDIOMANAGER");
audioManager.playSoundEffect(_musicHitClip);
}

GlobalPosition += Transform.x * Speed * delta;
CastTo = Vector2.Right * 2.0f * Speed * delta;
}
}


public void Explode()
{
isProjectileStart = false;
Enabled = isProjectileStart;

Velocity = new Vector2();
Sprite sprite = (Sprite)GetNode("Sprite");
Expand All @@ -96,31 +122,6 @@ public void Explode()
explosion.Play("smoke");
}

private void _onProjectileBodyEntered(Node2D body)
{
// This is the code responsible for able to shoot down bullet with bullet
Vector2 hitDir = Velocity.Normalized();
Explode();

AudioManager audioManager = (AudioManager)GetNode("/root/AUDIOMANAGER");
audioManager.playSoundEffect(_musicHitClip);
EmitSignal(nameof(ProjectileDamageSignal), Damage, hitDir, source, _sourceTeam, body);
}

private void _onProjectileAreaEntered(Area2D body)
{
// Projectile will collide
if (body.HasMethod("_onProjectileAreaEntered"))
{

// Only bullets from different team will cloide
if (((Projectile)body).GetTeam() != _sourceTeam.CurrentTeamCode)
{
Explode();
}
}
}

private void _onLifetimeTimeout()
{
Explode();
Expand Down
17 changes: 10 additions & 7 deletions projectiles/Projectile.tscn
Original file line number Diff line number Diff line change
@@ -1,25 +1,28 @@
[gd_scene load_steps=3 format=2]
[gd_scene load_steps=4 format=2]

[ext_resource path="res://projectiles/Projectile.cs" type="Script" id=1]
[ext_resource path="res://effects/Explosion.tscn" type="PackedScene" id=2]
[ext_resource path="res://projectiles/ProjectileArea2D.cs" type="Script" id=3]

[node name="Bullet" type="Area2D"]
collision_layer = 4
[node name="Projectile" type="RayCast2D"]
cast_to = Vector2( 50, 0 )
collision_mask = 7
script = ExtResource( 1 )

[node name="Sprite" type="Sprite" parent="."]
region_rect = Rect2( 1098, 442, 27, 17 )

[node name="CollisionShape2D" type="CollisionShape2D" parent="."]

[node name="Lifetime" type="Timer" parent="."]
wait_time = 10.0

[node name="Explosion" parent="." instance=ExtResource( 2 )]
visible = false
scale = Vector2( 0.5, 0.5 )
[connection signal="area_entered" from="." to="." method="_onProjectileAreaEntered"]
[connection signal="body_entered" from="." to="." method="_onProjectileBodyEntered"]

[node name="ProjectileArea2D" type="Area2D" parent="."]
script = ExtResource( 3 )

[node name="CollisionShape2D" type="CollisionShape2D" parent="ProjectileArea2D"]
[connection signal="timeout" from="Lifetime" to="." method="_onLifetimeTimeout"]
[connection signal="animation_finished" from="Explosion" to="." method="_OnExplosionAnimationFinished"]
[connection signal="area_entered" from="ProjectileArea2D" to="ProjectileArea2D" method="_onProjectileAreaEntered"]
38 changes: 38 additions & 0 deletions projectiles/ProjectileArea2D.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using Godot;
using System;

public class ProjectileArea2D : Area2D
{
Projectile projectile;

public override void _Ready()
{
projectile = (Projectile)GetParent();
}

public Team.TeamCode GetTeam()
{
return projectile.GetTeam();
}

public void Explode()
{
projectile.Explode();
}

private void _onProjectileAreaEntered(Area2D body)
{
// Projectile will collide
if (body.HasMethod("_onProjectileAreaEntered"))
{
ProjectileArea2D collider = (ProjectileArea2D)(body);

// Only bullets from different team will cloide
if (collider.GetTeam() != projectile.GetTeam())
{
collider.Explode();
}
}
}

}
36 changes: 14 additions & 22 deletions projectiles/RifileBullet.tscn
Original file line number Diff line number Diff line change
Expand Up @@ -4,44 +4,36 @@
[ext_resource path="res://assets/allSprites_retina_rotated.png" type="Texture" id=2]
[ext_resource path="res://projectiles/RifileBullet.cs" type="Script" id=3]
[ext_resource path="res://effects/Trail.tscn" type="PackedScene" id=4]
[ext_resource path="res://projectiles/Particle2DProjectile.tscn" type="PackedScene" id=5]

[sub_resource type="RectangleShape2D" id=1]
extents = Vector2( 19.6869, 7.45926 )

[sub_resource type="ParticlesMaterial" id=2]
emission_shape = 2
emission_box_extents = Vector3( 20, 20, 0 )
direction = Vector3( 0, 0, 0 )
gravity = Vector3( 0, 0, 0 )
linear_accel = 10.0
scale = 5.0
color = Color( 0.5, 3, 6, 1 )
extents = Vector2( 20.125, 7.75 )

[node name="RifileBullet" instance=ExtResource( 1 )]
script = ExtResource( 3 )
Speed = 2000
Damage = 10
Lifetime = 5.0
Lifetime = 10.0

[node name="Sprite" parent="." index="0"]
self_modulate = Color( 0.65, 12.21, 31.79, 1 )
modulate = Color( 1, 1, 1, 0.478431 )
self_modulate = Color( 0.65098, 12.2118, 31.7882, 0.509804 )
rotation = 3.14159
texture = ExtResource( 2 )
region_enabled = true
region_rect = Rect2( 559, 46, 38, 15 )

[node name="CollisionShape2D" parent="." index="1"]
[node name="ProjectileArea2D" parent="." index="3"]
visible = false
shape = SubResource( 1 )
collision_layer = 4
collision_mask = 4

[node name="Particles2D" type="Particles2D" parent="." index="4"]
visible = false
rotation = -1.5708
amount = 3
lifetime = 2.0
speed_scale = 5.0
process_material = SubResource( 2 )
[node name="CollisionShape2D" parent="ProjectileArea2D" index="0"]
shape = SubResource( 1 )

[node name="Trail" parent="." index="5" instance=ExtResource( 4 )]
[node name="Trail" parent="." index="4" instance=ExtResource( 4 )]
_length = 30
_width = 5.0

[node name="Particle2DProjectile" parent="." index="5" instance=ExtResource( 5 )]
scale = Vector2( 0.25, 0.25 )

0 comments on commit 6f1862d

Please sign in to comment.