Skip to content

Commit a557f98

Browse files
authored
feat(game): Moving platforms (#313)
1 parent 99f6e92 commit a557f98

File tree

5 files changed

+82
-72
lines changed

5 files changed

+82
-72
lines changed

examples/forest-brawl/maps/three-peaks.tscn

Lines changed: 14 additions & 2 deletions
Large diffs are not rendered by default.

examples/forest-brawl/scenes/brawler.tscn

Lines changed: 2 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ properties/1/sync = false
9595
properties/1/watch = true
9696

9797
[node name="Brawler" type="CharacterBody3D" groups=["Brawlers"]]
98+
platform_on_leave = 2
99+
platform_floor_layers = 0
98100
script = ExtResource("1_np8na")
99101
speed = 4.0
100102
death_depth = 16.0
@@ -103,73 +105,6 @@ respawn_time = 8.0
103105
[node name="bomber-guy" parent="." instance=ExtResource("7_ij3cr")]
104106
transform = Transform3D(0.5, 0, 0, 0, 0.5, 0, 0, 0, 0.5, 0, -0.5, 0)
105107

106-
[node name="Skeleton3D" parent="bomber-guy/rig" index="0"]
107-
bones/0/position = Vector3(3.20746e-15, 0.583857, -0.0893679)
108-
bones/0/rotation = Quaternion(0.255292, -7.97688e-15, 1.00226e-14, 0.966864)
109-
bones/1/rotation = Quaternion(0.0205548, 1.19184e-07, 2.45031e-09, 0.999789)
110-
bones/1/scale = Vector3(1.01931, 0.96247, 1.01931)
111-
bones/2/rotation = Quaternion(0.096395, -4.59033e-12, 2.30305e-08, 0.995343)
112-
bones/2/scale = Vector3(1.04897, 0.907002, 1.05131)
113-
bones/3/rotation = Quaternion(-0.181044, -1.17239e-07, -2.15821e-08, 0.983475)
114-
bones/3/scale = Vector3(0.935252, 1.1196, 0.963441)
115-
bones/4/rotation = Quaternion(0.376178, 1.10453e-07, 4.48439e-08, 0.926548)
116-
bones/4/scale = Vector3(0.922825, 1.17435, 0.922825)
117-
bones/5/rotation = Quaternion(-0.0765415, -3.93158e-08, -1.58714e-08, 0.997066)
118-
bones/5/scale = Vector3(1.00009, 1.00661, 0.995893)
119-
bones/6/rotation = Quaternion(-0.43687, -4.72473e-08, -2.26897e-08, 0.899525)
120-
bones/6/scale = Vector3(1.08356, 1.00264, 0.945663)
121-
bones/7/position = Vector3(-3.6176e-08, 0.583857, -0.0893679)
122-
bones/7/rotation = Quaternion(-0.135651, -0.571304, -0.59224, 0.551781)
123-
bones/8/position = Vector3(3.6176e-08, 0.583857, -0.0893679)
124-
bones/8/rotation = Quaternion(-0.135651, 0.571304, 0.59224, 0.551781)
125-
bones/9/position = Vector3(0.185305, 0.611893, -0.0339381)
126-
bones/9/rotation = Quaternion(0.905251, -2.21189e-05, -0.000117811, 0.424877)
127-
bones/9/scale = Vector3(1.00629, 0.987535, 1.00629)
128-
bones/10/rotation = Quaternion(1.23085e-07, -5.52346e-06, -2.98159e-11, 1)
129-
bones/11/rotation = Quaternion(0.385459, 6.31284e-06, -3.32111e-05, 0.922725)
130-
bones/11/scale = Vector3(1.0012, 0.988229, 1.01087)
131-
bones/12/rotation = Quaternion(-9.67563e-08, 8.29257e-06, -2.16274e-09, 1)
132-
bones/13/rotation = Quaternion(-0.505198, 0.000109451, 2.25149e-05, 0.863003)
133-
bones/13/scale = Vector3(0.992628, 0.997842, 1.00979)
134-
bones/14/rotation = Quaternion(5.02433e-08, 0.977548, -0.210714, 2.33145e-07)
135-
bones/14/scale = Vector3(0.99948, 1.00078, 0.999746)
136-
bones/15/position = Vector3(-0.185305, 0.611893, -0.0339381)
137-
bones/15/rotation = Quaternion(0.99633, 4.19078e-05, -0.000130651, -0.08559)
138-
bones/15/scale = Vector3(1.00638, 0.987357, 1.00638)
139-
bones/17/rotation = Quaternion(0.389683, 1.45563e-05, -3.68506e-05, 0.920949)
140-
bones/17/scale = Vector3(1.00122, 0.987896, 1.0112)
141-
bones/18/rotation = Quaternion(-4.84353e-08, 4.04099e-06, 1.10813e-08, 1)
142-
bones/19/rotation = Quaternion(-0.871762, 8.53352e-05, 7.82363e-05, 0.48993)
143-
bones/19/scale = Vector3(0.992445, 0.99873, 1.0091)
144-
bones/20/rotation = Quaternion(1.02643e-08, 0.977516, -0.210861, -2.46051e-07)
145-
bones/20/scale = Vector3(1.00003, 0.999961, 1.00001)
146-
bones/21/position = Vector3(0.0507796, 1.02886, 0.287226)
147-
bones/21/rotation = Quaternion(-0.472842, -0.270157, -0.416495, 0.727989)
148-
bones/22/position = Vector3(0.242455, 1.04749, 0.191412)
149-
bones/22/rotation = Quaternion(-0.280276, 0.143785, -0.88237, 0.349562)
150-
bones/22/scale = Vector3(1.07211, 0.87008, 1.07211)
151-
bones/23/rotation = Quaternion(3.18531e-08, 0.0853649, 8.32473e-08, 0.99635)
152-
bones/24/rotation = Quaternion(0.421944, 0.147999, -0.308633, 0.839527)
153-
bones/24/scale = Vector3(0.960023, 0.997541, 1.06918)
154-
bones/25/rotation = Quaternion(2.97979e-08, -0.026165, -1.54692e-07, 0.999658)
155-
bones/26/rotation = Quaternion(0.143976, -0.0275267, 0.0637975, 0.987139)
156-
bones/26/scale = Vector3(1.00575, 0.989855, 1.00455)
157-
bones/27/position = Vector3(-0.0507796, 1.02886, 0.287226)
158-
bones/27/rotation = Quaternion(-0.472842, 0.270157, 0.416495, 0.727989)
159-
bones/28/position = Vector3(-0.242455, 1.04749, 0.191412)
160-
bones/28/rotation = Quaternion(-0.425562, -0.363618, 0.693798, 0.453127)
161-
bones/28/scale = Vector3(0.983063, 1.03476, 0.983063)
162-
bones/29/rotation = Quaternion(3.98409e-08, -0.0370571, -2.15209e-07, 0.999313)
163-
bones/30/rotation = Quaternion(0.232389, -0.0893491, 0.253375, 0.93478)
164-
bones/30/scale = Vector3(1.06864, 0.878868, 1.06637)
165-
bones/31/rotation = Quaternion(-3.48398e-08, -0.117463, 1.57868e-07, 0.993077)
166-
bones/32/rotation = Quaternion(0.41303, -0.11386, 0.189505, 0.883476)
167-
bones/32/scale = Vector3(0.954337, 1.01045, 1.05417)
168-
bones/33/position = Vector3(0.1184, 1.00881, 0.15031)
169-
bones/33/rotation = Quaternion(-1.44276e-14, 0.544482, 0.838773, -2.01673e-14)
170-
bones/34/position = Vector3(-0.1184, 1.00881, 0.15031)
171-
bones/34/rotation = Quaternion(-1.44276e-14, 0.544482, 0.838773, -2.01673e-14)
172-
173108
[node name="AnimationTree" type="AnimationTree" parent="."]
174109
tree_root = SubResource("AnimationNodeBlendTree_8to0y")
175110
anim_player = NodePath("../bomber-guy/AnimationPlayer")
@@ -227,5 +162,3 @@ replication_config = SubResource("SceneReplicationConfig_4cjl8")
227162
script = ExtResource("8_pj7o0")
228163
root = NodePath("..")
229164
properties = Array[String]([":transform"])
230-
231-
[editable path="bomber-guy"]
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
[gd_scene load_steps=5 format=3 uid="uid://cjavt41cokqv5"]
2+
3+
[ext_resource type="Script" path="res://examples/forest-brawl/scripts/moving-platform.gd" id="1_q5d25"]
4+
[ext_resource type="PackedScene" uid="uid://bnyoffewc4b" path="res://examples/forest-brawl/models/kenney-platformer-kit/blockHexagon.glb" id="2_h7k7v"]
5+
[ext_resource type="Script" path="res://addons/netfox/tick-interpolator.gd" id="3_b65sx"]
6+
7+
[sub_resource type="ConvexPolygonShape3D" id="ConvexPolygonShape3D_y7a63"]
8+
points = PackedVector3Array(-0.557, 0.890101, -0.299866, 0.648933, 0.781605, 0.229175, 0.62806, 0.823296, 0.270961, -0.0369031, 0.0136385, 0.556084, 0.0421915, 0.0163715, -0.552961, -0.163975, 0.823296, 0.646129, -0.5, 0.00740408, 0.281541, 0.0426543, 0.989841, -0.559451, 0.48164, 0.0113339, -0.2993, -0.495398, 0.988618, 0.298944, 0.523822, 0.76081, -0.45848, -0.5, 0.00740408, -0.281541, 0.48164, 0.0113339, 0.2993, 0.499254, 0.986877, 0.297878, -0.143102, 0.76081, -0.667022, 0.148614, 0.76081, 0.667022, -0.643422, 0.781605, 0.249937, 0.499253, 0.986876, -0.297878, -0.0372869, 0.991605, 0.561466, -0.518184, 0.76081, 0.45848, 0.148614, 0.802501, -0.667022, 0.648933, 0.781605, -0.229175, -0.643422, 0.781605, -0.249937, 0.523822, 0.76081, 0.45848, -0.518184, 0.76081, -0.45848, -0.495399, 0.988619, -0.298944, -0.0368981, 0.0136993, -0.556015, 0.0421962, 0.016314, 0.553027, -0.143102, 0.76081, 0.667022, -0.163975, 0.823296, -0.646129, 0.148614, 0.802501, 0.667022, -0.037283, 0.991557, -0.561412)
9+
10+
[node name="Moving Platform" type="AnimatableBody3D"]
11+
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -2, 0, -6)
12+
sync_to_physics = false
13+
script = ExtResource("1_q5d25")
14+
speed = 1.0
15+
16+
[node name="blockHexagon" parent="." instance=ExtResource("2_h7k7v")]
17+
18+
[node name="CollisionShape3D" type="CollisionShape3D" parent="."]
19+
shape = SubResource("ConvexPolygonShape3D_y7a63")
20+
21+
[node name="Target" type="Node3D" parent="."]
22+
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -4)
23+
24+
[node name="TickInterpolator" type="Node" parent="." node_paths=PackedStringArray("root")]
25+
script = ExtResource("3_b65sx")
26+
root = NodePath("..")
27+
properties = Array[String]([":transform"])

