网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
09月08日
漏签
0
天
godot吧
关注:
6,300
贴子:
31,669
看贴
图片
吧主推荐
游戏
1
2
下一页
尾页
26
回复贴,共
2
页
,跳到
页
确定
<<返回godot吧
>0< 加载中...
论Godot中的C++和NativeScript
只看楼主
收藏
回复
柯哆啦
数学算法
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
因为想实现语音识别,但是讯飞的太贵了,所以想在本地实现,但是造轮子很复杂,于是研究了一下NativeScript,终于可以用C++写代码了。官方文档虽然很详细,但是太繁琐了,于是,在这里整理一下如何使用C++编写NativeScript
柯哆啦
数学算法
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
1.基本概念
在写好代码并构建之后,会生成一个动态链接库(Windows下就是dll),这个就是最重要的那个文件
GDNativeLibrary,就是一种资源,这种资源需要指定我们生成的dll。
NativeScript,在官方文档上就是指C/C++代码,在编辑器中,是指gdns文件,Godot 3.1+需要使用NativeScript 1.1格式。gdns需要加载我们那个GDNativeLibrary资源
各种节点都可以挂载gdns文件作为脚本
柯哆啦
数学算法
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
2.需要安装的东西
(1)Godot二进制程序(废话,既然用Godot开发,肯定已经安装了,只不过因为官方文档把它列了进去,所以这里也写一下),注意版本,这里以3.2.x版本为例
(2)一个C++编译器,例如Visual Studio社区版
(3)Scons构建工具(这是一个Python的工具,所以需要先安装Python3,然后pip安装一下就行)
(4)godot-cpp,在Godot的github仓库中有,git clone一下就行,这里需要两点:
A.注意版本分支,Godot是3.2.x的话,就克隆3.2版本的
B.godot-headers包含在了里面,但是需要递归克隆(--recursive)
柯哆啦
数学算法
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
3.步骤概览
(1)编译godot-cpp,编译一次就行了,之后写其他模块,就不需要了
(2)写C++代码并构建动态链接库
(3)使用写好的动态链接库
柯哆啦
数学算法
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
4.步骤一
打开控制台,进入godot-cpp文件夹中,使用scons工具构建godot-cpp
构建命令如下:
scons platform=操作系统名称 generate_bindings=yes bits=位数
操作系统名称,例如windows,位数就是指32位还是64位,64位的就写64即可。如果想要加快构建速度可以使用-j选项,后面跟线程数,注意这个选项和线程数之间没有空格
在构建完成之后,godot-cpp的bin文件夹中就会有一个静态库文件(Windows下的后缀名为lib)
柯哆啦
数学算法
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
5.步骤二
首先,先写代码,我们需要在godot-cpp的上一层文件夹中新建一个文件夹,比如叫做src,在这里面写C++代码,这里主要有三个文件:
(1)导出C++代码的C++代码文件
(2)实际的C++代码的头文件
(3)实际的C++代码的代码文件
代码的例子,可以参看官方文档,官方文档的例子会在之后的内容中讲一下
写好代码之后,我们需要写一个scons的构建文件,官方文档中已经有写好的了,直接下载即可,但是有时需要改一下,比如说如果你要放在src的上层文件夹中,那么就要把里面的路径改一下,具体的根据scons的提示更改
在这一步中,我们将会得到很多文件,最重要的就是那个dll文件,项目中,我们也就只需要这个文件,因此把它复制到项目中吧!
柯哆啦
数学算法
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
(二)C++代码详解
涉及C++代码的主要就三个文件:一个导出dll用的cpp文件,一个实际代码的头文件和一个实际代码的cpp文件
1.导出dll用的cpp文件
这个文件基本上能重复用,有两个地方要修改,一是要导入那个头文件,二是要注册我们写的类
柯哆啦
数学算法
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
2.实际代码
实际代码,主要就是一个头文件和一个代码文件,头文件就是类和方法的声明,代码文件就是实现这些方法的。但是,与一般的C++不同,这里有一些区别。
Godot 3.1+版本使用的是NativeScript 1.1格式,所以这里以这个版本为例。
(1)需要导入的头文件
我们写的这个类需要放在godot命名空间中,并且类要继承自各个节点的类,例如Sprite,基本上GDScript能继承的类,都可以在这里继承,注意这里的继承是公有继承(即public继承)
(2)在类中的第一行,需要使用GODOT_CLASS宏,两个参数分别为该类的类名和基类的类名,两个在这里都不需要写引号
(3)两个重要方法
在这一个类中,至少要有两个方法
A.第一个方法: static void _register_methods()
这个方法,用于注册可供Godot和GDScript调用的方法
B.第二个方法:void _init()
这个方法用于初始化,这个方法不需要注册
柯哆啦
数学算法
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
3.注册方法
使用register_method就可以注册方法了,有两个参数,第一个参数是导出到外部的名称(即你可以在GDScript中使用这个名字),第二个参数是指向类中相应方法的指针,所以别忘记&符号
有一些名称比较特殊,比如_process,它就相当于GDScript中的_process,也是每一帧调用
柯哆啦
数学算法
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
4.补充
(1)关于库
C++的标准库也是可以使用的,GDScript中的类基本上也都可以使用(具体可以看godot-cpp的代码),不过需要注意一点,标准输出指的是Godot编辑器运行时的那个黑黑的控制台,不是指内建控制台
自己写新的方法的时候,如果想要在Godot中调用,不要忘记注册该方法
(2)在GDScript中调用
和调用GDScript代码一样,可以用preload加载,加载后就是一个类,然后就可以用new来实例化对象,并调用导出的方法,需要注意,没有注册的方法是不能调用的
柯哆啦
数学算法
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
5.除了C++标准库外,在C++代码中可以调用哪些类
在godot-cpp的include目录中的那些都是(两个文件夹里面的都是),很容易发现命名和GDScript中的是一样的,这些都可以用。
另外,windows头文件不能用。
法师の抱歉
人类的大敌
吧主
13
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
难得有C++方面的经验,支持了
nps
小吧主
8
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
感谢
柯哆啦
数学算法
7
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
(三)常用的Godot库
Godot.hpp就是Godot核心的头文件,但是一些全局的常量,比如KEY_ENTER之类的键盘码常量不在这个文件里,而在GloabalConstants.hpp文件中,这个文件定义了全局常量
其次,各个节点的类和其它类都是单独一个文件。在一个继承自节点类的C++代码中,可以使用set和get方法来设置和获取节点的各种属性,例如set_text方法就可以用来设置节点的文本。在这些方法中,如果参数是字符串类型的话,那么它的类型是Godot定义的String类,而不是C++标准库的string类型
在_process绑定的方法方法中,它接收一个float类型的参数,导入Input.hpp后,可以检测输入,比如is_key_pressed方法可以检测键盘是否按下,但是这个方法不是静态方法,所以可以先使用其中的静态变量_singleton,它会返回一个Input类型的指针,然后就能使用其它方法了,需要注意,因为是指针,所以要使用箭头运算符,而不是点运算符来指向其它的方法
多能豆
小吧主
11
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
终于见到用NativeScript的人了,所以请教一下,不用scons怎么构建库?我用纯mingw64编译cpp动态库时,总是报错,提示内存管理不安全
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示