Rollercoaster-Derivatives/Cart/cart.gd

91 lines
1.7 KiB
GDScript

extends Node2D
class_name Cart
@export var spline : Spline
var going = false
var progress : float = 0
var velocity = 0
var initial_velocity = 10
var speed_multiplier = 0.1
var initial_height = 0
var last_velocity = 0
var time = 0
var function : Function
var first_tick = false
@export var chart : Chart
func _ready():
hide()
function = Function.new(
[0],
[0],
"Acceleration",
{
type = Function.Type.LINE,
marker = Function.Marker.SQUARE,
color = Color.WHITE,
interpolation = Function.Interpolation.SPLINE
}
)
var cp: ChartProperties = ChartProperties.new()
cp.colors.frame = Color("#161a1d")
cp.colors.background = Color.TRANSPARENT
cp.colors.grid = Color("#283442")
cp.colors.ticks = Color("#283442")
cp.colors.text = Color.WHITE_SMOKE
cp.draw_bounding_box = false
cp.title = "Roller Coaster Acceleration"
cp.x_label = "Time"
cp.y_label = "Acceleration (m/s^2)"
cp.x_scale = 5
cp.y_scale = 10
cp.interactive = true
cp.max_samples = 1000
chart.plot([function], cp)
func start():
first_tick = true
for i in range(1000):
function.remove_point(0)
initial_height = position.y - initial_velocity
last_velocity = sqrt(2*9.8*(position.y-initial_height))*speed_multiplier
velocity = 0
going = true
time = 0
show()
func _physics_process(delta: float) -> void:
var new_point = spline.get_point_at(progress)
if new_point != null:
position = new_point
else:
going = false
hide()
progress = 0
if not going:
return
last_velocity = velocity
velocity = sqrt(2*9.8*(position.y-initial_height))*speed_multiplier
progress += velocity
time += delta
if not first_tick:
function.add_point(time, velocity-last_velocity)
chart.queue_redraw()
if first_tick:
first_tick = false