80 lines
1.9 KiB
GDScript3
80 lines
1.9 KiB
GDScript3
|
|
extends SceneTree
|
||
|
|
# ##############################################################################
|
||
|
|
# Proof of concept to create a class from a string instead of writing it to a
|
||
|
|
# file and then loading it.
|
||
|
|
#
|
||
|
|
# I hope to use this to create doubles in the future, though it will make
|
||
|
|
# debugging the generated code a little harder, it always bothered me that I
|
||
|
|
# was writing and reading files. It's slower and wastes cycles on the HD.
|
||
|
|
# Probably shouldn't bother me that much, but it does..
|
||
|
|
# ##############################################################################
|
||
|
|
|
||
|
|
class SuperPack:
|
||
|
|
extends PackedScene
|
||
|
|
var _script = null
|
||
|
|
var _scene = null
|
||
|
|
|
||
|
|
func set_script_obj(obj):
|
||
|
|
_script = obj
|
||
|
|
|
||
|
|
func instantiate(edit_state=0):
|
||
|
|
var inst = _scene.instantiate(edit_state)
|
||
|
|
inst.set_script(_script)
|
||
|
|
return inst
|
||
|
|
|
||
|
|
func load_scene(path):
|
||
|
|
_scene = load(path)
|
||
|
|
|
||
|
|
|
||
|
|
func make_class():
|
||
|
|
var text = ""
|
||
|
|
|
||
|
|
text = "class MadeIt:\n" + \
|
||
|
|
"\tvar something=\"hello\"\n" + \
|
||
|
|
"\tfunc do_something():\n" +\
|
||
|
|
"\t\treturn 'did it'"
|
||
|
|
|
||
|
|
return text
|
||
|
|
|
||
|
|
func make_node():
|
||
|
|
var text = "extends Node2D\n" + \
|
||
|
|
"func do_something():\n" + \
|
||
|
|
"\treturn 'did it!!'"
|
||
|
|
return text
|
||
|
|
|
||
|
|
|
||
|
|
func get_script_for_text(text):
|
||
|
|
var script = GDScript.new()
|
||
|
|
script.set_source_code(text)
|
||
|
|
script.reload()
|
||
|
|
return script
|
||
|
|
|
||
|
|
func create_node2d():
|
||
|
|
var n = Node2D.new()
|
||
|
|
n.set_script(get_script_for_text(make_node()))
|
||
|
|
print('create node2d = ', n.do_something())
|
||
|
|
n.free()
|
||
|
|
|
||
|
|
func create_instance():
|
||
|
|
var obj = RefCounted.new()
|
||
|
|
obj.set_script(get_script_for_text(make_class()))
|
||
|
|
|
||
|
|
var inner_class = obj.MadeIt.new()
|
||
|
|
print('create instance = ', inner_class.do_something())
|
||
|
|
|
||
|
|
func create_scene():
|
||
|
|
var s2 = SuperPack.new()
|
||
|
|
s2.load_scene('res://test/resources/doubler_test_objects/double_me_scene.tscn')
|
||
|
|
print(s2._scene._bundled)
|
||
|
|
s2.set_script_obj(get_script_for_text(make_node()))
|
||
|
|
|
||
|
|
var inst = s2.instantiate()
|
||
|
|
print('create scene = ', inst.do_something())
|
||
|
|
|
||
|
|
|
||
|
|
func _init():
|
||
|
|
create_node2d()
|
||
|
|
create_instance()
|
||
|
|
create_scene()
|
||
|
|
quit()
|