【年货模板源码】【node 源码分析】【欢乐竞猜源码】节点精灵函数库源码_节点精灵函数库源码是什么

时间:2024-11-17 04:22:49 分类:源码社区菠菜源码 来源:虚拟idc主机源码

1.Godot入门和2D项目(1)
2.cocos texturecache和spriteframe的区别

节点精灵函数库源码_节点精灵函数库源码是节点精灵什么

Godot入门和2D项目(1)

       节点是创建游戏的基本构建块,任何节点始终具有以下属性。函数

       场景是库源一组树状节点,游戏必须有一个主场景(Main Scene),码节场景保存后才能运行。点精一个项目可以具有多个场景,灵函年货模板源码有助于组织项目的数库不同组件。

       场景可以被实例化到另一个场景中,源码作为子节点。节点精灵选择A场景的函数根节点,点击链接按钮,库源选择B场景文件,码节B场景文件即可实例化,点精作为A场景的灵函子节点(可以有多个)。此时选择B场景修改属性,数库A场景中的B的实例都会进行变化。如果选择B的某个实例修改,需要将此实例“转为独立子资源”,则只影响该实例。

       项目根目录是res\://,文件只能被保存在项目内部,场景保存后后缀是*.tscn。F1访问2D工作区,F2访问3D工作区,node 源码分析F5常规播放,F6运行。

       设置存放在project.godot文件中的win.ini文本文件里。godot使用GDScript作为官方脚本语言,右键点击节点选择Attach Script来附加脚本,脚本会继承该节点的类型。GDScript文件代表了类,所以不能编辑类名。

       _ready()函数在节点及其所有子节点进入活动场景时候被调用,构造器是 _init()。处理信号:信号主要用于GUI节点(即图形用户界面),也可以在脚本中定义自定义信号。第一步是将信号连接到自定义函数,第二部是定义自定义功能。

       节点可以根据需要添加到任意多个分组(group),如玩家被敌人发现触发警报可以用。节点发出其他节点可以监听和响应的消息,与其持续检查按钮是否被按下, 不如在按下按钮时发出信号,信号是一种使对象解耦的方法,有点像winform的事件。

       计时器示例:使用一个Timer节点,创建场景如下:Node2D将Timer的timeout()信号连接到根节点目标节点必须附加一个脚本!,欢乐竞猜源码默认情况下系统会创建类似:on\_\ 的函数来处理信号,为该处理方法增加实现。如果是实时生成的节点,无法使用编辑器连接,则可以在 _ready()函数中添加Node.connect()方法创建连接。

       自定义信号:发出信号使用emit_signal函数。

       2D项目实例笔记:只记录了自己关注的点,完整的内容参考文档: docs.godotengine.org/zh...

       设置窗口:本项目是竖屏模式,所以第一步需要调整游戏窗口的大小。

       完整的内容参考文档: docs.godotengine.org/zh...

       项目结构:项目包含了3个独立场景,Player,Mob,HUD。

       Player场景(玩家控制的角色):单独创建Player的好处是可以单独测试。1.根节点选择Other Node->Area2D,原因:Area2D可以检测:接触检测,区域进出检测,不可用于碰撞2D区域。2.在添加任何子节点之前选择节点,点击锁定右侧的按钮,保证对象的子节点不可选择。3.添加AnimatedSprite子节点(使用精灵控制显示),为Player添加一个AnimatedSprite节点作为子节点用来处理外观和动画。AnimatedSprite必须有一个SpriteFrames资源(精灵图),为其新建SpriteFrames,爱看源码5.5点击打开SpriteFrames面板开始设置精灵。Node2D的Transform属性的Scale值表示的缩放比例。4.添加CollisionShape2D子节点(碰撞盒),为Player添加CollisionShape2D子节点处理碰撞,在属性检查气的形状彭便新建CapsuleShape2D覆盖精灵。CapsuleShape2D:胶囊形状,因为图像的形状又两个触须,所以整体类似椭圆形,所以选择该形状。5.给Player增加移动。点击Player节点附加脚本,已经给Player设置了hit信号,用来在Player检测到碰撞的时候发出。Player节点的类型Area2D可以使用body_entered(body\:Node)信号来检测碰撞。

       Enemy场景(敌人):我们将创建一个Mob的怪物场景,以便独立实例化出任意数量的怪物。节点结构如下所示(同时设置子项不能被选中锁定子项)。1.设置RigidBody2D(Mob)的Gravity Scale属性设置为0,试其不能下坠Gravity:重力。2.设置精灵。和Player不同,我们为Enemy设置了3个动画,分别是afnetworking源码下载fly,swim,walk。属性种的Playing属性设置为On,表示一直播放。一个精灵使用了3种动画,竟然就可以用来表示3种类型的敌人,真是巧妙。设置大小。3.添加子节点CapsuleShape2D胶囊形状,并设置大小和方向与图像对齐。4.为Mob根节点附加脚本如下。5.启动时随机选择一个动画。6.让怪物超出屏幕时删除自己,所以要连接VisibilityNotifier2D节点的screen_exited()信号,添加代码。

       Main场景(主要场景):使用Main场景把Player和Mob结合起来。1.得到场景的节点结构如下。2.生成怪物。目标是怪物从屏幕边缘随机生成(给玩家反应时间)。为了定义边缘,添加一个Path2D类型的的子节点起名:MobPath。选择Path2D后在上方点击带加号的路径工具:3.附加脚本(Main场景)。为子节点Player的hit信号创建处理函数game_over。将每个Timer节点的timeout()信号连接到main脚本。为刷怪计时器的timeout创建处理:创建一个mob实例,沿着Path2D随机选择一个位置,然后让mob移动;而PathFollow2D节点会沿路径移动,所以会自动旋转,用它来选择怪物的方向和位置。使用add_child() 将新实例添加到场景。弧度数学概念:一周的弧度数为2πr/r=2π,°角=2π弧度,因此,1弧度约为.3°,即°'.'',1°为π/弧度,近似值为0.弧度,周角为2π弧度,平角(即°角)为π弧度,直角为π/2弧度。角度转弧度deg2rad(),弧度转角度rad2deg()。测试主场景Main:需要指定Main为主场景。

       HUD(系统显示界面UI):创建一个UI用于显示分数,游戏结束消息,重启按钮等界面,创建节点类型和名称结构如下。1.默认字体不能很好的缩放,切换字体为Xolonium-Regular.ttf。在Custom Fonts种选择 New DynamicFont。DynamicFont=动态字体,支持缩放 BitmapFont=点阵字体,对缩放的支持就没那么好。在DynamicFont的Font/Font Data下拉列表种选择Load,并选择字体文件,设置字体大小,并复制粘贴到其他Control节点的位置。标签和按钮都继承自Control,所以这里指的是标签和按钮都使用此字体。点击布局按钮,排列界面如下。2.附加脚本到HUD。将HUD场景连接到Main场景。完成HUD场景后保存返回Main场景,在Main场景种实例化HUD场景。在Main场景的节点中连接start_game信号到新创建的new_game函数。处理game_over()。处理计分器timeout事件。主场景改为Main.tscn。按分组删除:游戏结束后,Mob依然停留在屏幕上,最好在新游戏开始时清除。在Mob场景中,选择根节点,在Node选项卡中点击Groups,添加一个分组mobs,这样,所有的Mob都属于mobs组了。在Main的附加脚本中添加。

       背景:给Main添加一个ColorRect节点有色矩形,布局=整个矩形,来覆盖屏幕。如果是背景,可以使用TextureRect节点纹理矩形添加背景。音效:给Main添加AudioStreamPlayer子节点,一个作为背景音乐Music,一个作为死亡音效DeathSound。在new_game()中添加$Music.play(),在game_over()中添加$Music.stop()。另外在game_over()中添加\$DeathSound.play()。快捷键:使用快捷键触发button,可以修改Button节点的Shortcut属性,选择New Shortcut点击InputEventAction,输入ui_select即空格键。导出:导出方式取决于目标平台,所以需要根据平台修改项目内容。当前项目中我们使用键盘处理输入,PC端可以,但如果是手机或平板,需要支持触屏输入,需要将游戏转换为点击移动的方式。默认情况下触摸输入是模拟鼠标输入的,所以鼠标事件可以触发触摸操作,同时也能够在电脑上玩。在Projuct Settings中General->Input Devices->Pointing下,启用Emulate Touch From Mouse模拟鼠标触摸。General->Display->Window->Stretch->Mode=2d,Aspect=keep,设置为2D拉伸模式。General->Display->Orientation=portrait,游戏方向设置为纵向。主场景:Project -> Project Settings -> Application -> Run,Main Scene=主场景(Main.tscn)。导出模板从Steam下载Godot不需要再下载,否则需要再Manage Export Templates导出模板管理对话框下载(模板需要和Godot版本匹配)。导出预设Project -> Export,点击Add,创建新的导出预设。Export PCK/ZIP 仅创建项目数据的打包版本, 它不包含可执行文件。Export Project , 可以创建一个完整的游戏可执行版本, 如Android的 .apk 或Windows的 .exe。在 Resources 和 Features 选项卡中, 你可以自定义每个平台的游戏导出方式。导出平台从macOS导出macOS版本会得到.dmg和.app。从Linux和Windows导出macOS版本会获得.zip和.app。Android:必须下载Android SDK,打开JDK,运行Android Studio,安装Android SDK Platform Tools,用于安装和设备通信的adb命令行工具,在命令行上创建调试密钥库,在godot中设置密钥,随后导出。IOS:必须有macOS并安装Xcode的电脑,登陆开发者账号,从Xcode构建项目。H5:直接导出(导出时选择是否包含debug框)。

