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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
|
extends Control
var TrayItemScene = preload("res://TrayItem.tscn")
var is_open = true
var _on_data_loaded_callback = null
func _ready():
if OS.get_name() == "Web":
_on_data_loaded_callback = JavaScriptBridge.create_callback(load_save)
var callbacks = JavaScriptBridge.get_interface("godotCallbacks")
callbacks.dataLoaded = _on_data_loaded_callback
for i in range(5):
add_item()
await get_tree().process_frame
_on_resized()
func add_item():
var tray_item = TrayItemScene.instantiate()
%Items.add_child(tray_item)
func open():
is_open = true
var tween = create_tween()
tween.tween_property(
self,
"global_position",
Vector2(get_viewport_rect().end.x - size.x, position.y),
0.25
)
func close():
is_open = false
var tween = create_tween()
tween.tween_property(
self,
"global_position",
Vector2(get_viewport_rect().end.x, position.y),
0.25
)
func _on_resized():
%Button.global_position = global_position - Vector2(%Button.size.x, 0)
func _on_button_pressed():
if is_open:
close()
else:
open()
func _on_save_pressed():
if OS.get_name() == "Web":
var to_save = []
var objects = get_tree().current_scene.get_node("%DropTarget").get_children()
for obj in objects:
to_save.append({
"position": {
"x": obj.position.x,
"y": obj.position.y,
},
"rotation": obj.rotation,
"object": "BuilderObject",
})
JavaScriptBridge.download_buffer(
JSON.stringify(to_save).to_utf8_buffer(),
"CityBuilder-save.json",
"application/json"
)
func _on_load_pressed():
if OS.get_name() == "Web":
JavaScriptBridge.eval("openLoadDialog()")
func load_save(data: Array):
var current_objects = get_tree().current_scene.get_node("%DropTarget").get_children()
for obj in current_objects:
obj.queue_free()
var objects = JSON.parse_string(data[0])
for obj in objects:
var scene = load("res://Objects/" + obj.object + ".tscn").instantiate()
scene.position = Vector2(obj.position.x, obj.position.y)
scene.rotation = obj.rotation
get_tree().current_scene.get_node("%DropTarget").add_child(scene)
|