feat: tweaks and work on enemy car
This commit is contained in:
parent
c8e9e2fb4d
commit
a8f7bd20db
27
godot/GameObjects/aiming_beam.tscn
Normal file
27
godot/GameObjects/aiming_beam.tscn
Normal file
|
@ -0,0 +1,27 @@
|
|||
[gd_scene load_steps=4 format=3 uid="uid://g5cbht0novdc"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_36cjj"]
|
||||
shading_mode = 0
|
||||
albedo_color = Color(0.535553, 0.57272, 1, 1)
|
||||
|
||||
[sub_resource type="CapsuleMesh" id="CapsuleMesh_2fqgx"]
|
||||
material = SubResource("StandardMaterial3D_36cjj")
|
||||
radius = 0.195
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_v1t6q"]
|
||||
radius = 0.308023
|
||||
|
||||
[node name="Beam" type="Beam"]
|
||||
collision_layer = 0
|
||||
collision_mask = 4
|
||||
monitoring = false
|
||||
monitorable = false
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0)
|
||||
mesh = SubResource("CapsuleMesh_2fqgx")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0)
|
||||
shape = SubResource("CapsuleShape3D_v1t6q")
|
||||
disabled = true
|
25
godot/GameObjects/anti_air_beam.tscn
Normal file
25
godot/GameObjects/anti_air_beam.tscn
Normal file
|
@ -0,0 +1,25 @@
|
|||
[gd_scene load_steps=4 format=3 uid="uid://b74cqcryut76c"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_36cjj"]
|
||||
shading_mode = 0
|
||||
albedo_color = Color(0.227451, 0.827451, 0.678431, 1)
|
||||
|
||||
[sub_resource type="CapsuleMesh" id="CapsuleMesh_2fqgx"]
|
||||
material = SubResource("StandardMaterial3D_36cjj")
|
||||
radius = 0.39
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_v1t6q"]
|
||||
radius = 0.308023
|
||||
|
||||
[node name="Beam" type="Beam"]
|
||||
collision_layer = 0
|
||||
collision_mask = 4
|
||||
monitorable = false
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0)
|
||||
mesh = SubResource("CapsuleMesh_2fqgx")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0)
|
||||
shape = SubResource("CapsuleShape3D_v1t6q")
|
|
@ -8,6 +8,7 @@ albedo_color = Color(0.227451, 0.827451, 0.678431, 1)
|
|||
material = SubResource("StandardMaterial3D_36cjj")
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_v1t6q"]
|
||||
radius = 0.0869471
|
||||
|
||||
[node name="Beam" type="Beam"]
|
||||
collision_layer = 0
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
[gd_scene load_steps=13 format=3 uid="uid://dkvgi7x2epurk"]
|
||||
[gd_scene load_steps=14 format=3 uid="uid://dkvgi7x2epurk"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://1eawpg0buvah" path="res://GameObjects/player_turret.tscn" id="1_ing2c"]
|
||||
[ext_resource type="PackedScene" uid="uid://bm2mavtmnbaw1" path="res://Models/CarParts/SM_Veh_Hatch_01.fbx" id="1_tymeg"]
|
||||
[ext_resource type="PackedScene" uid="uid://cr1ytl0o43ftv" path="res://GameObjects/beacon_powerup.tscn" id="1_uhbx0"]
|
||||
[ext_resource type="PackedScene" uid="uid://bfq7ipx01ag7p" path="res://Models/CarParts/SM_Veh_Hatch_01_Bonnet_01.fbx" id="2_l8ox5"]
|
||||
|
@ -22,13 +23,14 @@ rough = true
|
|||
absorbent = true
|
||||
|
||||
[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_4xe1s"]
|
||||
points = PackedVector3Array(-1, -0.6, -2.11, 1, -0.6, -2.11, -1, -0.6, 1.405, 1, -0.6, 1.405, 0.76, -0.6, 2.065, -0.76, -0.6, 2.065, -0.74, 0.555, -1.74, 0.74, 0.555, -1.74, -0.665, 0.585, 0, 0.665, 0.585, 0, 0.665, -0.085, 1.88, -0.665, -0.085, 1.88)
|
||||
points = PackedVector3Array(-1.155, -0.6, -3.48, 1.155, -0.6, -3.48, -1.155, -0.6, 1.405, 1.155, -0.6, 1.405, 1.155, -0.6, 2.81, -1.155, -0.6, 2.81, -1.155, 1.16, -3.48, 1.155, 1.16, -3.48, -1.155, 1.16, 0.65, 1.155, 1.16, 0.65, 1.155, 0.335, 2.81, -1.155, 0.335, 2.81)
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_p38n5"]
|
||||
radius = 0.48558
|
||||
height = 2.765
|
||||
|
||||
[node name="CarPlayer" type="CarPlayer"]
|
||||
turret_scene = ExtResource("1_uhbx0")
|
||||
turret_scene = ExtResource("1_ing2c")
|
||||
beacon_scene = ExtResource("1_uhbx0")
|
||||
shield_scene = ExtResource("1_uhbx0")
|
||||
oversteer_curve = SubResource("Curve_dpk6q")
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
|
||||
[sub_resource type="Animation" id="Animation_xagif"]
|
||||
resource_name = "explode"
|
||||
length = 0.4
|
||||
length = 0.05
|
||||
step = 0.01
|
||||
tracks/0/type = "value"
|
||||
tracks/0/imported = false
|
||||
tracks/0/enabled = true
|
||||
|
@ -10,10 +11,10 @@ tracks/0/path = NodePath("CollisionShape3D:shape:radius")
|
|||
tracks/0/interp = 1
|
||||
tracks/0/loop_wrap = true
|
||||
tracks/0/keys = {
|
||||
"times": PackedFloat32Array(0, 0.4),
|
||||
"times": PackedFloat32Array(0, 0.05),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [0.001, 10.0]
|
||||
"values": [0.001, 2.0]
|
||||
}
|
||||
tracks/1/type = "value"
|
||||
tracks/1/imported = false
|
||||
|
@ -22,10 +23,10 @@ tracks/1/path = NodePath("MeshInstance3D:mesh:radius")
|
|||
tracks/1/interp = 1
|
||||
tracks/1/loop_wrap = true
|
||||
tracks/1/keys = {
|
||||
"times": PackedFloat32Array(0, 0.4),
|
||||
"times": PackedFloat32Array(0, 0.05),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [0.5, 10.0]
|
||||
"values": [0.5, 4.0]
|
||||
}
|
||||
tracks/2/type = "value"
|
||||
tracks/2/imported = false
|
||||
|
@ -34,10 +35,10 @@ tracks/2/path = NodePath("MeshInstance3D:mesh:height")
|
|||
tracks/2/interp = 1
|
||||
tracks/2/loop_wrap = true
|
||||
tracks/2/keys = {
|
||||
"times": PackedFloat32Array(0, 0.4),
|
||||
"times": PackedFloat32Array(0, 0.05),
|
||||
"transitions": PackedFloat32Array(1, 1),
|
||||
"update": 0,
|
||||
"values": [1.0, 20.0]
|
||||
"values": [1.0, 8.0]
|
||||
}
|
||||
|
||||
[sub_resource type="AnimationLibrary" id="AnimationLibrary_eacvo"]
|
||||
|
|
67
godot/GameObjects/enemy_car.tscn
Normal file
67
godot/GameObjects/enemy_car.tscn
Normal file
|
@ -0,0 +1,67 @@
|
|||
[gd_scene load_steps=7 format=3 uid="uid://b3p3ikural0cq"]
|
||||
|
||||
[ext_resource type="PackedScene" uid="uid://dsi3prgr34t85" path="res://Models/SM_Veh_Armored_Truck_01.fbx" id="1_2m0nm"]
|
||||
|
||||
[sub_resource type="Curve" id="Curve_dpk6q"]
|
||||
_data = [Vector2(0.962441, 0), 0.0, 0.0, 0, 0, Vector2(1, 0.32967), 0.0, 0.0, 0, 0]
|
||||
point_count = 2
|
||||
|
||||
[sub_resource type="Curve" id="Curve_htvme"]
|
||||
_data = [Vector2(0.683099, 0), 0.0, 0.0, 0, 0, Vector2(0.823944, 0.230769), 0.0615885, 0.0615885, 0, 0]
|
||||
point_count = 2
|
||||
|
||||
[sub_resource type="PhysicsMaterial" id="PhysicsMaterial_vwjm3"]
|
||||
friction = 0.0
|
||||
rough = true
|
||||
absorbent = true
|
||||
|
||||
[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_4xe1s"]
|
||||
points = PackedVector3Array(-1.155, -0.6, -3.48, 1.155, -0.6, -3.48, -1.155, -0.6, 1.405, 1.155, -0.6, 1.405, 1.155, -0.6, 2.81, -1.155, -0.6, 2.81, -1.155, 1.16, -3.48, 1.155, 1.16, -3.48, -1.155, 1.16, 0.65, 1.155, 1.16, 0.65, 1.155, 0.335, 2.81, -1.155, 0.335, 2.81)
|
||||
|
||||
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_p38n5"]
|
||||
radius = 0.48558
|
||||
height = 2.765
|
||||
|
||||
[node name="EnemyCar" type="EnemyCar"]
|
||||
oversteer_curve = SubResource("Curve_dpk6q")
|
||||
oversteer_curve_x_scale = 40.0
|
||||
understeer_curve = SubResource("Curve_htvme")
|
||||
understeer_curve_x_scale = 40.0
|
||||
max_slide_speed = 10.0
|
||||
oversteer_speed_penalty = 10.0
|
||||
collision_layer = 7
|
||||
collision_mask = 3
|
||||
mass = 1000.0
|
||||
physics_material_override = SubResource("PhysicsMaterial_vwjm3")
|
||||
center_of_mass_mode = 1
|
||||
center_of_mass = Vector3(0, 0.2, 0)
|
||||
can_sleep = false
|
||||
custom_integrator = true
|
||||
continuous_cd = true
|
||||
max_contacts_reported = 128
|
||||
contact_monitor = true
|
||||
linear_damp_mode = 1
|
||||
linear_damp = 0.5
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="."]
|
||||
transform = Transform3D(-1, -2.02334e-08, -8.50491e-08, -2.87879e-08, 0.994803, 0.10182, 8.25469e-08, 0.10182, -0.994803, 4.6449e-07, 2.24116, -4.7912)
|
||||
fov = 68.9128
|
||||
|
||||
[node name="Body" type="CollisionShape3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.27103, 0.174572)
|
||||
shape = SubResource("ConvexPolygonShape3D_4xe1s")
|
||||
|
||||
[node name="FrontWheels" type="CollisionShape3D" parent="."]
|
||||
transform = Transform3D(-4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0, 1, 0, 0.466215, 1.97394)
|
||||
shape = SubResource("CapsuleShape3D_p38n5")
|
||||
|
||||
[node name="BackWheels" type="CollisionShape3D" parent="."]
|
||||
transform = Transform3D(-4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, 0, 1, 0, 0.466215, -2.11718)
|
||||
shape = SubResource("CapsuleShape3D_p38n5")
|
||||
|
||||
[node name="RoofSlot" type="Node3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.31348, -0.510359)
|
||||
|
||||
[node name="Root Scene" parent="." instance=ExtResource("1_2m0nm")]
|
||||
|
||||
[node name="NavigationAgent3D" type="NavigationAgent3D" parent="."]
|
|
@ -8,7 +8,7 @@ top_radius = 0.055
|
|||
height = 0.39
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_rdc8b"]
|
||||
radius = 167.996
|
||||
radius = 61.2859
|
||||
|
||||
[sub_resource type="BoxMesh" id="BoxMesh_ag1t0"]
|
||||
size = Vector3(0.205, 1, 0.83)
|
||||
|
@ -19,27 +19,29 @@ radius = 0.392821
|
|||
[node name="Turret" type="Turret"]
|
||||
attack_classes = [&"EnemyTargetBody"]
|
||||
beam_scene = ExtResource("1_xm6id")
|
||||
fire_time = 0.2
|
||||
charge_time = 0.0
|
||||
lock_time = 0.5
|
||||
collision_layer = 0
|
||||
collision_mask = 0
|
||||
can_sleep = false
|
||||
freeze = true
|
||||
freeze_mode = 1
|
||||
|
||||
[node name="MeshInstance3D" type="MeshInstance3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.0758235, 0)
|
||||
mesh = SubResource("CylinderMesh_1btvq")
|
||||
|
||||
[node name="AwarenessArea" type="Area3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -15.7959, 0)
|
||||
collision_layer = 0
|
||||
collision_mask = 2
|
||||
monitorable = false
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="AwarenessArea"]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 13.9111, 0)
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.33142, -0.152048)
|
||||
shape = SubResource("SphereShape3D_rdc8b")
|
||||
|
||||
[node name="Gun" type="Node3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.273896, 0)
|
||||
top_level = true
|
||||
|
||||
[node name="Root Scene" parent="Gun" instance=ExtResource("2_vsdye")]
|
||||
transform = Transform3D(1.30858, 0, 0, 0, 1.30858, 0, 0, 0, 1.30858, 0.00200939, -0.12911, -0.0137266)
|
||||
|
|
|
@ -19,8 +19,14 @@ size = Vector3(0.205, 1, 0.83)
|
|||
[node name="Turret" type="Turret"]
|
||||
attack_classes = [&"CarPlayer"]
|
||||
beam_scene = ExtResource("1_7e7bw")
|
||||
collision_layer = 11
|
||||
collision_mask = 11
|
||||
collision_layer = 9
|
||||
collision_mask = 9
|
||||
axis_lock_linear_x = true
|
||||
axis_lock_linear_y = true
|
||||
axis_lock_linear_z = true
|
||||
axis_lock_angular_x = true
|
||||
axis_lock_angular_y = true
|
||||
axis_lock_angular_z = true
|
||||
freeze = true
|
||||
freeze_mode = 1
|
||||
|
||||
|
|
|
@ -43,4 +43,14 @@ offset_top = 30.0
|
|||
offset_right = 437.0
|
||||
offset_bottom = 339.0
|
||||
|
||||
[node name="Label" type="Label" parent="GameUI/ControlsScreen"]
|
||||
layout_mode = 0
|
||||
offset_left = 25.0
|
||||
offset_top = 19.0
|
||||
offset_right = 388.0
|
||||
offset_bottom = 290.0
|
||||
text = "W : Accelerate
|
||||
SPACE : Handbrake
|
||||
A/D : Steering"
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="."]
|
||||
|
|
File diff suppressed because one or more lines are too long
BIN
godot/Models/SM_Veh_Armored_Truck_01.fbx
(Stored with Git LFS)
Normal file
BIN
godot/Models/SM_Veh_Armored_Truck_01.fbx
(Stored with Git LFS)
Normal file
Binary file not shown.
41
godot/Models/SM_Veh_Armored_Truck_01.fbx.import
Normal file
41
godot/Models/SM_Veh_Armored_Truck_01.fbx.import
Normal file
|
@ -0,0 +1,41 @@
|
|||
[remap]
|
||||
|
||||
importer="scene"
|
||||
importer_version=1
|
||||
type="PackedScene"
|
||||
uid="uid://dsi3prgr34t85"
|
||||
path="res://.godot/imported/SM_Veh_Armored_Truck_01.fbx-28be66d7362753ffc32958c9e877fc38.scn"
|
||||
|
||||
[deps]
|
||||
|
||||
source_file="res://Models/SM_Veh_Armored_Truck_01.fbx"
|
||||
dest_files=["res://.godot/imported/SM_Veh_Armored_Truck_01.fbx-28be66d7362753ffc32958c9e877fc38.scn"]
|
||||
|
||||
[params]
|
||||
|
||||
nodes/root_type=""
|
||||
nodes/root_name=""
|
||||
nodes/apply_root_scale=true
|
||||
nodes/root_scale=1.0
|
||||
meshes/ensure_tangents=true
|
||||
meshes/generate_lods=true
|
||||
meshes/create_shadow_meshes=true
|
||||
meshes/light_baking=1
|
||||
meshes/lightmap_texel_size=0.2
|
||||
meshes/force_disable_compression=false
|
||||
skins/use_named_skins=true
|
||||
animation/import=true
|
||||
animation/fps=30
|
||||
animation/trimming=false
|
||||
animation/remove_immutable_tracks=true
|
||||
import_script/path=""
|
||||
_subresources={
|
||||
"materials": {
|
||||
"Body1": {
|
||||
"use_external/enabled": true,
|
||||
"use_external/path": "res://Models/World/City/city.tres"
|
||||
}
|
||||
}
|
||||
}
|
||||
gltf/naming_version=1
|
||||
gltf/embedded_image_handling=1
|
|
@ -62,6 +62,8 @@ void CarPlayer::damage() {
|
|||
|
||||
void CarPlayer::destroy_all_powerups() {
|
||||
for(int i = 0; i < this->roof_slot->get_child_count(); ++i) {
|
||||
if(this->roof_slot->get_child(0)->is_class("Turret"))
|
||||
Ref<RallyRushGameMode>(GameRoot3D::get_singleton()->get_game_mode())->notify_end_turret_pickup();
|
||||
this->roof_slot->get_child(0)->queue_free();
|
||||
}
|
||||
}
|
||||
|
@ -74,7 +76,10 @@ void CarPlayer::activate_powerup(Ref<PackedScene> scene) {
|
|||
this->end_of_powerup = Time::get_singleton()->get_ticks_msec() * 0.001 + this->powerup_duration;
|
||||
}
|
||||
|
||||
void CarPlayer::activate_turret() { this->activate_powerup(this->turret); }
|
||||
void CarPlayer::activate_turret() {
|
||||
Ref<RallyRushGameMode>(GameRoot3D::get_singleton()->get_game_mode())->notify_turret_pickup();
|
||||
this->activate_powerup(this->turret);
|
||||
}
|
||||
void CarPlayer::activate_beacon() { this->activate_powerup(this->beacon); }
|
||||
void CarPlayer::activate_shield() { this->activate_powerup(this->turret); }
|
||||
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
#include "drone.hpp"
|
||||
#include "godot_cpp/classes/animation_player.hpp"
|
||||
#include "godot_cpp/classes/global_constants.hpp"
|
||||
#include "rally_rush_game_mode.hpp"
|
||||
#include "utils/game_root.hpp"
|
||||
#include "utils/godot_macros.h"
|
||||
#include <godot_cpp/classes/navigation_agent3d.hpp>
|
||||
|
@ -15,6 +16,10 @@ void Drone::_ready() { GDGAMEONLY();
|
|||
this->agent = this->get_node<NavigationAgent3D>("NavigationAgent3D");
|
||||
this->anim = this->get_node<AnimationPlayer>("AnimationPlayer");
|
||||
this->player = Object::cast_to<CarPlayer>(GameRoot3D::get_singleton()->get_players()[0]->to_node());
|
||||
RallyRushGameMode *game_mode = Ref<RallyRushGameMode>(GameRoot3D::get_singleton()->get_game_mode()).ptr();
|
||||
game_mode->connect("key_found", callable_mp(this, &Drone::key_found));
|
||||
game_mode->connect("turret_pickup", callable_mp(this, &Drone::start_flee));
|
||||
game_mode->connect("end_turret_pickup", callable_mp(this, &Drone::end_flee));
|
||||
this->recalculate_navigation();
|
||||
}
|
||||
|
||||
|
@ -35,7 +40,7 @@ void Drone::_process(double delta_time) { GDGAMEONLY();
|
|||
|
||||
void Drone::process_chase(double delta_time) {
|
||||
this->process_navigate(delta_time);
|
||||
if(this->get_global_position().distance_to(this->agent->get_target_position()) < 2.f) {
|
||||
if(this->get_global_position().distance_to(this->agent->get_target_position()) < this->target_distance) {
|
||||
this->anim->play("drop");
|
||||
this->state = DroneState::DROP;
|
||||
}
|
||||
|
@ -73,6 +78,22 @@ void Drone::spawn_explosion() {
|
|||
this->queue_free();
|
||||
}
|
||||
|
||||
void Drone::key_found(int total) {
|
||||
if(total == 2) {
|
||||
this->speed *= 2;
|
||||
}
|
||||
}
|
||||
|
||||
void Drone::start_flee() {
|
||||
if(this->state == DroneState::CHASE)
|
||||
this->state = DroneState::FLEE;
|
||||
}
|
||||
|
||||
void Drone::end_flee() {
|
||||
if(this->state == DroneState::FLEE)
|
||||
this->state = DroneState::CHASE;
|
||||
}
|
||||
|
||||
void Drone::set_explosion_scene(Ref<PackedScene> scene) {
|
||||
this->explosion_scene = scene;
|
||||
}
|
||||
|
|
|
@ -22,6 +22,10 @@ public:
|
|||
void process_navigate(double delta_time);
|
||||
void recalculate_navigation();
|
||||
void spawn_explosion();
|
||||
void key_found(int total);
|
||||
|
||||
void start_flee();
|
||||
void end_flee();
|
||||
|
||||
void set_explosion_scene(Ref<PackedScene> scene);
|
||||
Ref<PackedScene> get_explosion_scene() const;
|
||||
|
@ -30,6 +34,7 @@ private:
|
|||
int next_recalc{10};
|
||||
float speed{30.f};
|
||||
float lead_time{2.f};
|
||||
float target_distance{3.f};
|
||||
DroneState state{DroneState::CHASE};
|
||||
CarPlayer *player{nullptr};
|
||||
Ref<PackedScene> explosion_scene{};
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
#include "drone_target.hpp"
|
||||
#include "godot_cpp/variant/utility_functions.hpp"
|
||||
#include "utils/godot_macros.h"
|
||||
|
||||
namespace godot {
|
||||
|
@ -13,6 +14,7 @@ void EnemyTargetBody::_enter_tree() {
|
|||
}
|
||||
|
||||
void EnemyTargetBody::damage() {
|
||||
UtilityFunctions::print("enemy destroyed");
|
||||
this->get_owner()->queue_free();
|
||||
}
|
||||
}
|
||||
|
|
39
src/enemy_car.cpp
Normal file
39
src/enemy_car.cpp
Normal file
|
@ -0,0 +1,39 @@
|
|||
#include "enemy_car.hpp"
|
||||
#include "godot_cpp/classes/navigation_agent3d.hpp"
|
||||
#include "utils/game_root.hpp"
|
||||
#include "utils/godot_macros.h"
|
||||
|
||||
namespace godot {
|
||||
void EnemyCar::_bind_methods() {
|
||||
#define CLASSNAME EnemyCar
|
||||
GDSIGNAL("damage");
|
||||
}
|
||||
|
||||
void EnemyCar::_enter_tree() {
|
||||
CarPhysics::_enter_tree();
|
||||
GDGAMEONLY();
|
||||
this->player = Object::cast_to<CarPlayer>(GameRoot3D::get_singleton()->get_players()[0]->to_node());
|
||||
this->agent = this->get_node<NavigationAgent3D>("NavigationAgent3D");
|
||||
}
|
||||
|
||||
void EnemyCar::_process(double delta_time) { GDGAMEONLY();
|
||||
this->process_navigate();
|
||||
}
|
||||
|
||||
void EnemyCar::process_navigate() {
|
||||
--this->next_recalc;
|
||||
if(this->next_recalc <= 0)
|
||||
this->recalculate_navigation();
|
||||
Vector3 const target_direction{this->agent->get_next_path_position() - this->get_global_position()};
|
||||
Vector3 const direction{this->get_global_basis().get_column(2)};
|
||||
float const ang_dif = target_direction.signed_angle_to(direction.normalized(), this->get_global_basis().get_column(1));
|
||||
this->set_target_speed(this->max_speed);
|
||||
this->set_current_steering(Math::abs(ang_dif) * this->steering_speed);
|
||||
this->set_brake(target_direction.length() < this->brake_distance);
|
||||
}
|
||||
|
||||
void EnemyCar::recalculate_navigation() {
|
||||
this->next_recalc = this->recalc_frame_interval;
|
||||
this->agent->set_target_position(this->player->get_global_position() + this->player->get_global_basis().get_column(2) * 4.f);
|
||||
}
|
||||
}
|
31
src/enemy_car.hpp
Normal file
31
src/enemy_car.hpp
Normal file
|
@ -0,0 +1,31 @@
|
|||
#ifndef ENEMY_CAR_HPP
|
||||
#define ENEMY_CAR_HPP
|
||||
|
||||
#include "car_physics.hpp"
|
||||
#include "car_player.hpp"
|
||||
#include "godot_cpp/classes/navigation_agent3d.hpp"
|
||||
|
||||
namespace godot {
|
||||
class EnemyCar : public CarPhysics {
|
||||
GDCLASS(EnemyCar, CarPhysics);
|
||||
static void _bind_methods();
|
||||
public:
|
||||
virtual void _enter_tree() override;
|
||||
virtual void _process(double delta_time) override;
|
||||
void damage();
|
||||
protected:
|
||||
void process_navigate();
|
||||
void recalculate_navigation();
|
||||
private:
|
||||
int next_recalc{0};
|
||||
int recalc_frame_interval{10};
|
||||
float turn_target_speed{3.f};
|
||||
float max_speed{45.f};
|
||||
float brake_distance{7.f};
|
||||
float steering_speed{1.f};
|
||||
NavigationAgent3D *agent{nullptr};
|
||||
CarPlayer *player{nullptr};
|
||||
};
|
||||
}
|
||||
|
||||
#endif // !ENEMY_CAR_HPP
|
|
@ -8,6 +8,8 @@ void RallyRushGameMode::_bind_methods() {
|
|||
#define CLASSNAME RallyRushGameMode
|
||||
GDSIGNAL("key_found", PropertyInfo(Variant::INT, "total_found"));
|
||||
GDSIGNAL("all_keys_found");
|
||||
GDSIGNAL("turret_pickup");
|
||||
GDSIGNAL("end_turret_pickup");
|
||||
}
|
||||
|
||||
int RallyRushGameMode::get_num_found_keys() {
|
||||
|
@ -21,6 +23,13 @@ void RallyRushGameMode::notify_key_found() {
|
|||
this->emit_signal("all_keys_found");
|
||||
}
|
||||
|
||||
void RallyRushGameMode::notify_turret_pickup() {
|
||||
this->emit_signal("turret_pickup");
|
||||
}
|
||||
|
||||
void RallyRushGameMode::notify_end_turret_pickup() {
|
||||
this->emit_signal("end_turret_pickup");
|
||||
}
|
||||
|
||||
#define GAME_END_SCENE "res://Levels/game_end_screen.tscn"
|
||||
void RallyRushGameMode::notify_player_death() {
|
||||
|
|
|
@ -12,6 +12,8 @@ public:
|
|||
void notify_key_found();
|
||||
void notify_player_death();
|
||||
void notify_player_escaped();
|
||||
void notify_turret_pickup();
|
||||
void notify_end_turret_pickup();
|
||||
private:
|
||||
int num_keys_found{0};
|
||||
};
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
#include "drone.hpp"
|
||||
#include "drone_target.hpp"
|
||||
#include "end_screen.hpp"
|
||||
#include "enemy_car.hpp"
|
||||
#include "enemy_spawnpoint.hpp"
|
||||
#include "exit_door.hpp"
|
||||
#include "exit_trigger.hpp"
|
||||
|
@ -60,6 +61,7 @@ void initialize_gdextension_types(ModuleInitializationLevel p_level)
|
|||
ClassDB::register_class<EnemyTargetBody>();
|
||||
ClassDB::register_class<WeaponPickup>();
|
||||
ClassDB::register_class<BeaconPowerup>();
|
||||
ClassDB::register_class<EnemyCar>();
|
||||
}
|
||||
|
||||
extern "C"
|
||||
|
|
|
@ -13,16 +13,20 @@ void Turret::_bind_methods() {
|
|||
#define CLASSNAME Turret
|
||||
GDPROPERTY_HINTED(attack_classes, Variant::ARRAY, PROPERTY_HINT_ARRAY_TYPE, "StringName");
|
||||
GDPROPERTY_HINTED(beam_scene, Variant::OBJECT, PROPERTY_HINT_RESOURCE_TYPE, "PackedScene");
|
||||
GDPROPERTY(fire_time, Variant::FLOAT);
|
||||
GDPROPERTY(charge_time, Variant::FLOAT);
|
||||
GDPROPERTY(lock_time, Variant::FLOAT);
|
||||
}
|
||||
|
||||
void Turret::_enter_tree() {
|
||||
this->set_freeze_mode(FreezeMode::FREEZE_MODE_KINEMATIC);
|
||||
void Turret::_enter_tree() { GDGAMEONLY();
|
||||
this->set_freeze_enabled(true);
|
||||
GDGAMEONLY();
|
||||
Area3D *awareness_area = this->get_node<Area3D>("AwarenessArea");
|
||||
awareness_area->connect("body_entered", callable_mp(this, &Turret::detect_node));
|
||||
awareness_area->connect("body_exited", callable_mp(this, &Turret::lose_node));
|
||||
this->gun_node = this->get_node<Node3D>("Gun");
|
||||
this->awareness_changed();
|
||||
this->gun_node->set_as_top_level(true);
|
||||
this->gun_node_offset = this->gun_node->get_position();
|
||||
}
|
||||
|
||||
void Turret::_process(double delta_time) { GDGAMEONLY();
|
||||
|
@ -34,41 +38,51 @@ void Turret::_process(double delta_time) { GDGAMEONLY();
|
|||
break;
|
||||
}
|
||||
this->try_next_state();
|
||||
this->gun_node->set_global_position(this->get_global_position() + this->gun_node_offset);
|
||||
}
|
||||
|
||||
void Turret::awareness_changed() {
|
||||
if(this->current_target != nullptr)
|
||||
if(this->state != TurretState::WAITING)
|
||||
return;
|
||||
|
||||
this->current_target = this->select_target();
|
||||
if(this->current_target == nullptr)
|
||||
if(this->current_target == nullptr) {
|
||||
this->state = TurretState::WAITING;
|
||||
else
|
||||
} else {
|
||||
this->state = TurretState::LOCKING;
|
||||
UtilityFunctions::print(this->get_path(), " new target ", this->current_target->get_path());
|
||||
}
|
||||
this->last_state_switch = Time::get_singleton()->get_ticks_msec() * 0.001f;
|
||||
}
|
||||
|
||||
Node3D *Turret::select_target() {
|
||||
for(Node3D *node : this->awareness)
|
||||
if(!this->invert_attack_classes && this->attack_classes.has(node->get_class()))
|
||||
return node;
|
||||
else if(this->invert_attack_classes && !this->attack_classes.has(node->get_class())) {
|
||||
UtilityFunctions::print("selecting inverted target");
|
||||
for(Node3D *node : this->awareness) {
|
||||
if(!this->invert_attack_classes && this->attack_classes.has(node->get_class())) {
|
||||
UtilityFunctions::print(this->get_path(), " selecting regular target ", node->get_path());
|
||||
return node;
|
||||
}
|
||||
else if(this->invert_attack_classes && !this->attack_classes.has(node->get_class())) {
|
||||
UtilityFunctions::print(this->get_path(), " selecting inverted target ", node->get_path());
|
||||
return node;
|
||||
}
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void Turret::lead_target(double delta_time) {
|
||||
if(!this->current_target)
|
||||
if(this->current_target == nullptr)
|
||||
return;
|
||||
Vector3 const target_position = this->current_target->get_global_position();
|
||||
Vector3 const target_heading = (target_position - this->last_target_position) / delta_time;
|
||||
this->aim_position = target_position + (target_heading * this->lead_distance);
|
||||
if(this->current_target->is_class("CarPlayer")) {
|
||||
Vector3 const target_heading = (target_position - this->last_target_position) / delta_time;
|
||||
this->aim_position = target_position + (target_heading * this->lead_distance);
|
||||
} else {
|
||||
this->aim_position = target_position;
|
||||
}
|
||||
|
||||
Vector3 const z = (this->aim_position - this->gun_node->get_global_position()).normalized();
|
||||
Vector3 const x = z.cross({0.f, 1.f, 0.f});
|
||||
Vector3 const y = z.cross(x);
|
||||
Vector3 const y = x.cross(z);
|
||||
|
||||
this->gun_node->set_global_basis({x,y,z});
|
||||
this->last_target_position = target_position;
|
||||
|
@ -77,20 +91,18 @@ void Turret::lead_target(double delta_time) {
|
|||
void Turret::detect_node(Node3D *node) {
|
||||
if(!this->awareness.has(node)) {
|
||||
this->awareness.insert(node);
|
||||
this->awareness_changed();
|
||||
}
|
||||
this->awareness_changed();
|
||||
UtilityFunctions::print(this->get_path(), " detected node ", node->get_path());
|
||||
}
|
||||
|
||||
void Turret::lose_node(Node3D *node) {
|
||||
if(this->awareness.has(node)) {
|
||||
this->awareness.erase(node);
|
||||
if(node == this->current_target) {
|
||||
this->current_target = nullptr;
|
||||
this->awareness_changed();
|
||||
}
|
||||
}
|
||||
if(node == this->current_target) {
|
||||
this->current_target = nullptr;
|
||||
}
|
||||
this->awareness_changed();
|
||||
UtilityFunctions::print(this->get_path(), " lost track of node ", node->get_path());
|
||||
}
|
||||
|
||||
void Turret::try_next_state() {
|
||||
|
@ -137,7 +149,32 @@ void Turret::beam_ended() {
|
|||
this->last_state_switch = Time::get_singleton()->get_ticks_msec() * 0.001f;
|
||||
}
|
||||
|
||||
void Turret::set_fire_time(float val) {
|
||||
this->fire_time = val;
|
||||
}
|
||||
|
||||
float Turret::get_fire_time() const {
|
||||
return this->fire_time;
|
||||
}
|
||||
|
||||
void Turret::set_charge_time(float val) {
|
||||
this->charge_time = val;
|
||||
}
|
||||
|
||||
float Turret::get_charge_time() const {
|
||||
return this->charge_time;
|
||||
}
|
||||
|
||||
void Turret::set_lock_time(float val) {
|
||||
this->lock_time = val;
|
||||
}
|
||||
|
||||
float Turret::get_lock_time() const {
|
||||
return this->lock_time;
|
||||
}
|
||||
|
||||
void Turret::set_invert_targets(bool value) {
|
||||
UtilityFunctions::print(this->get_path(), " invert targets");
|
||||
this->invert_attack_classes = value;
|
||||
this->current_target = nullptr;
|
||||
this->awareness_changed();
|
||||
|
|
|
@ -34,6 +34,13 @@ public:
|
|||
|
||||
void beam_ended();
|
||||
|
||||
void set_fire_time(float val);
|
||||
float get_fire_time() const;
|
||||
void set_charge_time(float val);
|
||||
float get_charge_time() const;
|
||||
void set_lock_time(float val);
|
||||
float get_lock_time() const;
|
||||
|
||||
void set_invert_targets(bool value);
|
||||
void set_attack_classes(Array array);
|
||||
Array get_attack_classes() const;
|
||||
|
@ -48,7 +55,7 @@ private:
|
|||
float lead_distance{1.2f};
|
||||
|
||||
Node3D *gun_node{nullptr};
|
||||
|
||||
Vector3 gun_node_offset{0.f, 0.f, 0.f};
|
||||
|
||||
TurretState state{TurretState::WAITING};
|
||||
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit a9e33a3781665cba3bb16fbc77d1535d88f344a0
|
||||
Subproject commit 7bdb5e70eb1138c898f4f7382d2906ad6528090f
|
Loading…
Reference in a new issue