small racing game im working on
| -rw-r--r-- | classes/ghost.gd | 33 | ||||
| -rw-r--r-- | classes/resources/car_vars.gd | 93 | ||||
| -rw-r--r-- | classes/resources/ghost_data.gd | 8 | ||||
| -rw-r--r-- | scenes/track.tscn | 4 |
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 |