add projectiles

This commit is contained in:
2025-02-18 02:28:33 +10:00
parent d53fe046a8
commit cd7bc7a82f
7 changed files with 137 additions and 9 deletions

View File

@@ -1,6 +1,8 @@
class_name DebugCollisionShapes
extends RefCounted
const MARGIN = 0.01
var _mesh_nodes: Array[MeshInstance3D] = []
@@ -21,32 +23,32 @@ func init(children: Array[Node], parent: Node, material: Material) -> void:
if shape_node.shape is CapsuleShape3D:
var shape := shape_node.shape as CapsuleShape3D
var mesh := CapsuleMesh.new()
mesh.radius = shape.radius
mesh.height = shape.height
mesh.radius = shape.radius + MARGIN
mesh.height = shape.height + MARGIN
mesh.radial_segments = 8
mesh.rings = 1
mesh_node.mesh = mesh
if shape_node.shape is SphereShape3D:
var shape := shape_node.shape as SphereShape3D
var mesh := SphereMesh.new()
mesh.radius = shape.radius
mesh.height = shape.radius * 2
mesh.radius = shape.radius + MARGIN
mesh.height = shape.radius * 2 + MARGIN
mesh.radial_segments = 8
mesh.rings = 4
mesh_node.mesh = mesh
if shape_node.shape is CylinderShape3D:
var shape := shape_node.shape as CylinderShape3D
var mesh := CylinderMesh.new()
mesh.top_radius = shape.radius
mesh.bottom_radius = shape.radius
mesh.height = shape.height
mesh.top_radius = shape.radius + MARGIN
mesh.bottom_radius = shape.radius + MARGIN
mesh.height = shape.height + MARGIN
mesh.radial_segments = 8
mesh.rings = 0
mesh_node.mesh = mesh
mesh_node.material_override = material
mesh_node.cast_shadow = GeometryInstance3D.SHADOW_CASTING_SETTING_OFF
mesh_node.visible = false
mesh_node.visible = Debugger.mode == Debugger.Mode.FULL
parent.add_child(mesh_node)
mesh_node.global_transform = (child as Node3D).global_transform
_mesh_nodes.append(mesh_node)

View File

@@ -0,0 +1,22 @@
extends Node3D
@export var _spawn_point: Node3D
@export var _projectile_scene: PackedScene
@export var _velocity: Vector3 = Vector3.FORWARD
@export var _spawn_rate: float = 2
var _spawn_timer: float
func _ready() -> void:
_spawn_timer = _spawn_rate
func _process(delta: float) -> void:
if _spawn_timer <= 0:
_spawn_timer = _spawn_rate
var projectile := _projectile_scene.instantiate() as Projectile
projectile.init(basis * _velocity, _spawn_point.global_position)
add_child(projectile)
_spawn_timer -= delta

View File

@@ -0,0 +1,32 @@
class_name Projectile
extends Area3D
@export var _collision_debug_material: Material
var _start_position: Vector3
var _velocity: Vector3
var _lifetime: float
var _life_timer: float
var _debug_collision_shapes := DebugCollisionShapes.new()
func _ready() -> void:
_life_timer = _lifetime
_debug_collision_shapes.init(get_children(), self, _collision_debug_material)
global_position = _start_position
func _process(delta: float) -> void:
if _life_timer <= 0:
queue_free()
_life_timer -= delta
global_position += _velocity * delta
func init(velocity: Vector3, start_position: Vector3, lifetime: float = 10) -> void:
_velocity = velocity
_start_position = start_position
_lifetime = lifetime