add projectiles
This commit is contained in:
@@ -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)
|
||||
|
||||
22
scripts/enemies/projectile_spawner.gd
Normal file
22
scripts/enemies/projectile_spawner.gd
Normal 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
|
||||
32
scripts/projectiles/projectile.gd
Normal file
32
scripts/projectiles/projectile.gd
Normal 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
|
||||
Reference in New Issue
Block a user