GDScript How To - seraph526/godot-se GitHub Wiki
####Scripting How-to
- 如何克隆一个节点
var orig = get_node("SomeNode")
var copy = orig.duplicate()
add_child(copy) # 克隆的节点要手动填加到场景渲染树
- GDCript中如何使用JSON
var d={}
var err = d.parse_json(json_string)
if (err!=OK):
print("error parsing json")
- 如何使用多维数组
var a =[1,2],[3,4](/seraph526/godot-se/wiki/1,2],[3,4)
- 如何保存数据到文件系统
var gold = 150 # 我有许多金牌!
var f = File.new()
var err=f.open("user://some_data_file",File.WRITE) #TODO: 处理相关错误!
# 注意:可以为了各种目的使用store_var()
f.store_8(5) # 保存整型
f.store_string("some gold") # 保存字符型
f.store_var(gold) # 保存变量
f.store_line("gold="+str(gold)) # 保存行
f.close() # 存储完毕后,关闭文件
- 如何从文件系统加载数据
var my_num
var my_string
var my_gold
var save_file = "user://some_data_file"
var f = File.new()
if f.file_exists(save_file): # 检查文件是否存在
f.open(save_file, File.READ) # 尝试打开并读取
if f.is_open(): # 打开文件,读取一些数据!
my_num = f.get_8() # 检索数字
my_string = f.get_string() # 检索字符
my_gold = f.get_var() # 检索gold变量
my_line = f.get_line()
f.close() # 所有数据读取完毕,关闭文件
print("Data loaded.") # debug message
else: # 文件打开失败,可能是权限问题
print("Unable to read file!")
else: # 文件不存在,可能设置变量为一些默认值等。
print("File does not exist.")
- 如何设置函数参数的默认值
func my_function(my_param="default value"):
- 如何显示fps
extends Label # 填加一个标签a
func _ready():
set_process(true)
func _process(d):
set_text(str(OS.get_frames_per_second()))
- 如何绘制polygon和它的轮廓点
func _drawPolygon(pointArray):
var i = 1;
var colors = [
Color(0.5,0.5,0.5),
Color(0.5,0.5,0.5),
Color(0.5,0.5,0.5),
Color(0.5,0.5,0.5)
];
var uvs = [];
var prevpoint = null;
#填充polygon形状
draw_polygon(pointArray, colors, uvs);
#然后在每个点绘制一个圆,然后将这些圆用线连接起来
for p in pointArray: # 点数组每个点p
draw_circle(p, 10, Color(1,1,1));
#在点的位置绘制一个圆,半径为10,颜色为白色
#检查当前点是否为第一个点,哪果不是,绘制一个从上一个点到当前点的线将其连接起来
if prevpoint != null:
draw_line(prevpoint, p, Color(1,1,1),5)
prevpoint = p;
#为那一次循环设置p
else:
prevpoint = p;
#检查当前循环是滞已经到达最后一个节点,然后绘制一条线连接最后一个节点和第一个节点(points[0]
if i == points.size():
draw_line(p, pointArray[0], Color(1,1,1),5)
print("array end");
#确保我们连接了所有的线路
i+=1;
#增加循环以继续检查我们是否到过数组尾部
- 如何设置global变量
Globals.set("my_global", 6)
- 如何读取全局变量
print ( Globals.get("my_global") )
- 如何退出游戏
get_scene().quit()
- 如何改变label字体颜色
label.add_color_override("font_color", <desired_color>)
- 如何隐藏鼠标指针
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
- 如何显示鼠标指针
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
- 如何使用PNG图片作为鼠标指针
func _ready():
Input.set_mouse_mode(Input.MOUSE_MODE_HIDDEN)
var cursor = load("res://cursor.png")
VisualServer.cursor_set_texture(cursor,Vector2(0,0),0)
VisualServer.cursor_set_visible(true, 0)
set_process_input(true)
func _input(ev):
if (ev.type == InputEvent.MOUSE_MOTION):
VisualServer.cursor_set_pos(ev.pos,0)
- 如何得到鼠标点击坐标
#可以通过_process或_input得到鼠标点击坐标:
使用 _process:
func _ready():
set_process(true)
func _process(delta):
if (Input.is_mouse_button_pressed(1)):
print("Left click: ", Input.get_mouse_pos())
if (Input.is_mouse_button_pressed(2)):
print("Right click: ", Input.get_mouse_pos())
if (Input.is_mouse_button_pressed(3)):
print("Middle click: ", Input.get_mouse_pos())
使用 _input:
func _ready():
set_process_input(true)
func _input(ev):
if (ev.type == InputEvent.MOUSE_BUTTON):
print("Mouse event:", ev.pos)
- 如何检查字典是否存在
# 检查在resource data文件夹中字典是否存在
var res_dir = Directory.new()
if ( res_dir.dir_exists("res://my_dir") ):
print("res://my_dir exist!")
# 检查在user data文件夹中字典是否存在
var user_dir = Directory.new()
user_dir.open("user://")
if ( user_dir.dir_exists("user://my_dir") ):
print("user://my_dir exist!")
# 检查在文件系统中字典是否存在
var fs_dir = Directory.new()
fs_dir.open("")
if ( fs_dir.dir_exists("c:\\Windows") ): # guilty as charged -- marynate
print("c:\\Windows exist!")
- 如何检查数据类型
var a_var = 1
var type = typeof(a_var)
if (type==TYPE_INT):
print("it's an int")
elif (type==TYPE_REAL):
print("it's a float")