1.Godot入门和2D项目(1)
2.cocos texturecacheåspriteframeçåºå«
Godot入门和2D项目(1)
节点是创建游戏的基本构建块,任何节点始终具有以下属性。函数
场景是库源一组树状节点,游戏必须有一个主场景(Main Scene),码节场景保存后才能运行。点精一个项目可以具有多个场景,灵函spi java源码解析有助于组织项目的数库不同组件。
场景可以被实例化到另一个场景中,源码作为子节点。节点精灵选择A场景的函数根节点,点击链接按钮,库源选择B场景文件,码节B场景文件即可实例化,点精作为A场景的灵函子节点(可以有多个)。此时选择B场景修改属性,数库A场景中的B的实例都会进行变化。如果选择B的某个实例修改,需要将此实例“转为独立子资源”,则只影响该实例。
项目根目录是res\://,文件只能被保存在项目内部,场景保存后后缀是*.tscn。F1访问2D工作区,F2访问3D工作区,验证后台源码F5常规播放,F6运行。
设置存放在project.godot文件中的win.ini文本文件里。godot使用GDScript作为官方脚本语言,右键点击节点选择Attach Script来附加脚本,脚本会继承该节点的类型。GDScript文件代表了类,所以不能编辑类名。
_ready()函数在节点及其所有子节点进入活动场景时候被调用,构造器是 _init()。处理信号:信号主要用于GUI节点(即图形用户界面),也可以在脚本中定义自定义信号。第一步是将信号连接到自定义函数,第二部是定义自定义功能。
节点可以根据需要添加到任意多个分组(group),如玩家被敌人发现触发警报可以用。节点发出其他节点可以监听和响应的消息,与其持续检查按钮是否被按下, 不如在按下按钮时发出信号,信号是一种使对象解耦的方法,有点像winform的事件。
计时器示例:使用一个Timer节点,创建场景如下:Node2D将Timer的timeout()信号连接到根节点目标节点必须附加一个脚本!,传奇ei源码默认情况下系统会创建类似: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,量神源码点击打开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个动画,分别是android源码gfwfly,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åä¾ä¸ãåå¦ä½ æ³è¦ä»å åä¸ç§»é¤çº¹çéåç²¾çµå¸§ï¼é£ä¹ä½ ä¸å¾ä¸éè¿ç¼åç±»æ¥å®æè¿ä¸ªå·¥ä½ã转载