made bullet with a camera on the end. other tweaks

This commit is contained in:
derek
2024-11-26 17:07:36 -06:00
parent 86a05335e7
commit 86b084f694
17 changed files with 484 additions and 158 deletions

106
scripts/bullet_cam.gd Normal file
View File

@@ -0,0 +1,106 @@
extends RigidBody3D
@export var collision_shape : Node
var bullet_speed
var bullet_drop
var random_spread_amt
var bullet_damage
var instance_bullethole
var bullet_force_mod = 1.0
var distance_from_player
var player_position
var player_velocity
var bullet_active = true
var bullet_target : Node
var hold_cam_pos = null
var camera_start
var distance_to_cam_start
var player_cam_FOV : float
var opaque_color = Color(0.702, 0.557, 0.224)
var transparent_color = Color(0.702, 0.557, 0.224, 0)
@onready var level_control = get_tree().current_scene
@onready var player = level_control.player
@onready var mesh = $Cylinder
@onready var particles = $GPUParticles3D
@onready var enemy_particles = $GPUParticlesEnemy
@onready var hit_indicator = $Audio/HitIndicator
@onready var ray: RayCast3D = $RayCast3D
@onready var camera: Camera3D = $Camera3D
@onready var camera_handle: Node3D = $CameraHandle
@onready var bullet_material = mesh.get_surface_override_material(0)
const BULLET_CAM_FOV : float = 130
const BULLET_SENSITIVITY : float = 1
func _input(event):
if event is InputEventMouseMotion and hold_cam_pos == null:
var av_y = -event.relative.x * BULLET_SENSITIVITY
var av_x = -event.relative.y * BULLET_SENSITIVITY
angular_velocity += transform.basis * Vector3(av_x,av_y,0)
# Called when the node enters the scene tree for the first time.
func _ready():
Engine.time_scale = .01
player.gamespeed_controlled = true
player.controlled_elsewhere = true
player_cam_FOV = player.camera.fov
camera.fov = player_cam_FOV
camera_start = player.camera.global_position
camera.global_position = camera_start
distance_to_cam_start = camera.global_position.distance_to(camera_handle.global_position)
camera.current = true
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _physics_process(delta):
camera.fov = lerp(player_cam_FOV,BULLET_CAM_FOV, delta * 3000)
linear_velocity = transform.basis * Vector3(0, 0, -bullet_speed)
var distance_to_cam = camera.global_position.distance_to(camera_handle.global_position) / (distance_to_cam_start*2)
bullet_material.albedo_color = lerp(transparent_color,opaque_color,distance_to_cam)
if hold_cam_pos != null:
camera.global_position = hold_cam_pos
else:
camera.global_position = lerp(camera.global_position,camera_handle.global_position, delta * 300)
if ray.is_colliding() and hold_cam_pos == null:
hold_cam_pos = camera.global_position
Engine.time_scale = .005
func _on_body_entered(body: Node) -> void:
if !body.is_in_group("player"):
ray.enabled = false
if ray.is_colliding():
var ray_body = ray.get_collider()
if ray_body != null:
#bullethole effect
ray_body.add_child(instance_bullethole)
instance_bullethole.global_transform.origin = ray.get_collision_point()
if (abs(ray.get_collision_normal().y) > 0.99):
instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal(), Vector3(0,0,1))
else:
instance_bullethole.look_at(ray.get_collision_point() + ray.get_collision_normal())
if body.is_in_group("switch"):
body.hit()
if body.is_in_group("breakable"):
var current_velocity = transform.basis * Vector3(0,0,-1 * bullet_force_mod)
body.breaking(current_velocity)
despawn()
func despawn():
player.camera.current = true
player.controlled_elsewhere = false
player.gamespeed_controlled = false
#visible = false
#collision_shape.disabled = true
#await get_tree().create_timer(1).timeout
queue_free()