Image contre delta

La même constante de vitesse appliquée avec et sans delta, avec la distance parcourue sur chaque ligne. La seconde n'est rapide qu'à la mesure du framerate.

L'éditeur ci-dessus fait tourner ce projet. Changez une ligne et il se recharge.

Classes Godot utilisées

Polygon2DLabelEngine

Le code

scripts/main.gd
extends Node

const SPEED: float = 300.0
const MARGIN: float = 70.0
const SIZE: Vector2 = Vector2(46, 46)

var timed: Polygon2D
var untimed: Polygon2D
var timed_label: Label
var untimed_label: Label
var fps_label: Label
var timed_distance: float = 0.0
var untimed_distance: float = 0.0
var track_start: float = 0.0
var track_end: float = 0.0


func _ready() -> void:
	_add_background()

	var view: Vector2 = get_viewport().get_visible_rect().size
	track_start = MARGIN
	track_end = view.x - MARGIN

	timed = _add_track(view.y * 0.36, Color('#8eef97'))
	untimed = _add_track(view.y * 0.68, Color('#fc7f7f'))

	timed_label = _add_label('position.x += speed * delta', Vector2(MARGIN, view.y * 0.36 - 70), Color('#8eef97'))
	untimed_label = _add_label('position.x += speed', Vector2(MARGIN, view.y * 0.68 - 70), Color('#fc7f7f'))
	fps_label = _add_label('', Vector2(MARGIN, 40), Color('#999999'))


func _process(delta: float) -> void:
	var timed_step: float = SPEED * delta
	var untimed_step: float = SPEED

	timed.position.x = _advance(timed.position.x, timed_step)
	untimed.position.x = _advance(untimed.position.x, untimed_step)
	timed_distance += timed_step
	untimed_distance += untimed_step

	timed_label.text = 'position.x += speed * delta   travelled %d px' % timed_distance
	untimed_label.text = 'position.x += speed   travelled %d px' % untimed_distance
	fps_label.text = 'same speed constant, one frame rate: %d fps' % Engine.get_frames_per_second()


func _advance(from: float, step: float) -> float:
	return wrapf(from + step, track_start, track_end)


func _add_track(row: float, color: Color) -> Polygon2D:
	var rail: Line2D = Line2D.new()
	rail.width = 2.0
	rail.default_color = Color('#2a2f3d')
	rail.points = PackedVector2Array([Vector2(track_start, row), Vector2(track_end, row)])
	add_child(rail)

	var marker: Polygon2D = _make_rect(SIZE, color)
	marker.position = Vector2(track_start, row)
	add_child(marker)

	return marker


func _add_label(text: String, at: Vector2, color: Color) -> Label:
	var label: Label = Label.new()
	label.text = text
	label.position = at
	label.add_theme_color_override('font_color', color)
	label.add_theme_font_size_override('font_size', 20)
	add_child(label)

	return label


func _make_rect(size: Vector2, color: Color) -> Polygon2D:
	var rect: Polygon2D = Polygon2D.new()
	rect.polygon = PackedVector2Array([-size * 0.5, Vector2(size.x, -size.y) * 0.5, size * 0.5, Vector2(-size.x, size.y) * 0.5])
	rect.color = color

	return rect


func _add_background() -> void:
	var background: ColorRect = ColorRect.new()
	background.color = Color('#12141a')
	add_child(background)
	background.set_anchors_and_offsets_preset(Control.PRESET_FULL_RECT)

Plus d'exemples de Mouvement