cocos texturecache和spriteframe的区别

       1.介绍纹理缓存是将纹理缓存起来,之后的绘制工作就能减少内存。每一个缓存图像的大小,颜色和区域范围都是可以被修改的。这些信息都是存储在内存中,不用在每一次绘制的时候都发送给GPU。2.CCTextureCacheCocos2d通过调用CCTextureCache或者CCSpriteFrameCache来缓存精灵的纹理。当这个精灵调用CCTextureCache或CCSpriteFrameCache的方法的时候,cocos2dx将使用纹理缓存来创建一个CCSprite。所以你可以预先将纹理加载到缓存中,这样你在场景中使用的时候就非常方便了。怎么样加载这些纹理就看你自己的想法。例如,你可以选择异步加载方式,这样你就可以为loading场景增加一个进度条。当你创建一个精灵,你一般会使用CCSprite::create(pszFileName)。假如你去看CCSprite::create(pszFileName)的实现方式,你将看到它将这个图片增加到纹理缓存中去了:boolCCSprite::initWithFile(constchar*pszFilename){ CCAssert(pszFilename!=NULL,"Invalidfilenameforsprite");CCTexture2D*pTexture=CCTextureCache::sharedTextureCache()->addImage(pszFilename);if(pTexture){ CCRectrect=CCRectZero;rect.size=pTexture->getContentSize();returninitWithTexture(pTexture,rect);}//don'treleasehere.//whenloadtexturefailed,it'sbettertogeta"transparent"spritethenacrashedprogram//this->release();returnfalse;}上面代码显示一个单例在控制加载纹理。一旦这个纹理被加载了,在下一时刻就会返回之前加载的纹理引用,并且减少加载的时候瞬间增加的内存。(详细API请看CCTextureCacheAPI)3.CCSpriteFrameCacheCCSpriteFrameCache单例是所有精灵帧的缓存。使用spritesheet和与之相关的xml文件,我们可以加载很多的精灵帧到缓存中,那么之后我们就可以从这个缓存中创建精灵对象了。和这个xml相关的纹理集一般是一个很大的图片,里面包含了很多小的纹理。下面就是一个纹理集的例子:有三种方式来加载纹理集到CCSpriteFrameCache中:(1)加载一个xml(plist)文件(2)加载一个xml(plist)文件和一个纹理集(3)通过CCSpriteFrame和一个精灵帧的名字具体完整API请看CCSpriteFrameCacheAPI。样例:CCSpriteFrameCache*cache=CCSpriteFrameCache::sharedSpriteFrameCache();cache->addSpriteFramesWithFile(“hello.plist”,“hello.png”);使用缓存的原因就是减少内存,因为当你使用一个图片创建一个精灵的时候,如果这个图片不在缓存中,那么就会将他加载到缓存中,当你需要用相同的图片来新建精灵的时候,就可以直接从缓存中取得,而不用再去新分配一份内存空间。4.CCSpriteFrameCache对比CCSpriteBachNode(1)最好是尽可能的使用spritesheets(CCSpriteBatchNodes)。这样的方式是减少draw的调用次数。Draw的调用是非常耗时的。每一个batchnode调用一次draw就可以绘制上面所有的节点,而不是每一个节点的draw都单独调用一次,(2)CCSpriteBatchNode渲染所有的子节点只需要一次,只需要调用一次draw。那就是为什么你需要把精灵加载batchnode的原因,因为可以统一一起渲染。但是只有这个精灵使用的纹理包含在batchnode中的才可以添加到batchnode上,因为batchnode一次只渲染这相同的纹理集。(3)假如你把精灵添加到其他的节点上。那么每一个精灵就会调用自己的draw函数,batchnode就没起作用了。(4)CCSpriteBatchNode也是一个常用节点。你可以从场景中像其他节点一样移除掉。纹理集和精灵帧都被缓存在CCTextureCache和CCSpriteFrameCache单例中。假如你想要从内存中移除纹理集和精灵帧,那么你不得不通过缓存类来完成这个工作。转载