64 lines
1.6 KiB
GDScript
64 lines
1.6 KiB
GDScript
class_name GameKeyboard extends Node3D
|
|
|
|
@export var _key_size: float = 0.25
|
|
@export var _key_gap: float = 0.05
|
|
|
|
@onready var _gap_to_size_ratio: float = _key_gap / _key_size
|
|
|
|
|
|
func _ready() -> void:
|
|
_generate_keys()
|
|
|
|
|
|
func _generate_keys() -> void:
|
|
var layout_rows := LayoutAnsi.rows()
|
|
|
|
for row in layout_rows:
|
|
_set_width_ratios_with_gaps(row)
|
|
|
|
var rows_amount := layout_rows.size()
|
|
var row_width := (
|
|
_get_row_width(layout_rows[0]) + (layout_rows[0].size() - 1) * _key_gap
|
|
)
|
|
|
|
for i in range(rows_amount):
|
|
var row := layout_rows[i] as Array[KeyProps]
|
|
_generate_row(row as Array[KeyProps], i, row_width, rows_amount)
|
|
|
|
|
|
func _generate_row(
|
|
row: Array[KeyProps], row_index: int, row_width: float, rows_amount: int
|
|
) -> void:
|
|
var offset_z: float = (
|
|
((rows_amount - 1) * _key_size + (rows_amount - 1) * _key_gap) / 2
|
|
)
|
|
|
|
var key_pos_x: float = -row_width / 2 + _key_size / 2
|
|
var key_pos_z: float = row_index * _key_size + row_index * _key_gap - offset_z
|
|
|
|
for key_props in row:
|
|
var game_key_node := GameKey.instantiate_with_props(key_props)
|
|
add_child(game_key_node)
|
|
|
|
game_key_node.position.x = (
|
|
key_pos_x + (_key_size * key_props.width_ratio - _key_size) / 2
|
|
)
|
|
game_key_node.position.z = key_pos_z
|
|
|
|
key_pos_x += _key_size * key_props.width_ratio + _key_gap
|
|
|
|
|
|
func _set_width_ratios_with_gaps(row: Array[KeyProps]) -> void:
|
|
for key_props in row:
|
|
if key_props.width_ratio_init > 1:
|
|
key_props.width_ratio += (
|
|
_gap_to_size_ratio * (key_props.width_ratio_init - 1)
|
|
)
|
|
|
|
|
|
func _get_row_width(row: Array[KeyProps]) -> float:
|
|
var width: float = 0
|
|
for key_props in row:
|
|
width += _key_size * key_props.width_ratio_init
|
|
return width
|