Bombs push other players, tweaked level

This commit is contained in:
Martin Felis
2024-01-28 01:14:56 +01:00
parent e1ec72e83e
commit d096da71a4
9 changed files with 120 additions and 16 deletions
+32
View File
@@ -0,0 +1,32 @@
class_name BombEmitter extends Node3D
@onready var collision_area : Area3D = $'Area3D'
const EXPLOSION_PUSH_SPEED: float = 8
var owning_player: Player = null
var processed = false
# Called when the node enters the scene tree for the first time.
func _ready():
collision_area.connect("body_entered", on_body_enter)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _physics_process(delta):
if processed:
queue_free()
processed = true
func on_body_enter(body: Node3D):
var player : Player = body as Player
if player and player != owning_player:
var vector_to_player: Vector3 = player.global_position - global_position
var length: float = vector_to_player.length()
if length > 0.01:
print ("Bomb pushes player " + str(player))
var direction : Vector3 = vector_to_player / length
player.explosion_influence = 1
player.explosion_velocity = direction * EXPLOSION_PUSH_SPEED
+17
View File
@@ -0,0 +1,17 @@
[gd_scene load_steps=3 format=3 uid="uid://dx6fxak21icvs"]
[ext_resource type="Script" path="res://entities/BombEmitter.gd" id="1_110pt"]
[sub_resource type="CylinderShape3D" id="CylinderShape3D_7yhwp"]
height = 0.5
radius = 3.0
[node name="BombEmitter" type="Node3D"]
script = ExtResource("1_110pt")
[node name="Area3D" type="Area3D" parent="."]
collision_layer = 0
collision_mask = 4
[node name="CollisionShape3D" type="CollisionShape3D" parent="Area3D"]
shape = SubResource("CylinderShape3D_7yhwp")
+12 -1
View File
@@ -15,7 +15,7 @@ class_name Player extends CharacterBody3D
@onready var geometry: MeshInstance3D = $Geometry
@onready var collision: CollisionShape3D = $CollisionShape3D
signal bomb_triggered
var bomb_emitter_scene = preload("res://entities/BombEmitter.tscn")
enum PlayerState {
Alive = 0,
@@ -31,6 +31,8 @@ var state_last : PlayerState = PlayerState.Dead
var radius = 0.15
var angle = 0
var is_dashing = false
var explosion_velocity: Vector3 = Vector3.ZERO
var explosion_influence: float = 0
var dash_time = 0
var bomb_time = 0
var coloring_sprite : Sprite2D
@@ -43,6 +45,7 @@ const DASH_ENERGY: float = 40
const BOMB_DURATION: float = 0.1
const BOMB_ENERGY: float = 60
const ENERGY_REPLENISH_RATE: float = 0.5;
const EXPLOSION_INFLUENCE_REDUCTION_RATE: float = 10.0;
# Get the gravity from the project settings to be synced with RigidBody nodes.
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
@@ -125,6 +128,10 @@ func _physics_process(delta):
if dash_time <= 0:
is_dashing = false
if explosion_influence > 0:
velocity += explosion_velocity
explosion_influence = max (0, explosion_influence - EXPLOSION_INFLUENCE_REDUCTION_RATE * delta)
move_and_slide()
coloring_sprite.global_position = calc_coloring_position()
@@ -152,3 +159,7 @@ func on_drop_bomb():
coloring_bomb_sprite.visible = true;
bomb_time = BOMB_DURATION
energy = max (0, energy - BOMB_ENERGY)
var bomb_emitter : BombEmitter = bomb_emitter_scene.instantiate()
bomb_emitter.global_position = global_position
get_parent_node_3d().add_child(bomb_emitter)