examples/forest-brawl/scripts/brawler-controller.gd

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,10 +101,19 @@ func _rollback_tick(delta, tick, is_fresh):
101101
if is_fresh:
102102
GameEvents.on_brawler_respawn.emit(self)
103103

104-
# Add the gravity.
104+
# Apply gravity
105105
_force_update_is_on_floor()
106106
if not is_on_floor():
107107
velocity.y -= gravity * delta
108+
109+
# Stick to moving platforms
110+
var platform_velocity := Vector3.ZERO
111+
var collision_result := KinematicCollision3D.new()
112+
if test_move(global_transform, Vector3.DOWN * delta, collision_result):
113+
var collider := collision_result.get_collider()
114+
if collider is MovingPlatform:
115+
var platform := collider as MovingPlatform
116+
platform_velocity = platform.get_velocity()
108117

109118
# Jump
110119
if input.movement.y > 0 and is_on_floor():
@@ -124,9 +133,11 @@ func _rollback_tick(delta, tick, is_fresh):
124133
transform = transform.looking_at(position + Vector3(input.aim.x, 0, input.aim.z), Vector3.UP, true).scaled_local(scale)
125134

126135
# Apply movement
136+
velocity += platform_velocity
127137
velocity *= NetworkTime.physics_factor
128138
move_and_slide()
129139
velocity /= NetworkTime.physics_factor
140+
velocity -= platform_velocity
130141

131142
# Death
132143
if position.y < -death_depth and tick > respawn_tick and is_fresh:
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
extends AnimatableBody3D
2+
class_name MovingPlatform
3+
4+
@export var speed: float = 2.
5+
@onready var _origin: Vector3 = global_position
6+
@onready var _target: Vector3 = $Target.global_position
7+
@onready var _distance: float = _origin.distance_to(_target)
8+
var _velocity: Vector3 = Vector3.ZERO
9+
10+
func get_velocity() -> Vector3:
11+
return _velocity
12+
13+
func _ready():
14+
NetworkRollback.on_prepare_tick.connect(_apply_tick)
15+
16+
func _apply_tick(tick: int):
17+
var previous_position = _get_position_for_tick(tick - 1)
18+
global_position = _get_position_for_tick(tick)
19+
20+
_velocity = (global_position - previous_position) / NetworkTime.ticktime
21+
22+
func _get_position_for_tick(tick: int):
23+
var distance_moved = NetworkTime.ticks_to_seconds(tick) * speed
24+
var progress = distance_moved / _distance
25+
progress = pingpong(progress, 1)
26+
27+
return _origin.lerp(_target, progress)

0 commit comments

Comments
 (0)