帧数与 delta
同一个速度常量分别在有和没有 delta 的情况下使用,每行都显示走过的距离。第二行的快慢完全取决于帧率。
上方的编辑器正在运行这个项目。改一行代码,它就会重新加载。
用到的 Godot 类
Polygon2DLabelEngine
代码
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)