版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、页眉内容场景和节点seraph526 在 星期三,10/14/2015 -15:10提交介绍想像一个,你不再是一个游戏开发者,而是一名大厨!将时髦的衣服换成绒边帽和双排扣 夹克现在,你不做游戏,而是为你的客人烹饪新鲜美味的食物现在,一位大厨如何烹饪食物?分为两道工序,首先是材料,其次是准备工序的介绍这样,每个人都可以按照食谱制 作,并品尝你伟大的料理用Godot做游戏和做菜的感觉非常像使用引擎就像置身于厨房中在这间厨房里,节点 就像是装满了要烹饪的原材料的冰箱有许多类型的节点,一些显示图片,另外一些播放声音,还有一些显示3D模型等等有许多 这样的节点节点让我们开始学习基础知识节点是创建游戏的基
2、本元素,它有以下几个特点:*要定义一个 名字*有可编辑的属性*逐帧运行以接收callback调用*可以被继承(拥有更多的函数) *可以作为其他节点的子节点最后一点很重要节点可以拥有其他节点作为子节点当我们按这种方式组织节点,节点 便成了 tree.在Godot中,按这种方式管理节点的方式成就了一个伟大的管理项目的工具 因为不同的 节点有不同的函数,组合他们会创建更复杂的节函数 这些可能你还不太清楚,没什么太 深的理解但是所有这些将来都会有所说明现在最重要的是要记住,节点的存在,而且可 以按上述的方式组织节点场景既然已经定义了节点的存在,下一步便是说明什么是场景场景由一组节点构成,这些节 点被分
3、级管理(以树的形式)它有以下的特征:一个场景通常只有一个root节点*场景可 以被保存到磁盘并加载加来*场景可以被instanced*(后面会详细说明)*运行一个游戏也就是运行了一个场景*一个项目中可以有几个场景,但是要开始游戏,一定要先加载其 中一个基本上,Godot编辑器就是一个场景编辑器.它有许多工具用来编辑 2D和3D 场景以及用户界面,但所有的编辑器都是都是围绕编辑场景和节点展开的创建新项目理论是枯燥的让我们改变主题,实践一下.跟随一个传统的教程,第一个工程将是 helloworld.为此,将使用编辑器当Godot在项目外运行时,工程管理器将会出现它帮 助开发者管理他们的项目要创建一
4、个新项目 要使用new Project选项选择并创建项目路径和定义项目名称编辑器新项目创建后,下一步就是打开它.这将打开Godot编辑器.下图是我们新打开时编辑器 的样子如前文所述,在Godot中制作游戏,就像置身于厨房所以,让我们打开冰箱并填加一些新节点到场景中去.我们将以HelloWorld项目开始按下新节点按扭:这将打开节点创建对话框,它显示了所能创建的节点的长度列表:这里,我们选择Label,搜索节点通常更快捷一些.最后,创建Label!.当创建按扭被按下时,发生了很多事:首先,场景变为2D编辑器(因为Label是2D节点类型),Label显示,被选中,在viewport 的左上角.节
5、点出现在场景树编辑器中(在右上角),label属性出现在Inspector面板中(在右下角).下一步,我们将改变label的Text属性,将其值改为Hello World:OK,所有的事都准备好了,可以运行场景了 !点击顶部的PLAY SCENE按扭(或者按F6):哎呀运行前场景要先保存,选择Scene-Save,保存场景为helllo.scn 类的名字这里有一些有趣的事情.文件对话框比较特别,它允许保存场景到工程内部.工程的根目 录是,它就是资源路径.也就是说,文件只能保存到项目内部.将来,当在Godot中做文件 操作时,记住是资源路径,不管是什么平台或安装路径,这是从游戏内部定位资源的方法
6、 在保存了场景并按下run之后,Hello World!最终正常运行了 :成功了 !配置项目好了,是时候对项目做一些配置了现在,运行场景是唯一执行程序的方法项目通常都有向个场景,所以要将它们中的一个设置为主场景主场景将在项目运行时被第一个加载这些设置都被存储在engine.cfg文件中,这是一个纯文本的 win.ini格式的文件,以便可以方便的编辑.还有很多选项可以设置以声明项目如何运行,为了让设置变得简单,可以通 过项目设置对话框设置en gi ne.cfg.要访问此对话框,可通过Scene-Project Settings 打开.窗口打开后,任务是设置一个主 场景.我们可以很容易的改变ap
7、plication/main_scene的属性,选择hello.scn为主场景 修改后,点击regular Play按扭(或F5)会运行项目,无论当前是哪个场景被编辑返回项目设置对话框.这个对话框提供了很多可以填加到engine.cfg的选项,这里显示了它们的默认值.如果默认值是正确的,我们不需要云改变它们.当值改变时,名字左侧的选 择框会变为选中状态.这意味着这个值会被保存到engine.cfg文件中,会被项目记住所做的更改.这里是边注,为将来提供参考,有一些断章取义(毕竟,这只是第一篇教程).通过使 用Globals singleton可以填加自定义的设置选项,并且可以实时读取.实例化se
8、raph526 在 星期三,10/14/2015 - 15:27提交基本原理有一个小型的场景,有些节点在场景中,可能有很多小的项目都可以正常工作,但当项目成长时,越来越多的节点被使用,它很快就会变得难以管理.为了解决这个问题,Godot允 许项目被划分为不同的场景.这和其他的一些游戏引擎的工作方式不一样.事实上,差别 很大.所以请不要跳过这篇教程.重申一下:场景是节点的集合,按照trew的结构组织,只能有一个单独的节点做为这个树 的根结点.在Godot中,场景可以创建并保存到磁盘上.任意场景都可以创建和并按你希望的形式保 存.之后,当编辑一个存在的场景或新场景时,其他场景可以被初始化为此场景的
9、一部分.上图中,场景B被加载并初始化为场景 A中的一个实例,开始可能会觉得奇怪,但当看完这 篇教程时会完全了解是什么回事.初始化,Step by Step要学习如何初始化,让我们从下载一个pre-made souene .解压下载的场景到任意我们喜 欢的路径下然后,使用import选项加载到项目管理器定位到你的项目,打开engine.cfg文件.新的项目会出现在项目列表中要管理这个项目 可以点击Edit选项.这个项目包含两个场景 ball.scn和container.scn.ball场景只是一个带有物体属性的球,container场景有一个很好的碰撞形状.球会被限制指定的区域 中.打开con
10、tai ner场景,选择根节点:之后,点击+按扭,这就是初始化按扭!选择ball场景(ball.scn),球会出现在origin(0,0)位置,围绕场景中心移动 ball,如下:点击Play按扭,瞧!初始化的小球都落到底部的陷阱中多一些场景中可以有任意多个初始化实例,试下创建更多的球,或者复制(ctrl-D或复制按扭):再一次运行场景:是不是很酷?这就是实例如何工作的.编辑实例选中实例化的小球中的一个,打开属性编辑器.我们让它的弹力再大些,查看bounee参数, 将其值设置为1.0: 接下来,会出现一个绿色的revert按扭,当这个按扭出现时,意味着我们编辑一个实例场 景的属性,将重写这个实例
11、为特别的值.甚至属性在原场景中编辑过.自定义的值将会重 写它们.按下revert按扭将恢复场景中原来的值.结论实例化看起来很简单,实际上它还有很多功能,下一节实例化教程将会说明剩下的部分实例化(继续)seraph526 在 星期三,10/14/2015 - 16:06提交概括实例化有很多方便的用法一目了然,使用实例,你可以:*细分场景,使之易于管理.*更加 灵活的方法替代prefabs(可以工作在更多层级的功能更加强大的实例化).*设计更加复杂的游戏流程甚至是 Uls的方法(UI元素在Godot中也是节点).设计语言但是,实例化场景真正强大的点在于它像一门优秀的设计语言一样工作这使得Godot
12、完全不同于其他的游戏引擎整个引擎从底层都是围绕这一概念设计的用Godot制作游戏时,建议的方式是将其他的设计模式如MVC或Entity-Relationship diagrams放到一边以更加自然的方式开始制作游戏开始设想游戏中的可视化元素,那些不光可以被程 序员命名,也可以被任何人命名的游戏元素 如,这里是一个简单的射击类游戏的创意思路 任何类型的游戏都可以十分简单的想像出这样的图表 只要写下想法中的元素,然后用箭 头标注所有权关系这个图表存在后,制作游戏基本就成了为这些节点创建场景,使用实 例化(通过代码,之后会介绍,或者通过编辑器)表示所有权关系 编写游戏的大部分时间(或者一般的软件)都
13、花在设计游戏模式并让游戏组件适应这一模 式上基于场景的设计取代了这些,使得开发更快更直接,允许直接关注游戏本身基于场 景/实例化的设计节省了大部分上述的工作,使工作变得十分有效率,因为大部分组件被 直接映射成一个场景这样,不再需要或只需很少的模式代码F面是一个复杂点的例子,一个开放沙盒类型的游戏,其中有很多资源或部分是交互的用家具搭建一些屋子,之后连接它们制作一间房子,用这些房间作为这间房子的内部这 间房子可能是堡垒的一部分,堡垒有许多房子组成最后,堡垒可以被放置到世界地图上 也要填加一些守卫和一些 NPCsg到先前创建的场景中使用Godot,可以快速的按你所 想实现游戏,因为只是多个场景的制
14、作和初始化编辑器UI也设计成无需程序员操作的模式,所以,通常一个游戏开发小组包括 3D或2D艺术家,关卡设计师,游戏设计师,动画师 等等,都是通过编辑器界面工作脚本seraph526 在 星期三,10/14/2015 - 16:08提交介绍讲了许多关于不编辑就可以让用户制作游戏的工具 程就可以制作游戏.这一需求已经存在了很长时间了.这是许多独立开发者的梦想,不学编,甚至是在公司内部,游戏设计者也希望更多的控制游戏的流程.许多产品被制作出来承诺无编辑环境,但是往往结果都是不完美的,太复杂或跟传统的代 码比没有效率结果,编辑在这里停滞了很长一段时间事实上,游戏引擎中通常的做法是 增加一些工具以减少
15、为特殊任务重新编码的数量,加快开发的速度在这个意义下,Godot为了这个目标做了一些有用的决定策略首先也是最重要的场景系统.开始,它的目的还不是很明确,但是后来工作的很好那就是让程序员从架构设计的代 码中解放出来当使用场景系统设计游戏时,整个项目是碎片化的补充场景(不是各自独立的).各场景间 相互补充,而不是各自独立之后将会有大量的例子,但是要记住这非常重要为此有大量的专业编辑知识,这意味着一个不同于 MVC的设计模式.Gosot允许放弃MVC模式的一些效率损失,取而代之的是场景填充(scenes as a complement)设计模式Godot脚本也使用extend模式也就是说脚本可以继承
16、自有可能的引擎类GDScriptGDScript (click link for referenee) 是动态类型脚本语言,以适应Godot弓I擎,设计它主要 有以下几个目标:*第一个,也是最重要的,让它变得简单,熟悉,尽可能的易学.*使代码易 读,让错误更安全语法大部分是借鉴Python.程序员通常要花几天去学习它,不超过两周就会适应它.像其他动态类型语言一样,高产 出(代码易学,可快速编写,没有编译等等)是以平衡效率为代价的,但是引擎中大部分核心 代码是用C+编写的(Vector ops,phsics,math,indexing等等),对大部分类型的游戏来说保证足够的效率.任何情况下,如果
17、要求更高的运行效率,重要部分的代码可以用 C+重写并且暴露给脚本. 允许用C+的类替换GDScript类,而不用改变游戏的其他部分.脚本化场景在继续之前,确保已经阅读了 GDScript相关说明它是一个简单的语言,说明非常短,看 下不用花太长时间场景设置教程以脚本化一个简单的GUI场景开始.使用增加节点对话框用下面提到的节点创建下面的结构:?PaneloLabeloButton它在场景树中的样子如图所示:同时确保它看起来像是在2D编辑器中,所以它是有意义的:最后,保存场景,一个合适的名字可以是sayhello.scn填加脚本选择Panel节点,然后点击Add Script图标:会弹出脚本创建对
18、话这个对话框允许选择语言,类名等等.GDScript在脚本文件中不使 用类名.所以该区域不可编辑脚本要继承自Panel(因为这意味着继承的节点类型为 Pannel,这里是自动由编辑器填充的).选择脚本名称(如果你之前保存过场景,那么脚本 会被自动命名为sayhello.gd),之后点击Create按扭这些完成后,脚本就创建了,并且被填加到节点上你可以在extra图标看到它也可以在脚 本属性找到:要编辑脚本,点击上面的按扭(虽然,UI可以让你直接到脚本编辑器界面),以下是script的模板:它里面没有很多东西当节点(和它的子节点)进入激活的场景时会调用_ready()函 数(记住,这不是构造函数
19、,构造函数是_init()信号处理Signals大多是使用在GUI节点中,(虽然其他节点也有这些).当一些特别的动作发生时会 发送Signals,可以连接到任意脚本实例的任何程序在这个步骤中,按扭上的点击(pressed)信号将被链接到一个自定义的函数有个GUI用来连接signals,只要选中节点并点击Signals按扭:这将显示按扭能发射的信号的列表但是这个示例不会使用它我们不想制作一个太简单的东西所以,请关闭那个屏幕!任何 情况下,在这一点上,非常清楚,我们对点击信号有兴趣我们不通过可视化界面创建它,而 是通过代码的方式对此,有一个Godot程序员经常会用到的函数,这就是get_node
20、().此 函数通过路径得到当前树结构下的节点,或场景上的其它元素路径是指向挂载脚本的节 占7 、为了得到button,要使用如下语句pyth onget_ no de(Butto n)然后,下一步,挡butt on点击时,返回调用callback会被填加到脚本这将会改变label 上文本的内容:pyth onfunc _on _butt on _pressed():get_ node(Label).set_text(HELLO!) 最终,按扭pressed信号会被连接到_ready()中的callback,使用connect ()pyth onfunc _ready(): get_ no de
21、(Butt on ”).co nn ect(pressed,self,_ on _butt on _pressed)最终的脚本看起来像这个样子:python扩展Panelmember variables here, example:var a=2var b=textvar_on_button_pressed(): get_node(Label).set_text(HELLO!)func _ready(): get_ no de(Butt on ”).co nn ect(pressed,self,_ on _butt on _pressed)、运行场景当你按下按扭时,会得到我们预期的效果脚本(继
22、续)seraph526 在 星期三,10/14/2015 - 16:09提交处理Godot中的一些行为是通过 callbacks或虚函数触发的,所以不需要写一直监测运行的代 码.另外,许多事情可以由动画师来完成.但是,通常还是要在每一帧运行一个脚本的情况.有两种运行模式,空闲处理和固定处理空闲处理通过 Node.set_process ()函数激活.激活后,Node.set_process ()每帧都会执 行.pythonfunc _ready(): set_process(true)func _process(delta): dosomethi ng.delta参数描述从上次调用proces
23、s()到现在过去的时间(以秒为单位的浮点类型)固定处理类似,唯一的要求是要和物理引擎同步.简单的测试这点的方法是创建一个只有一个Lable节点的场景,代码如下:pyth on exte nds Labelvar accum=0func _ready(): set_process(true)func _process(delta): accum+=delta set_text(str(accum)、这会显示一个按秒增加的计算器节点可以被添加到组中(每个节点下,你想要多少都可以)这对于管理大场景来说是简单 而且有效的功能有两种方法做这个,第一种方法是通过UI,从组按扭实现:这是一个有用的例子,如,
24、标记场景,谁是敌人.pythonfunc _ready(): add_to_group(e nemies)这种方式,如果玩豕潜行到秘密基地,如果被发现,所有的组中的敌人都会发出警报.通过调用 SeeneMainLoop.call_group():pythonfunc _on _discovered():get_sce ne().call_group(O,guards,player_was_discovered)、上述方法调用组中guards的每一位成员的函数player_was_discovered. 或者, 通过调用 Seen eMai nLoop.get_ nodes_in_group()
25、得到guards节点全部列表:pyth onvar guards = get_sce ne().get_ no des_ in _group(guards)关于Seen eMa in Loop的更多知识点将在后面讲述。消息系统Godot有一个消息系统。通常这个系统不会在脚本层使用,因为它太底层了,虚函数提 供了大部门接口,但知道它们的存在还是必要的。在你的脚本中填加一个Object._ no tificatio n()函数:pythonfunc _notification(what): if (what=NOTIFICATION_READY): print(This is the same a
26、s overridi ng _ready().) elif (what=NOTIFICATION_PROCESS): var delta = get_process_time() prin t(This is the same as overridi ng _process().)文档class list中列出了所有有接收到的消息。但是,再强调一下,大部分的函数都提供了简单的重写方式可重写函数如前面提到的,最好使用这些函数。节点提供了许多有用的重写函数,如:pyth onfunc _en ter_sce ne(): pass #当节点进入激活的场景时,此函数被调用。此时子节点还没有被加载到当前
27、场景。通常,大部分情况下,最好使用eady()函数。func _ready(): pass #此在_enter_scene函数后调用,但是它能保证所有的子节点都被正常加载,都能被函数调用func _exit_sce ne(): pass #当节点退出当前激活场景时,调用此函数。此时,所有子节点已经全部退出当前场景。func _process(delta): pass #当set_process()被激活时,此函数每帧都调用。func _fixed_process(delta): pass # 当 set_fixed_process() 被激活时,此函数每物理帧 调用。func _paused(
28、): pass #当游戏暂停时调用,调用后,节点不再接收任何callback进程func _un paused(): pass #当游戏继续时调用创建节点由代码创建节点,只要调用.new()方法,(像其他的基于类的数据类型一样),如:python var s func _ready(): s = Sprite.new() # create a new sprite! add_child(s) #add it as achild of this node要删除节点,在场景内或场景外,一定要使用free()页眉内容python func _someaction(): s.free() # imme
29、diately removes the node from the scene andfrees it当节点释放后,所有的子节点也会被释放。因此,手动删除节点要容易的多。只是释放根节点,所有子节点也会被同时释放。但是,经常会出现我们删除的节点处于锁定状态,就是说,这个节点正在发出信息或要 访问一个函数。这会导致游戏崩溃。运行Godot的debugger模式,经常会抓取到这种情况,并提出警告。最安全的删除节点的方法是使用queue_free代替free().它将安全的删除处于闲置状态的节点。python func _someaction(): s.queue_free() # remove th
30、e node and delete it while nothing ishappening初始化场景从代码初始化场景非常简单,有两种方式。第一种是从磁盘加载场景python var scene = load() # will load when the script is instanced有些时候,使用 preload会更方便,因为,它在解析时执行。python var scene = preload() # will load when parsing the script但是,场景仍不是一个包含子节点的节点。它是一种打包的特殊资源PackedScene.要创建实际的节点,要执行Pack
31、edScene.instanee ()函数。它将返回可以加载到场景中的节点树。python var node = scene.instance() add_child(node)两步执行的优势是打包的节点可以保持加载和准备使用,所以可以按照需求用来创建更多的实例。这一点特别有用,如,要在场景中快速地实例化几个敌人,子弹等。创建2D游戏seraph526 在 星期三,10/14/2015 - 16:11提交页眉内容简单的2d游戏(乒乓球!)乒乓球在这个简单的教程中,我们会创建一个简单的乒乓球游戏。引擎中有许多复杂的示例, 但这个示例会简单介绍基本的 2D游戏编程。资源这个教程要包含一些资源文件p
32、o ng pads, the ball a nd the divisor场景设置因为是老年代的游戏,游戏设置为640*480分辨率。这可以在项目设置中设置(请参考前面的教程),默认场景颜色为黑色。为项目创建一个Node2D节点做为根节点。Node2d是2D游戏引擎的基本类型。之后, 填加精灵(Sprite node),并设置相应的纹理图。最终的场景效果如下图所示(注意:球 是在场景中央的):场景结构,如图:保存场景为pong.scn,并在项目属性中设置其为主场景输入行为设置电子游戏有许多输入方法 键盘,手柄,鼠标,触摸屏(多点触摸)。我们要做的是个乒乓球游戏,唯一的输入是控制拍子的上下。处理所
33、的可能的输入方式是件令人崩溃的事,而且会花费大量的代码。事实上,大部分 游戏允许玩家自定义的使情况变得更糟。因此,Godot创建了输入行为(InputActio ns )这一功能。一个行为被定义后,还要定义相应的触发的方法。再次打开项目属性对话框,点击Input Map标签。在里,填加4种行为:left_move_up,left_move_dow n,right_move_up,right_move_dow n.可以设置你希望使用的键位。大多情况下使用左边:A/Z,右边:Up/Down的设置方式。脚本为根节点创建一个脚本,打开它(前面已经讲过了)。脚本要继承自Node2D:python ext
34、e nds Node2Dfunc _ready(): pass、在这个结构中,有两件事要做。第一,使proessing可用,第二,存储一些有用的值,这些值是场景和球拍的大小。pyth onexte nds Node2Dvar scree n_size var pad_sizefunc _ready(): scree n_size = get_viewport_rect().size pad_size =get_ no de(left).get_texture().get_size() set_process(true)然后,游戏中的一些变量:pyth onspeed of the ball (
35、i n pixels/sec ondOvar ball_speed = 80directi on of the ball (n ormal vector)var directi on = Vector2(-1,0)con sta nt for pad speed (also in pixels/sec ond)const PAD_SPEED = 150、最后是处理函数:得到有用的值以便做运算处理。 首先是球的位置(通过节点),第二个是球拍的矩形(Rect2)。精灵默认是以纹理中心为中心点的,所以需要使用size/2调整下:pythonvar ball_pos = get_ no de(ball).get_pos()var left_rect =
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026广东清远英德市中医院招聘事业编制专业技术人员12人考试参考试题及答案解析
- 2026河南郑州万安妇产医院招聘23人考试备考试题及答案解析
- 陕西西安蓝田县辋川镇大拇指幼儿园招聘幼儿教师1人考试备考题库及答案解析
- 2026北京大学教育学院教学科研岗位招聘笔试参考题库及答案解析
- 2026杭州市余杭区文化和广电旅游体育局下属事业单位编外招聘5人考试参考题库及答案解析
- 公安部部分直属事业单位2026年度公开招聘【南昌有岗】考试参考题库及答案解析
- 2026四川凉山州喜德县教育体育和科学技术局面向全省考调教师5人考试参考试题及答案解析
- 2026年黄冈红安县事业单位引进专业人才25人考试备考题库及答案解析
- 2026福建福州市会展服务有限公司招聘2人考试备考试题及答案解析
- 2026年台州天台县医疗卫生事业单位公开招聘卫技人员33人笔试备考试题及答案解析
- 2026年及未来5年市场数据中国洗衣店行业市场调查研究及投资潜力预测报告
- 公交驾驶员文明培训课件
- 2026年1月浙江省高考首考英语试卷真题完整版(含答案+听力)
- 低钾血症诊疗指南(2025年版)
- 林业项目监理工作总结与报告
- 培训机构课程营销方案设计
- 制冷基础知识课件
- 森林防火区划定管理规范
- 伤口的评估与测量
- 文书模板-职工退休社会化管理告知书
- 2025年《教育管理》知识考试题库及答案解析
评论
0/150
提交评论