动态添加场景
1.func _ready():
2. for i in range(50):
3. addIconsButton()
4.
5.
6.func addIconsButton():
7. #添加自定义图标按钮
8. var icon = preload("res://IconsButton.tscn").instance()
9. self.add_child(icon)
UDP接受消息
1.var peer
2.
3.
4.func _ready():
5. peer = PacketPeerUDP.new()
6. peer.listen(9999)
7.
8.
9.
10.func _process(delta):
11. if peer.get_available_packet_count() > 0:
12. var data = peer.get_packet().get_string_from_ascii()
13. print(data)#从对象获取数据
14. print(peer.get_packet_ip())#获取IP地址
15.
16. var lab = Label.new()
17. lab.set_text(data)
18. self.get_child(0).add_child(lab)
使GridContainer里的子控件自适应位置
需要在子控件的SizeFlags里面勾选Expand,同时GridContainer控件本身也要勾选这一项
电脑端是竖着的但是手机上横着使手机画面与电脑一致
联网发送数据包会多出几个字节
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.setsockopt(socket.SOL_SOCKET, socket.SO_BROADCAST, True)
sock.bind(("", 9999))
sock.sendto("你好".encode(), ("255.255.255.255", 9999))
while True:
recv_data = sock.recvfrom(1024)
text = recv_data[0].decode(encoding='UTF-8')
text = text[8:-1]
print(text)
if text == "getData":
print("准备发送数据:")
sock.sendto("你好".encode(), ("255.255.255.255", 9999))
可以看到text[8:-1]
这是因为在godot里使用了put_var函数发送,如果使用put_var()函数就会在前面添加4个字节,因为put_var()是godot程序互相联机专用的,会在前面添加变量类型判断数据。
可以使用put_packet()
安卓手机无法联网
var err = peer.set_dest_address("192.168.31.70",19999)#设置发送地址 端口
看报错是
● ERR_CANT_CREATE = 20
无法创建错误。
查看官方github,是权限问题。解决办法就是打包的时候把权限都勾上
方法一:
方法二:
如果不想都勾上,可以只勾选Internet网络权限
手机无法安装打包好的APK
提示没有证书,可以通过360签名工具对apk进行重新证书签名
控件检测鼠标点击事件
参考:InputEventMouseButton — Godot Engine (stable) 简体中文文档
运行时动态修改Panel面板颜色
- Panel控件的ThemeOverrides栏添加一个StyleBoxFlat这样就可以手动设置颜色了
- 核心步骤是第23行,获取到当前控件的属性
- 这个属性名可以通过鼠标悬浮属性栏得到,比如
- 当然除了get函数,也可以使用set函数,一些属性都可以这样得到
- 如何在代码里动态设置 Custom Styles【godot吧】_百度贴吧 (baidu.com)
添加自定义属性栏
有没有办法在Godot中创建真正的自定义类型? - 我爱学习网 (5axxw.com)
(65条消息) 【Godot】动态的属性列表 示例_张学徒的博客-CSDN博客
第一种方法:
export var a = 1
也可以指定类型export var a:String
可以看文档查看export用法
第二种方法:
- 首先需要在最上面加上tool关键词
然后需要重写这个内置函数_get_property_list
- 最终效果
控件与脚本文件的关系太乱目录不好整理
新建脚本的时候可以选择内置脚本
这样就是控件场景跟脚本是同一个文件了,方便整理目录
绑定发送信号
- 新建信号signal drag
- 发送信号self.emit_signal("drag")
- self.可以不加,如果在其他脚本发送信号需要通过引用来发射如a.emit_signal("drag")
- 绑定信号gridlayout.connect("drag",self,"_on_IconsGridLayout_draw")
- 注意connect前的gridlayout表示信号所在实例,self表示回调函数所在实例
- 如果需要带参数则如下
- signal drag(relative)#新建带参数的信号
- self.emit_signal("drag",event.relative)#发射带参数的信号
- 相应的带参数的回调函数:func _on_IconsGridLayout_draw(relative):
- 另外在其他类中定义信号如下
- node_ins.add_user_signal("custom_user_signal")
父控件的输入回调函数,会受到子控件的影响
点击子控件的话,父控件收不到信号?有办法直接让子控件不受点击事件吗?