Bombs push other players, tweaked level
This commit is contained in:
@@ -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
|
||||
@@ -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
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user