initial commit: canny cat basic movement, bouncing, some gridmap tiles for levels
This commit is contained in:
commit
e1b43c8bc5
120 changed files with 5785 additions and 0 deletions
117
objects/canny_cat.gd
Normal file
117
objects/canny_cat.gd
Normal file
|
@ -0,0 +1,117 @@
|
|||
extends CharacterBody3D
|
||||
|
||||
|
||||
@export var power_scale: float
|
||||
@export var power_sensitivity: float
|
||||
@export var power_threshold: float
|
||||
|
||||
@export_group("Movement")
|
||||
@export var gravity: float
|
||||
@export var friction: float
|
||||
@export var stop_threshold: float
|
||||
|
||||
@export_group("Camera", "camera_")
|
||||
@export_range(0,90,1,"radians_as_degrees") var camera_low_angle: float
|
||||
@export_range(0,90,1,"radians_as_degrees") var camera_high_angle: float
|
||||
@export_range(0,90,0.5,"radians_as_degrees") var camera_yaw_sensitivity: float
|
||||
@export_range(0,90,0.5,"radians_as_degrees") var camera_pitch_sensitivity: float
|
||||
|
||||
@export_group("Node References")
|
||||
@export var state_chart: StateChart
|
||||
@export var power_indicator: Node3D
|
||||
@export var camera_arm: SpringArm3D
|
||||
@export var wall_detector: PhysicsBody3D
|
||||
|
||||
|
||||
var power: float = 0.0:
|
||||
set(value):
|
||||
power = clampf(value, 0.0, 1.0)
|
||||
|
||||
var charging_power: bool = false
|
||||
var prev_velocity: Vector3 = Vector3.ZERO
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
|
||||
|
||||
|
||||
func _physics_process(delta: float) -> void:
|
||||
prev_velocity = velocity
|
||||
move_and_slide()
|
||||
state_chart.set_expression_property(&"velocity", velocity)
|
||||
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
if event.is_action_pressed(&"charge_shot"):
|
||||
state_chart.send_event(&"charge_pressed")
|
||||
if event.is_action_released(&"charge_shot"):
|
||||
state_chart.send_event(&"charge_released")
|
||||
|
||||
if event is InputEventMouseMotion:
|
||||
camera_arm.rotate_y(event.screen_relative.x * camera_yaw_sensitivity)
|
||||
|
||||
if charging_power:
|
||||
power += event.screen_relative.y * power_sensitivity
|
||||
else:
|
||||
camera_arm.rotation.x -= event.screen_relative.y * camera_pitch_sensitivity
|
||||
camera_arm.rotation.x = clampf(camera_arm.rotation.x, -camera_high_angle, -camera_low_angle)
|
||||
|
||||
|
||||
#region Charging
|
||||
func _start_charge() -> void:
|
||||
charging_power = true
|
||||
power_indicator.visible = true
|
||||
power_indicator.scale.z = 0.0
|
||||
power = 0.0
|
||||
|
||||
func _update_charge(_delta: float) -> void:
|
||||
power_indicator.scale.z = power
|
||||
var camera_z = get_viewport().get_camera_3d().global_transform.basis.z
|
||||
camera_z.y = 0.0
|
||||
power_indicator.look_at(power_indicator.global_position + camera_z, Vector3.UP, true)
|
||||
|
||||
func _end_charge() -> void:
|
||||
charging_power = false
|
||||
power_indicator.visible = false
|
||||
if power >= power_threshold:
|
||||
var camera_z = get_viewport().get_camera_3d().global_transform.basis.z
|
||||
camera_z.y = 0.0
|
||||
velocity = -camera_z.normalized() * power * power_scale
|
||||
prev_velocity = velocity
|
||||
_bounce_on_walls(1.0/60.0)
|
||||
#endregion
|
||||
|
||||
|
||||
#region Moving
|
||||
func _apply_gravity(delta: float) -> void:
|
||||
velocity.y -= gravity * delta
|
||||
|
||||
func _slow_to_stop(delta: float) -> void:
|
||||
if is_on_floor():
|
||||
var new_velocity = velocity
|
||||
new_velocity.y = 0.0
|
||||
new_velocity = new_velocity.move_toward(Vector3.ZERO, friction * delta)
|
||||
if new_velocity.length_squared() <= stop_threshold * stop_threshold:
|
||||
new_velocity = Vector3.ZERO
|
||||
new_velocity.y = velocity.y
|
||||
velocity = new_velocity
|
||||
|
||||
func _bounce_on_walls(delta: float = 0.0) -> void:
|
||||
var h_vel = (prev_velocity * Vector3(1.0, 0.0, 1.0))
|
||||
var col = move_and_collide(h_vel * delta, true)
|
||||
if col:
|
||||
if col.get_angle() > floor_max_angle:
|
||||
h_vel = h_vel.bounce(col.get_normal())
|
||||
velocity.x = h_vel.x
|
||||
velocity.z = h_vel.z
|
||||
|
||||
#var h_vel = (prev_velocity * Vector3(1.0, 0.0, 1.0))
|
||||
#if not h_vel.is_zero_approx():
|
||||
#wall_detector.look_at(wall_detector.global_position - h_vel)
|
||||
#wall_detector.force_shapecast_update()
|
||||
#if wall_detector.is_colliding():
|
||||
#for i in wall_detector.get_collision_count():
|
||||
#h_vel = h_vel.bounce(wall_detector.get_collision_normal(i))
|
||||
#velocity.x = h_vel.x
|
||||
#velocity.z = h_vel.z
|
||||
#endregion
|
153
objects/canny_cat.tscn
Normal file
153
objects/canny_cat.tscn
Normal file
|
@ -0,0 +1,153 @@
|
|||
[gd_scene load_steps=15 format=3 uid="uid://cybm74xwbsivx"]
|
||||
|
||||
[ext_resource type="Texture2D" uid="uid://3i17aqnrspma" path="res://assets/textures/player/canny.png" id="1_cp4br"]
|
||||
[ext_resource type="Script" path="res://objects/canny_cat.gd" id="1_twfq8"]
|
||||
[ext_resource type="Texture2D" uid="uid://bqg7vd5r7w8tm" path="res://assets/textures/shadow.png" id="2_fwt6m"]
|
||||
[ext_resource type="Script" path="res://addons/godot_state_charts/state_chart.gd" id="4_n67yk"]
|
||||
[ext_resource type="Script" path="res://addons/godot_state_charts/compound_state.gd" id="5_ox6hb"]
|
||||
[ext_resource type="Script" path="res://addons/godot_state_charts/atomic_state.gd" id="6_bu01i"]
|
||||
[ext_resource type="Script" path="res://addons/godot_state_charts/transition.gd" id="7_epv8h"]
|
||||
[ext_resource type="Script" path="res://addons/godot_state_charts/expression_guard.gd" id="8_d5slg"]
|
||||
|
||||
[sub_resource type="CylinderShape3D" id="CylinderShape3D_0aipe"]
|
||||
height = 0.25
|
||||
radius = 0.55
|
||||
|
||||
[sub_resource type="SphereShape3D" id="SphereShape3D_4o01j"]
|
||||
|
||||
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_2xpb7"]
|
||||
shading_mode = 0
|
||||
albedo_color = Color(0.916968, 0.113727, 0, 1)
|
||||
|
||||
[sub_resource type="CylinderMesh" id="CylinderMesh_b16dl"]
|
||||
top_radius = 0.05
|
||||
bottom_radius = 0.05
|
||||
height = 4.0
|
||||
radial_segments = 4
|
||||
rings = 0
|
||||
|
||||
[sub_resource type="Resource" id="Resource_ej40h"]
|
||||
script = ExtResource("8_d5slg")
|
||||
expression = "not velocity.is_zero_approx()"
|
||||
|
||||
[sub_resource type="Resource" id="Resource_637i1"]
|
||||
resource_name = "Not Moving"
|
||||
script = ExtResource("8_d5slg")
|
||||
expression = "velocity.is_zero_approx()"
|
||||
|
||||
[node name="CannyCat" type="CharacterBody3D" node_paths=PackedStringArray("state_chart", "power_indicator", "camera_arm", "wall_detector")]
|
||||
process_priority = -100
|
||||
process_physics_priority = -100
|
||||
collision_layer = 16
|
||||
collision_mask = 3
|
||||
axis_lock_angular_x = true
|
||||
axis_lock_angular_y = true
|
||||
axis_lock_angular_z = true
|
||||
script = ExtResource("1_twfq8")
|
||||
power_scale = 20.0
|
||||
power_sensitivity = 0.01
|
||||
power_threshold = 0.2
|
||||
gravity = 10.0
|
||||
friction = 5.0
|
||||
stop_threshold = 0.1
|
||||
camera_low_angle = 0.349066
|
||||
camera_high_angle = 1.0472
|
||||
camera_yaw_sensitivity = 0.00872665
|
||||
camera_pitch_sensitivity = 0.00872665
|
||||
state_chart = NodePath("StateChart")
|
||||
power_indicator = NodePath("PowerIndicator")
|
||||
camera_arm = NodePath("CameraArm")
|
||||
wall_detector = NodePath("WallDetector")
|
||||
|
||||
[node name="WallDetector" type="StaticBody3D" parent="."]
|
||||
collision_layer = 0
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="WallDetector"]
|
||||
shape = SubResource("CylinderShape3D_0aipe")
|
||||
|
||||
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
|
||||
shape = SubResource("SphereShape3D_4o01j")
|
||||
|
||||
[node name="CannySprite" type="Sprite3D" parent="."]
|
||||
pixel_size = 0.0156
|
||||
billboard = 1
|
||||
texture_filter = 0
|
||||
texture = ExtResource("1_cp4br")
|
||||
|
||||
[node name="PowerIndicator" type="Node3D" parent="."]
|
||||
visible = false
|
||||
|
||||
[node name="Line" type="MeshInstance3D" parent="PowerIndicator"]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 2)
|
||||
material_override = SubResource("StandardMaterial3D_2xpb7")
|
||||
cast_shadow = 0
|
||||
gi_mode = 0
|
||||
mesh = SubResource("CylinderMesh_b16dl")
|
||||
|
||||
[node name="ShadowArm" type="SpringArm3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0)
|
||||
collision_mask = 7
|
||||
spring_length = 100.0
|
||||
|
||||
[node name="ShadowSprite" type="Sprite3D" parent="ShadowArm"]
|
||||
pixel_size = 0.0078
|
||||
texture = ExtResource("2_fwt6m")
|
||||
|
||||
[node name="CameraArm" type="SpringArm3D" parent="."]
|
||||
transform = Transform3D(1, 0, 0, 0, 0.5, 0.866025, 0, -0.866025, 0.5, 0, 0, 0)
|
||||
spring_length = 8.0
|
||||
|
||||
[node name="Camera3D" type="Camera3D" parent="CameraArm"]
|
||||
current = true
|
||||
|
||||
[node name="StateChart" type="Node" parent="."]
|
||||
script = ExtResource("4_n67yk")
|
||||
track_in_editor = true
|
||||
initial_expression_properties = {
|
||||
"velocity": Vector3(0, 0, 0)
|
||||
}
|
||||
|
||||
[node name="Root" type="Node" parent="StateChart"]
|
||||
script = ExtResource("5_ox6hb")
|
||||
initial_state = NodePath("Moving")
|
||||
|
||||
[node name="Idle" type="Node" parent="StateChart/Root"]
|
||||
script = ExtResource("6_bu01i")
|
||||
|
||||
[node name="on ChargePressed" type="Node" parent="StateChart/Root/Idle"]
|
||||
script = ExtResource("7_epv8h")
|
||||
to = NodePath("../../Charging")
|
||||
event = &"charge_pressed"
|
||||
delay_in_seconds = "0.0"
|
||||
|
||||
[node name="when Moving" type="Node" parent="StateChart/Root/Idle"]
|
||||
script = ExtResource("7_epv8h")
|
||||
to = NodePath("../../Moving")
|
||||
guard = SubResource("Resource_ej40h")
|
||||
delay_in_seconds = "0.0"
|
||||
|
||||
[node name="Moving" type="Node" parent="StateChart/Root"]
|
||||
script = ExtResource("6_bu01i")
|
||||
|
||||
[node name="when Stopped" type="Node" parent="StateChart/Root/Moving"]
|
||||
script = ExtResource("7_epv8h")
|
||||
to = NodePath("../../Idle")
|
||||
guard = SubResource("Resource_637i1")
|
||||
delay_in_seconds = "0.0"
|
||||
|
||||
[node name="Charging" type="Node" parent="StateChart/Root"]
|
||||
script = ExtResource("6_bu01i")
|
||||
|
||||
[node name="on ChargeReleased" type="Node" parent="StateChart/Root/Charging"]
|
||||
script = ExtResource("7_epv8h")
|
||||
to = NodePath("../../Moving")
|
||||
event = &"charge_released"
|
||||
delay_in_seconds = "0.0"
|
||||
|
||||
[connection signal="state_physics_processing" from="StateChart/Root/Idle" to="." method="_apply_gravity"]
|
||||
[connection signal="state_physics_processing" from="StateChart/Root/Moving" to="." method="_slow_to_stop"]
|
||||
[connection signal="state_physics_processing" from="StateChart/Root/Moving" to="." method="_apply_gravity"]
|
||||
[connection signal="state_physics_processing" from="StateChart/Root/Moving" to="." method="_bounce_on_walls"]
|
||||
[connection signal="state_entered" from="StateChart/Root/Charging" to="." method="_start_charge"]
|
||||
[connection signal="state_exited" from="StateChart/Root/Charging" to="." method="_end_charge"]
|
||||
[connection signal="state_physics_processing" from="StateChart/Root/Charging" to="." method="_update_charge"]
|
Loading…
Add table
Add a link
Reference in a new issue