small racing game im working on
-rw-r--r--classes/ghost.gd33
-rw-r--r--classes/resources/car_vars.gd93
-rw-r--r--classes/resources/ghost_data.gd8
-rw-r--r--scenes/track.tscn4
4 files changed, 79 insertions, 59 deletions
diff --git a/classes/ghost.gd b/classes/ghost.gd
index eb376f1..674436e 100644
--- a/classes/ghost.gd
+++ b/classes/ghost.gd
@@ -9,7 +9,7 @@ const trail_scene = preload("res://scenes/trail.tscn")
const inactive = {active = false};
var skids: Array[Array] = [[inactive], [inactive], [inactive], [inactive]]
var particles: Array[GPUParticles3D] = []
-var v: Dictionary # [CarVars]
+var v: PackedFloat32Array # [CarVars]
var current_gear := 0
var engine_rpm := 800.0
@@ -26,6 +26,7 @@ func clear_skids() -> void:
wheel.clear()
skids = [[inactive], [inactive], [inactive], [inactive]]
+@warning_ignore("shadowed_variable")
func reset(clear_skids := true) -> void:
engine_rpm = 800
current_gear = 0
@@ -34,33 +35,35 @@ func reset(clear_skids := true) -> void:
if clear_skids:
clear_skids()
-func update(car_vars: Dictionary, delta: float) -> void:
+func update(car_vars: PackedFloat32Array, delta: float) -> void:
v = car_vars
- engine_rpm = maxf(800, v.engine_rpm)
- current_gear = v.current_gear
- wheels[2].rotation.y = v.steering * .75
- wheels[3].rotation.y = v.steering * .75
- global_rotation = v.rotation
+ engine_rpm = maxf(800, v[CarVars.ENGINE_RPM])
+ current_gear = int(v[CarVars.CURRENT_GEAR])
+
+ wheels[2].rotation.y = v[CarVars.STEERING] * .75
+ wheels[3].rotation.y = v[CarVars.STEERING] * .75
+
+ global_rotation = CarVars.arr2vec(v, CarVars.ROTATION)
if delta > 0:
- global_position = lerp(global_position, v.position, 10 * delta)
+ global_position = lerp(global_position, CarVars.arr2vec(v, CarVars.POSITION), 10 * delta)
else:
- global_position = v.position
+ global_position = CarVars.arr2vec(v, CarVars.POSITION)
for i in 4:
- particles[i].emitting = v.wheel_skidinfo[i] < (.2 if i > 2 else .99) and v.wheel_contact[i] and v.kph > 30
+ particles[i].emitting = v[CarVars.SKID_START + i] < (.2 if i > 2 else .99) and v[CarVars.CONTACT_START + i] > 0 and v[CarVars.KPH] > 30
if particles[i].emitting:
@warning_ignore("narrowing_conversion")
- particles[i].amount = clampf(ceil(75 * (1 - v.wheel_skidinfo[i])) * 1 if i > 2 else 8, 0, 75)
+ particles[i].amount = clampf(ceil(75 * (1 - v[CarVars.SKID_START + i])) * 1 if i > 2 else 8, 0, 75)
if !skids[i][-1].active:
skids[i].append(trail_scene.instantiate() as Trail3D)
get_parent().add_child(skids[i][-1])
- (skids[i][-1] as Trail3D).add(to_global(v.wheel_position[i]) - Vector3(0, .661, 0))
+ (skids[i][-1] as Trail3D).add(to_global(CarVars.arr2vec(v, CarVars.WHEEL_POSITION_START + (i * 3))) - Vector3(0, .661, 0))
elif skids[i][-1].active:
skids[i][-1].active = false
- wheels[i].position = v.wheel_position[i]
+ wheels[i].position = CarVars.arr2vec(v, CarVars.WHEEL_POSITION_START + (i * 3))
- body_mesh.rotation.z = lerp(body_mesh.rotation.z, clampf(((-v.steering * .001) * v.wheel_rpm) + randf_range(-0.05,0.05), -.4, .4), 5 * delta)
+ body_mesh.rotation.z = lerp(body_mesh.rotation.z, clampf(((-v[CarVars.STEERING] * .001) * v[CarVars.WHEEL_RPM]) + randf_range(-0.05,0.05), -.4, .4), 5 * delta)
func kph() -> float:
- return v.kph
+ return v[CarVars.KPH]
diff --git a/classes/resources/car_vars.gd b/classes/resources/car_vars.gd
index 5d30dcb..fb788ba 100644
--- a/classes/resources/car_vars.gd
+++ b/classes/resources/car_vars.gd
@@ -1,43 +1,60 @@
class_name CarVars
extends Resource
-var throttle: float
-var brake: float
-var steering: float
-var engine_force: float
-var engine_rpm: float
-var wheel_rpm: float
-var wheel_skidinfo: Array
-var wheel_contact: Array
-var wheel_position: Array
-var current_gear: int
-var position: Vector3
-var rotation: Vector3
-var kph: float
+# index value usage
+# 0 1 throttle
+# 1 0 brake
+# 2 0.1 steering
+# 3 0, engine force
+# 4 800 engine rpm
+# 5 0 wheel rpm
+# 6 0 kilometers per hour
+# 7 1 gear
+# 8 498 position x
+# .. ... ...
+# 11 0 rotation x
+# .. ... ...
+# 14 1 skid on wheel 0
+# .. ... ...
+# 18 1 contact on wheel
+# ..
+# 22 -1.20 position x of wheel 0
+# ..
+# 33 -1.51 postiion z of wheel 4
+enum {THROTTLE,BRAKE,STEERING,ENGINE_FORCE,ENGINE_RPM,WHEEL_RPM,KPH,CURRENT_GEAR} # arr[n]
+const POSITION = 8 # arr2vec(pos)
+const ROTATION = 11 # arr2vec(rot)
+const SKID_START = 14 # arr[wheel index + skid start] = wheel skid
+const CONTACT_START = 18 # arr[wi + cs] = ws
+const WHEEL_POSITION_START = 22 # arr2vec(arr, (wi * 3) + ps)
-func _init(from: Car) -> void:
- throttle = from.throttle
- brake = from.brake
- steering = from.steering
- engine_force = from.engine_force
- engine_rpm = from.engine_rpm
- position = from.global_position
- rotation = from.global_rotation
- wheel_rpm = from.wheel_rpm
- current_gear = from.current_gear
- for i in from.wheels.size():
- var wheel := from.wheels[i]
- wheel_skidinfo.append(wheel.get_skidinfo())
- wheel_contact.append(wheel.is_in_contact())
- wheel_position.append(wheel.position)
- kph = from.kph()
+static func _arr2vec(arr: PackedFloat32Array) -> Vector3:
+ return Vector3(arr[0],arr[1],arr[2])
+
+static func arr2vec(arr: PackedFloat32Array, position: int) -> Vector3:
+ return _arr2vec(arr.slice(position, position + 3))
+
+static func vec2arr(vec: Vector3) -> PackedFloat32Array:
+ return PackedFloat32Array([vec[0],vec[1],vec[2]])
-func to_dict(): # RIP memory
- return {
- throttle = throttle, brake = brake, steering = steering,
- engine_force = engine_force, engine_rpm = engine_rpm,
- position = position, rotation = rotation, kph = kph,
- wheel_skidinfo = wheel_skidinfo, wheel_contact = wheel_contact,
- wheel_position = wheel_position, current_gear = current_gear,
- wheel_rpm = wheel_rpm
- }
+## 106B with ZSTD compression (144B without)
+static func create(from: Car) -> PackedFloat32Array:
+ var arr := PackedFloat32Array([
+ snappedf(from.throttle, .1),
+ snappedf(from.brake, .1),
+ snappedf(from.steering, .1),
+ snappedf(from.engine_force, .5),
+ snappedf(from.engine_rpm, .5),
+ snappedf(from.wheel_rpm, .1),
+ snappedf(from.kph(), .5),
+ from.current_gear,
+ ])
+ arr.append_array(vec2arr(from.global_position))
+ arr.append_array(vec2arr(from.global_rotation))
+ for i in from.wheels.size():
+ arr.append(snappedf(from.wheels[i].get_skidinfo(), .1))
+ for i in from.wheels.size():
+ arr.append(int(from.wheels[i].is_in_contact()))
+ for i in from.wheels.size():
+ arr.append_array(vec2arr(from.wheels[i].position))
+ return arr
diff --git a/classes/resources/ghost_data.gd b/classes/resources/ghost_data.gd
index f7c1cbc..ca57af2 100644
--- a/classes/resources/ghost_data.gd
+++ b/classes/resources/ghost_data.gd
@@ -5,15 +5,15 @@ var time: float
var checkpoints: Array
var snapped_checkpoints: Array
# i hope this is performant
-var snaps: Array#[Dictionary]
+var snaps: Array# it doesnt let me type it
var snap_count := 0
func snapshot(obj: Car):
- snaps.append(CarVars.new(obj).to_dict())
+ snaps.append(CarVars.create(obj))
snap_count += 1
-## returns a CarVars dictionary
-func load_snap(i: int) -> Dictionary:
+## returns a CarVars array
+func load_snap(i: int) -> PackedFloat32Array:
return snaps[i]
func save(path: String) -> void:
diff --git a/scenes/track.tscn b/scenes/track.tscn
index 6cc21aa..bc3005d 100644
--- a/scenes/track.tscn
+++ b/scenes/track.tscn
@@ -32,7 +32,7 @@ material = ExtResource("2_2nntu")
[node name="WallL" type="CSGPolygon3D" parent="."]
calculate_tangents = false
-polygon = PackedVector2Array(-14.5, 2, -12.4, 2, -12.4, 0, -14.5, 0)
+polygon = PackedVector2Array(14.5, 2, 12.4, 2, 12.4, 0, 14.5, 0)
mode = 2
path_node = NodePath("..")
path_interval_type = 0
@@ -47,7 +47,7 @@ material = ExtResource("5_8gm6o")
[node name="WallR" type="CSGPolygon3D" parent="."]
calculate_tangents = false
-polygon = PackedVector2Array(14.5, 2, 12.4, 2, 12.4, 0, 14.5, 0)
+polygon = PackedVector2Array(-14.5, 2, -12.4, 2, -12.4, 0, -14.5, 0)
mode = 2
path_node = NodePath("..")
path_interval_type = 0