91 lines
1.7 KiB
GDScript
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
|
|
|
|
|