3D建模

A collection of 1736 posts
3D建模

Cocos2d-x:进阶话题

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 进阶话题 注册事件监听 当我们需求多个节点对象有相同的事件响应时,可以创建一个事件监听器,然后通过 eventDispatcher,将其注册到多个对象。 以我们之前提到的触摸事件监听器为例: // Add listener _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, sprite1); 需要注意的是,在添加到多个对象时,需要使用 clone() 方法。 // Add listener _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1, sprite1); // Add the same listener to multiple objects. _eventDispatcher->addEventListenerWithSceneGraphPriority(listener1->clone(), sprite
1 min read
3D建模

Cocos2d-x:自定义事件

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 自定义事件 上述提到的事件都是系统内置的,如触摸事件,键盘事件等。此外,你可以制作自定义事件,这些事件不是由系统控制触发的,而是通过代码手动触发。 创建自定义事件监听器: _listener = EventListenerCustom::create("game_custom_event1", [=](EventCustom* event){ std::string str("Custom event 1 received, "); char* buf = static_cast(event->getUserData()); str += buf; str += " times"; statusLabel->setString(str.c_str()); }); _eventDispatcher->addEventListenerWithSceneGraphPriority(_listener, this); 上面制作了一个自定义事件监
1 min read
3D建模

Cocos2d-x:鼠标事件

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 鼠标事件 就像前几节介绍的那样,Cocos2d-x 支持响应鼠标事件 创建鼠标事件监听器: _mouseListener = EventListenerMouse::create(); _mouseListener->onMouseMove = CC_CALLBACK_1(MouseTest::onMouseMove, this); _mouseListener->onMouseUp = CC_CALLBACK_1(MouseTest::onMouseUp, this); _mouseListener->onMouseDown = CC_CALLBACK_1(MouseTest::onMouseDown, this); _mouseListener->onMouseScroll = CC_CALLBACK_1(MouseTest::onMouseScroll, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(_mo
1 min read
3D建模

Cocos2d-x:加速度传感器事件

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 加速度传感器事件 现在一些移动设备配备有加速度传感器,我们可以通过监听它的事件获取各方向的加速度。 可以设想要完成一个游戏情景:通过来回移动手机,平衡小球在手机中的位置。这种场景的完成,就需要监听加速度传感器事件。 使用加速度传感器,需要先启用 Device::setAccelerometerEnabled(true); 创建加速度传感器监听器: // creating an accelerometer event auto listener = EventListenerAcceleration::create(CC_CALLBACK_2( AccelerometerTest::onAcceleration, this)); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); // Implementation of the accelerometer callback function
1 min read
3D建模

Cocos2d-x:键盘事件

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 键盘事件 对于桌面游戏,一般需要通过键盘做一些游戏内的控制,这时你就需要监听键盘事件。Cocos2d-x 支持键盘事件,就像上节介绍的触摸事件一样。 创建键盘事件监听器: // creating a keyboard event listener auto listener = EventListenerKeyboard::create(); listener->onKeyPressed = CC_CALLBACK_2(KeyboardTest::onKeyPressed, this); listener->onKeyReleased = CC_CALLBACK_2(KeyboardTest::onKeyReleased, this); _eventDispatcher->addEventListenerWithSceneGraphPriority(listener, this); // Implementation of the keyboard event callback functi
1 min read
3D建模

Cocos2d-x:触摸事件

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 触摸事件 触摸事件是手机游戏中最重要的事件,它易于创建,还能提供多种多样的功能。 让我们先了解一下什么是触摸事件,当你触摸移动设备的屏幕时,设备感受到被触摸,了解到被触摸的位置,同时取得触摸到的内容,然后你的触摸被回答。 这就是触摸事件。 如果你希望通过触摸控制屏幕下层的对象,那可以通过 优先级,达成这种需求,优先级高的对象能先处理事件。 创建触摸事件监听器: // Create a "one by one" touch event listener // (processes one touch at a time) auto listener1 = EventListenerTouchOneByOne::create(); // trigger when you push down listener1->onTouchBegan = [](Touch* touch, Event* event)
1 min read
3D建模

Cocos2d-x:优先级

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 优先级 事件的吞没中,我们提到了事件的传递。事件如何传递,先到哪个监听器?这是由优先级决定的。 固定值优先级 使用一个整形的数值,数值较低的监听器比数值较高的监听器,先接收到事件。 场景图优先级 是指向节点对象的指针,z-order 较高的节点中的监听器比 z-order 较低的节点中的,先接收到事件。由于 z-order 较高的节点在顶部绘制,所以使用这种优先级可以确保触摸事件被正确响应 还记得这个场景图吗?图像绘制时,是按照 A, B, C, D, E, F, G, H, I 的顺序。 当使用 场景图优先级 时,事件是按照绘制的反方向,即 I, H, G, F, E, D, C,
2 min read
3D建模

Cocos2d-x:监听器

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 监听器 五种类型 * EventListenerTouch - 响应触摸事件 * EventListenerKeyboard - 响应键盘事件 * EventListenerAcceleration - 响应加速度事件 * EventListenMouse - 响应鼠标事件 * EventListenerCustom - 响应自定义事件 事件的吞没 当你有一个监听器,已经接收到了期望的事件,这时事件应该被吞没。事件被吞没,意味着在事件的传递过程中,你消耗了此事件,事件不再向下传递。避免了下游的其它监听器获取到此事件。 设置吞没: // When "swallow touches" is true, then returning 'true' from the // onTouchBegan method will "swallow" the touch event, preventing // other
1 min read
3D建模

Cocos2d-x:视差滚动

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 视差滚动 视差滚动是指让多层背景以不同的速度移动,从而形成的立体运动效果。比如超级马里奥游戏中,角色所在地面的移动与背景天空的移动,就是一个视差滚动。Cocos2d-x 通过 ParallaxNode 对象模拟视差滚动。可以通过序列控制移动,也可以通过监听鼠标,触摸,加速度计,键盘等事件控制移动。ParallaxNode 对象比常规节点对象复杂一些,因为为了呈现不同的移动速度,需要多个子节点。它类似 Menu 像一个容器,本身不移动,移动的是被添加进入其中的不同子节点。ParallaxNode 的创建: // create ParallaxNode auto paraNode = ParallaxNode::create(); 添加多个节点对象: // create ParallaxNode auto paraNode = ParallaxNode::create(); // background image is moved at a ratio
2 min read
Cocos2d-x:粒子系统
3D建模

Cocos2d-x:粒子系统

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 粒子系统 粒子系统是指计算机图形学中模拟特定现象的技术,它在模仿自然现象、物理现象及空间扭曲上具备得天独厚的优势,能为我们实现一些真实自然而又带有随机性的效果(如爆炸、烟花、水流)提供了方便。Cocos2d-x引擎中就为我们提供了强大的粒子系统。 下面是使用粒子系统完成的两个粒子特效: 创建粒子特效的工具 尽管你能手动创建粒子特效,按照喜好确定每个属性,但是使用工具往往更方便高效。下面介绍几个第三方工具: 1. Particle Designer:Mac 上一款非常强大的粒子特效编辑器 2. V-play particle editor:一款跨平台的粒子特效编辑器 3. Particle2dx:一款 Web 粒子特效编辑器,打开网页即可进行设计 使用这些工具完成粒子特效的设计,最终会导出一个 .plist 文件,Cocos2d-x 通过使用这种文件,就能把粒子特效添加到场景中,添加方法和操作一个普通的节点类型一样。 创建方法: // create by plist file a
3 min read
Cocos2d-x:瓦片地图
3D建模

Cocos2d-x:瓦片地图

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 瓦片地图 在游戏开发过程中,我们会遇到超过屏幕大小的地图,例如在即时战略游戏中,它使得玩家可以在地图中滚动游戏画面。这类游戏通常会有丰富的背景元素,如果直接使用背景图切换的方式,需要为每个不同的场景准备一张背景图,而且每个背景图都不小,这样会造成资源浪费。 瓦片地图就是为了解决这问题而产生的。一张大的世界地图或者背景图可以由几种地形来表示,每种地形对应一张小的的图片,我们称这些小的地形图片为瓦片。把这些瓦片拼接在一起,一个完整的地图就组合出来了,这就是瓦片地图的原理。 在 Cocos2d-x 中,瓦片地图实现的是 TileMap 方案,TileMap 要求每个瓦片占据地图上一个四边形或六边形的区域。把不同的瓦片拼接在一起,就可以组成完整的地图。TileMap 使用一种基于 XML 的 TMX 格式文件。 使用 TMX 文件创建一个瓦片地图: // reading in a tiled map. auto map = TMXTiledMap::create("TileMap.
3 min read
3D建模

Cocos2d-x:文本框(TextField)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 文本框(TextField) 如果你想让参与游戏的玩家可以自定义一个昵称怎么办,在哪里输入文本?Cocos2d-x 提供 TextField 满足这种需求。它支持触摸事件,焦点,定位内容百分比等。 创建一个文本框: #include "ui/CocosGUI.h" auto textField = TextField::create("","Arial",30); textField->addTouchEventListener([&](Ref* sender, Widget::TouchEventType type){ std::cout << "editing a TextField" << std::endl; }); this->addChild(textField); 这个例子中,创建了一个 TextField,指定了回调函数。 提供的文本框对象,是多功能的,能满足所有的输入需求,
2 min read
3D建模

Cocos2d-x:滑动条(Slider)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 滑动条(Slider) 有时候你想平滑的改变一个值,比如游戏设置中,调整背景音乐的音量,或着你有一个角色,允许用户设置攻击敌人的力量。这种场景最适合使用滑动条,Cocos2d-x 提供 Slider 对象支持滑动条。 创建滑动条: #include "ui/CocosGUI.h" auto slider = Slider::create(); slider->loadBarTexture("Slider_Back.png"); // what the slider looks like slider->loadSlidBallTextures("SliderNode_Normal.png", "SliderNode_Press.png", "SliderNode_Disable.png"); slider->loadProgressBarTexture("Slider_PressBar.
2 min read
3D建模

Cocos2d-x:进度条(LoadingBar)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 进度条(LoadingBar) 如果你经常玩游戏,那肯定见过一个情景:屏幕上显示了一个进度条,提示资源正在加载中,这个条表示资源加载的进度。Cocos2d-x 提供 LoadingBar 对象支持进度条。 创建一个进度条: #include "ui/CocosGUI.h" auto loadingBar = LoadingBar::create("LoadingBarFile.png"); // set the direction of the loading bars progress loadingBar->setDirection(LoadingBar::Direction::RIGHT); this->addChild(loadingBar); 上面的例子,我们创建了一个进度条,设置了当进度增加时,进度条向右填充。 在进度的控制中,你肯定需要改变进度条的进度. 示例: #include
1 min read
3D建模

Cocos2d-x:复选框(CheckBox)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 复选框(CheckBox) 日常生活中复选框很常见,比如填写问卷时,让我们选一些喜欢的项目,游戏设置中,某一设置是打开还是关闭。只有两种状态的项目经常被设计为复选框。Cocos2d-x 提供 Checkbox 对象支持复选框功能。 创建一个复选框: #include "ui/CocosGUI.h" auto checkbox = CheckBox::create("check_box_normal.png", "check_box_normal_press.png", "check_box_active.png", "check_box_normal_disable.png", "check_box_active_disable.pn
2 min read
3D建模

Cocos2d-x:按钮(Button)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 按钮(Button) 按钮是什么,好像没有必要解释,我们都知道这东西是用来点击的,点击后使我们的游戏产生一些变化,比如更改了场景,触发了动作等等。按钮会拦截点击事件,事件触发时调用事先定义好的回调函数。按钮有一个正常状态,一个选择状态,还有一个不可点击状态,按钮的外观可以根据这三个状态而改变。Cocos2d-x 提供 Button 对象支持按钮功能,创建一个按钮并定义一个回调函数很简单,记得在操作的时候要有头文件包含: #include "ui/CocosGUI.h"。 auto button = Button::create("normal_image.png", "selected_image.png", "disabled_image.png"); button->setTitleText("Button Text"); button->addTouchEventListener([&](Ref* sender, Widget:
2 min read
3D建模

Cocos2d-x:菜单(Menu)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 菜单(Menu) 菜单是什么,我们肯定都很熟悉了,在每个游戏中都会有菜单。我们使用菜单浏览游戏选项,更改游戏设置。菜单通常包含开始,退出,设置,关于等项,菜单当然也可以包含子菜单。在 Cocos2d-x 提供 Menu 对象支持菜单功能,Menu 对象是一种特殊的 Node 对象。 创建一个菜单用于添加菜单项: auto myMenu = Menu::create(); 像我们刚才提到的一个菜单,总会有一些菜单项,比如开始,退出,设置等,没有菜单项的菜单没有存在的意义。Cocos2d-x 提供了一些方法来创建菜单项,比如使用 Label 对象,或是使用一张图像。菜单项一般有正常状态和选择状态。菜单项显示时是正常状态,当你点击它时变为选择状态,同时点击菜单还会触发一个回调函数。 使用图像创建菜单: // creating a menu
2 min read
3D建模

Cocos2d-x:标签(Label)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 标签(Label) Cocos2d-x 提供 Label 对象给用户,可以使用位图字体,TrueType 字体,系统字体创建标签。这个单一的类能处理你所有的标签需求。下面介绍使用各种字体,创建标签的方法。 BMFont BMFont 是一个使用位图字体创建的标签类型,位图字体中的字符由点阵组成。使用这种字体标签性能非常好,但是不适合缩放。由于点阵的原因,缩放会导致失真。标签中的每一个字符都是一个单独的 Sprite,也就是说精灵的属性(旋转,缩放,着色等)控制都适用于这里的每个字符。 创建 BMFont 标签需要两个文件:.fnt 文件和 .png 文件。可以使用像 Glyph Designer 这样的工具来创建位图字体,这些文件将会自动生成。 使用位图字体创建标签: auto myLabel = Label::createWithBMFont("bitmapRed.
4 min read
3D建模

Cocos2d-x:场景切换

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 场景切换 开始一个新游戏,改变关卡,或结束游戏时,为了给用户不同的效果呈现,大多需要切换不同的场景。Cocos2d-x 提供了一系列方式去做这件事情 场景切换。 场景切换的方式 有很多场景切换的方式,每种都有特定的方法,让我们来看看: auto myScene = Scene::create(); runWithScene() 用于开始游戏,加载第一个场景。只用于第一个场景! Director::getInstance()->runWithScene(myScene); replaceScene() 使用传入的场景替换当前场景来切换画面,当前场景被释放。这是切换场景时最常用的方法。 Director::getInstance()->replaceScene(myScene); pushScene() 将当前运行中的场景暂停并压入到场景栈中,再将传入的场景设置为当前运行场景。只有存在正在运行的场景时才能调用该方法。 Director::getInstance()->pushS
2 min read
3D建模

Cocos2d-x:场景创建

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 场景创建 创建一个场景非常简单: auto myScene = Scene::create(); 还记得场景图吗 第二章中我们学到了 场景图(Scene Graph) 以及在游戏中它是如何生效的。要记得场景图决定了场景内节点对象的渲染顺序,也要记得 z-order 是如何影响场景图的。 渲染时 z-order 值大的节点对象会后绘制,值小的节点对象先绘制 一个简单场景 让我们构建一个简单的场景,来学习场景的使用。记得 Cocos2d-x 用右手坐标系,也就是说坐标原点(0,0)在展示区的左下角,当你在场景里放置一些节点对象设置坐标位置时,注意左下角是坐标计算的起点。 auto dirs = Director::getInstance(); Size visibleSize = dirs->getVisibleSize(); auto myScene = Scene::create(); auto label1
1 min read
3D建模

Cocos2d-x:动作的克隆

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 动作的克隆 克隆(Clone) 的功能和字面含义一样,如果你对一个节点对象使用了 clone() 方法,你就获得了这个节点对象的拷贝。 为什么要使用 clone() 方法? 因为当 Action 对象运行时会产生一个内部状态,记录着节点属性的改变。当你想将一个创建的动作,重复使用到不同的节点对象时,如果不用 clone() 方法,就无法确定这个动作的属性到底是怎样的(因为被使用过,产生了内部状态),这会造成难以预料的结果。 我们来看示例,假如你有一个坐标位置是 (0,0) 的 heroSprite,执行这样一个动作: MoveBy::create(10, Vec2(400,100)); 你的 heroSprite 就在 10s 的时间中,从 (0,0) 移动到了
4 min read
3D建模

Cocos2d-x:序列

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 序列 动作序列(Sequence) 是一种封装多个动作的对象,当这个对象执行时被封装的动作会顺序执行。 一个 Sequence 可以包含任何数量的动作对象,回调方法和其它序列。可以包含回调方法? 没错! Cocos2d-x 允许把一个方法添加进去 CallFunc 对象,然后将 CallFunc 添加到 Sequence,这样,在执行序列的时候就能触发方法调用。因此,你能在一个序列中添加一些个性化的功能,而不仅仅是添加 Cocos2d-x 提供的有限动作。下面是一个序列的动作执行示意图: Sequence 示例 auto mySprite = Sprite::create("mysprite.png"); // create a few actions. auto jump = JumpBy::create(0.5, Vec2(
3 min read
3D建模

Cocos2d-x:基本动作

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 基本动作 基本动作通常都是单一的动作,用来完成一个简单的目标。下面通过简单的示例来介绍常见的基本动作。 移动 使用 MoveTo MoveBy 完成节点对象在一个设置的时间后移动。 auto mySprite = Sprite::create("mysprite.png"); // Move a sprite to a specific location over 2 seconds. auto moveTo = MoveTo::create(2, Vec2(50, 0)); mySprite->runAction(moveTo); // Move a sprite 50 pixels to the right, and 0
5 min read
3D建模

Cocos2d-x:动作(Action)

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 动作(Action) 动作(Action) 的功能就和字面含义一样,它通过改变一个 Node 对象的属性,让它表现出某种动作。动作对象能实时的改变 Node 的属性,任何一个对象只要它是 Node 的子类都能被改变。比如,你能通过动作对象把一个精灵从一个位置移动到另一个位置。 通过 MoveTo 和 MoveBy 方法: // Move sprite to position 50,10 in 2 seconds. auto moveTo = MoveTo::create(2, Vec2(50, 10)); mySprite1->runAction(moveTo); // Move sprite 20 points
2 min read
3D建模

Cocos2d-x:多边形精灵

推荐:将NSDT场景编辑器加入你的3D工具链 3D工具集:NSDT简石数字孪生 多边形精灵 多边形精灵(Polygon Sprite) 也是一个精灵,同样是为了展示一个可以被控制的图像,但是和普通精灵的区别是,普通精灵在绘图处理中被分为了两个三角形,多边形精灵则是被分为了一系列三角形。 为什么要使用多边形精灵 提高性能! 要深入分析这个是如何提高性能的,会需要很多和像素填充率有关的技术术语。幸好本节是入门性质的文档,能让大家理解多边形精灵比普通精灵性能好就可以了,不用讨论特定宽高矩形绘制时的性能问题。 注意左右两种情况的不同。 左侧,是一个典型的精灵绘制时的处理,精灵被处理成一个有两个三角形组成的矩形。 右侧,是一个多边形精灵绘制时的处理,精灵被处理成一系列小的三角形。 显然可以看到,右侧多边形精灵需要绘制的像素数量比左侧精灵需要的像素数量更小,但是由于划分了多个三角形出现了更多的顶点,由于在现代的图形处理中,一般绘制定点比绘制像素消耗的性能少。所以多边形精灵的性能更好,实际的测试结果也验证了这一点。 AutoPolygon AutoPolygon 是一个
2 min read
NSDT场景编辑器 | NSDT 数字孪生 | GLTF在线编辑器 | 3D模型在线转换 | UnrealSynth虚幻合成数据生成器 | 3D模型自动纹理化工具
2023 power by nsdt©鄂ICP备2023000829号