small racing game im working on
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
extends VBoxContainer

var players: Dictionary = {}
var pictures: Dictionary = {}

@export var ls: LabelSettings
@export var pad: Texture2D
@export var kbd: Texture2D

func on_change() -> void:
	var ks := pictures.keys()
	for i in pictures.size():
		(pictures[ks[i]].get_child(0) as Label).text = str(i + 1)

func _input(event: InputEvent) -> void:
	if not event.is_pressed():
		return
	if event.is_action("ui_cancel") and players.has(event.device):
		players.erase(event.device)
		var t := get_tree().create_tween().set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_BACK)
		var p: TextureRect = pictures[event.device]
		pictures.erase(event.device)
		var gp := p.global_position
		remove_child(p) # move out to free space
		owner.add_child(p)
		p.global_position = gp
		t.tween_property(p, ^"position", Vector2(-130, p.position.y), .3)
		t.tween_callback(p.queue_free)
		on_change()
	elif good(event) and !players.has(event.device):
		pictures[event.device] = maketex(pad if event is InputEventJoypadButton else kbd)
		players[event.device] = true
		on_change()

func good(e: InputEvent) -> bool:
	var bads := [InputEventJoypadMotion, InputEventMIDI, InputEventMouseButton, InputEventMouseMotion, InputEventScreenTouch, InputEventScreenDrag, InputEventGesture]
	for bad in bads:
		if e == bad:
			return false
	return true

func maketex(t: Texture2D) -> TextureRect:
	@warning_ignore("shadowed_variable_base_class")
	var tr := TextureRect.new()
	tr.texture = t
	tr.expand_mode = TextureRect.EXPAND_KEEP_SIZE
	tr.stretch_mode = TextureRect.STRETCH_KEEP
	var l := Label.new()
	l.label_settings = ls
	l.position.x = 100
	tr.add_child(l)
	add_child(tr)
	return tr