- cocos creator
- 参见官方文档,目前有大量小型公司在使用cocos creator 进行游戏开发,这个对于非编程人员来说,确实更容易,开发效率也更高,并且对于团队来说,设计和开发分工也更容易,但是代码量基本不会少。但是对于开发来说,使用cocos2d-js更符合开发人员的习惯。对于cocos2d-x建议使用xcode/clion,对于cocos2d-js,建议使用webstorm。
- cocos基本操作Mac
- cocos在cocos2d-x的tools/cocos2d-console/bin/ 目录下
- 创建新项目: cocos new -p com.xxx -d . -l js Game 目前支持的语言有js cpp lua;注意包名不要乱写,否则有可能在android上运行不了,要符合java的包名命名规范
- 运行: cocos run -p web 目前支持的平台有web android ios mac,如果运行android,需要先安装android studio(android sdk),以及ndk,ndk需要单独安装,并且配置环境变量,实际编译时会有明显的报错提示
- android studio 打开只需要使用android studio 打开framework/runtime-src/proj.android即可,包括真机USB调试和虚拟机调试
- 华为手机进行调试
- 设置->系统->关于手机,在版本号上连点4下,有的是7下,打开“开发人员选项”;
- 设置->系统->开发人员选项,开启USB调试;
- 连接USB(type-c也是USB的一种),在拨号键盘输入 *#*#2846579#*#*,选择后台设置->USB端口设置,选择生产模式;
- 如果是第一次使用,需要再次到达设置->系统->开发人员选项,会看到一个对话框(对话框不会弹出,只有在这个页面能看到),选择允许授权。
经过以上步骤,运行cocos run -p android就能愉快的安装到手机上了。与此同时,点击android studio的运行按钮,也能看到多了一个物理设备。
- 生成一个keystore
- keytool -genkey -alias android.keystore -keyalg RSA -validity 20000 -keystore android.keystore
以上配置好之后,就可以愉快的进行开发了
-------------------------------------------------------------------------------------------------------------------------------------------------------
- cocos添加逻辑的三个时机
- 节点自动的回调,例如init/onEnter/onExit;
- 调度器,例如scheduleUpdate/schedule/scheduleOnce等
- 事件触发
- cocos Node的基本属性和操作
- 位置,_position和_normalizedPosition,cocos并没有在修改其一的时候一起更新另外一个,而是设置一个标志位_usingNormalizedPosition来区分是使用哪种位置数据,这可以再CCNode.cpp的实现中看到setPostion和setPositionNormalized。对齐方式对于Sprite是以中心点作为对齐,但是Layer等其他node是以左下角来对齐。
- 旋转和倾斜:_rotationX, _rotationY, _skewX, _skewY
- 缩放:_scaleX, _scaleY,默认为1.0
- 锚点: 辅助位置摆放,缩放和旋转的点,单位是百分比,默认是(0.5,0.5),调用ignoreAnchorPointForPostion可以忽略锚点,将锚点视为0来处理
- ZOrder: _localZOrder, _globalZOrder
- 尺寸:Node默认没有尺寸,但是可以通过_contentSize来设置
- 延迟计算:每次对Node属性的修改,数值是立即生效的,但是并不立即更新显示,而是更新一个dirty标志位,在下次显示时visit中做一次更新
- 使用Node的三种方式:1)直接使用,可以用来做容器;2)使用具有某种功能的Node,例如Sprite或者Label;3)继承Node;
- Node的常用方法:init, onEntrer, onExit, update,重写这些方法时,务必调用父类方法
- Action: 一个Action只能被一个Node执行,如果需要多个Node执行,则需要复制
- Cocos2d-x内存管理
- retain(引用计数+1), release(引用计数-1,当计数为0时,释放对象), autorelease(引用计数+1,切换到下一帧时-1。添加到自动释放池管理,每次主循环结束后进行检查), 构造函数将计数置为1。3.0之前的版本是放在CCObject,之后的版本是放在Ref中。
- 场景和层
- Scene之间是互斥关系,不能同时显示。Scene要比Layer高一级。
- 场景切换:runWithScene/pushScene(当场景切回时,所有的节点的状态保持原状)/popScene/replaceScene
- Sprite:
- Action
- 多次调用runAction,会同步执行
- 一个Action对象只能被执行一次
- 只有对象被挂载到场景中时才会被执行
- stopAction停止动作执行
- ActionInstant: Show/Hide/FlipX/FlipY/Place/ToggleVisibility
- ActionInterval: RotateTo/RotateBy/MoveTo/MoveBy/SkewTo/SkewBy/JumpTo/JumpBy/BezierTo/BezierBy/ScaleTo/ScaleBy/Blink/FadeIn/FadeOut/FadeTo/TintTo/TintBy
- 组合:Sequence/Repeat/RepeatForever/Spawn/Reverse.使用组合,参数列表需要最后一个action为NULL
- 变速动作:Ease/EaseExponential/EaseSine/EaseElastic/EaseBounce/EaseBack(In/Out)
- 监听动作的开始和结束,可以加入一个CallFunc作为动作(假动作,😑)。
- Audio 背景音乐和音效的区别:
- 音效可以同时播放多个,因此有返回值,需要停止的时候需要指明需要停止哪一个。
#include "audio/include/SimpleAudioEngine.h"
CocosDenshion::SimpleAudioEngine *audio = CocosDenshion::SimpleAudioEngine::getInstance();
audio->playBackgroundMusic("res/1.mp3");
audio->playEffect("res/1.mp3");
- 坐标系
- open-GL坐标系,x向右,y向上为正;
- 世界坐标系,x向右,y向上为正,通常情况下和open-GL坐标系一致,这是一个绝对的坐标系;
- 节点坐标系,x向右,y向上为正,这是一个相对坐标系,是相对于父节点的位置;
- 屏幕坐标系,x向右,y向下为正。
- 事件
EventListenerTouchOneByOne *listener = EventListenerTouchOneByOne::create();
listener->onTouchBegan = [=](Touch *touch, Event *event) -> bool {
//Director::getInstance()->replaceScene(HelloWorld::createScene());
return true;
};
listener->onTouchEnded = [](Touch *, Event *) -> void {
//Director::getInstance()->replaceScene(HelloWorld::createScene());
};
Director::getInstance()->getEventDispatcher()->addEventListenerWithSceneGraphPriority(listener, cocos); //按照显示的层的顺序来确定事件接收顺序。
- 是否点击到某个对象需要自行判断
Node *target = event->getCurrentTarget();
Vec2 pos = target->convertToNodeSpace(touch->getLocation());
if (!Rect(0, 0, target->getContentSize().width, target->getContentSize().height).containsPoint(target->convertToNodeSpace(touch->getLocation()))) {
return false;
}
return true;
- ClippingNode
- ClippingNode有两个关键组件:child和stencil. child适用于显示的对象,stencil是遮罩。
ClippingNode *clipping = ClippingNode::create();
Sprite *mini_cocos = Sprite::create("HelloWorld.png");
mini_cocos->setScale(0.5);
clipping->addChild(LayerColor::create(Color4B(Color4F(1, 1, 1, 1)), 200, 150));
Sprite *stencil = Sprite::create("HelloWorld.png");
//stencil->setScale(0.3);
stencil->setPosition(50, 60);
clipping->setStencil(stencil);
clipping->setInverted(true);
gray->addChild(clipping, 2);