精华内容
下载资源
问答
  • Quick-Cocos2d-x 为开发者提供了xxtea加密算法,用来对脚本文件及资源进行加密,加密对象大体分为如下几种: 1. 对脚本/资源文件本身加密 2. 将脚本/资源文件压缩成zip,对zip进行加密 3. 对脚本/资源文件加密后...

    如果开发者不想让游戏中的资源或脚本文件轻易的暴露给其他人,一般会采用对文件进行加密的方式来保护文件或资源被盗用。Quick-Cocos2d-x 为开发者提供了xxtea加密算法,用来对脚本文件及资源进行加密,加密对象大体分为如下几种:

    1. 对脚本/资源文件本身加密

    2. 将脚本/资源文件压缩成zip,对zip进行加密

    3. 对脚本/资源文件加密后,再将其压缩后的zip再次加密

    首先来演示对脚本文件的加密

    1. 创建一个新工程,名为quicktest。

    通过控制台进入到该工程目录下,例:

    cd /Users/Helloworld/Desktop/quick-cocos2d-x-2.2.5/bin/quicktest

    2. 执行 compile_scripts.sh脚本(位于quick-cocos2d-x-2.2.5/bin文件夹下。windows下执行.bat),执行时需要输入若干个参数,这里简单介绍一下各个参数的功能(也可以直接查看对应的php脚本文件或输入-h查看帮助):

    • -h 帮助

    • -i  源文件目录

    • -o 输出文件目录/输出文件名

    • -p 包前缀名字

    • -x  不包含的包,即当前目录下的哪些包不希望被添加进去

    • -m 编译模式,包含两种,一种是默认的打包成zip,另外一种是不打包直接生成一个个的文件

    • -e 加密模式,包含两种,xxtea_chunk是对文件本身进行加密,xxtea_zip是对打包后的zip进行加密

    • -ek 加密秘钥

    • -es 加密签名

    • -ex 加密文件的后缀名,默认是lua

    • -c 从一个文件加载参数列表

    • -q 生成过程不输出信息

     

    例:

    /Users/Helloworld/Desktop/quick-cocos2d-x-2.2.5/bin/compile_scripts.sh -i scripts -o res/game.zip -e xxtea_zip -ek MYKEY -es XT

    上面这段代码的作用,是将 scripts 文件夹中的脚本文件压缩,并存放到res目录下,压缩后的文件名为game.zip,加密方式采用的是对zip压缩包进行加密,如果采用文本方式加密则-e 后应该写 xxtea_chunks。秘钥和签名将会在代码中使用。操作完整截图如下:

    下面打开quick-cocos2d-x/bin/quicktest/res ,可以看到里面有两个压缩包,其中framework_precompiled.zip是引擎自带的,而另外一个则是我们刚刚生成的,双击game.zip之后你会发现解压出来的是一个game.zip.cpgz的文件,然后双击这个.cpgz的文件之后又会生成game.zip文件,原因是这个zip已经被加密,所以无法识别了。如果这里采用的是脚本加密的方式或不加密的方式则可以正常解压。

     

    之后在引擎中使用加密后的脚本文件时,只需将AppDelegate.cpp中原本执行脚本文件的那段代码替换为如下代码:

    pStack->setXXTEAKeyAndSign("MYKEY", 5, "XT", 2);
    pStack->loadChunksFromZIP("res/game.zip");
    pStack->executeString("require 'main'");

    其中第一行代码中的5和2代表的是字符串"MYKEY"和"XT"的字符个数为5和2。

     

    脚本加密的方式大体如上文所述,至于资源加密的方法与脚本加密类似,在进入quicktest目录下之后执行pack_files.sh脚本(win执行pack_files.bat)。输入-h查看帮助

    第一个样例,是将res中的资源文件进行加密,加密后的文件存放到resnew文件夹中;第二个是讲res中的资源打包成zip存放到game.zip,并未加密;第三个是存放到zip中后并对zip进行加密。还有另外一种方式就是两种方法结合使用,将资源加密后存放到某一文件夹,之后再重新执行一次脚本将这些加密后的文件打包成zip再加密。

    之后还需要在AppDelegate.cpp中加一段代码:

    pStack->setXXTEAKeyAndSign("XXTEA", 5,"tsts",4);

    如果将资源压缩成了zip包,还需再加一行代码:

    pStack->loadChunksFromZip("picture.zip");

    如此便可以成功运行了,打包时在项目的资源中仅保留.zip即可,原本的资源及脚本直接删除其引用即可,源文件千万不要删掉。

    还有一点需要说明的是,该方法并非只能对Quick-x中的资源加密,比如,如果开发者使用的是Cocos2d-x 2.2.5的版本,但是却希望使用Quick-x中的加密方法对资源及脚本进行加密,这样也是可以的。加密的步骤与上述相同,但由于Cocos2d-x v2.2.5并没有相关的解密算法,所以需要修改若干文件方可正常使用,笔者修改后已测试成功,这里简单描述需要修改的内容。

     

    Quick-x 脚本及资源加解密方法修改文件(具体修改的地方对比一下就知道了)

    一、资源解密修改

    1.修改cocos2dx/platform/ios/CCImage.mm文件

    2.增加文件 apptools 到 extensions 文件夹

    3.给cocos2dx.xcodeproj添加header search path  : "$(SRCROOT)/../../extensions"

    (注:这里笔者将apptools添加到了extensions文件夹只是为了方便,其实添加到其它位置也并非不可以。这里面涉及到了一点问题,因为cocos2dx的库文件位于cocos2dx.xcodeproj工程中,而lua库位于另外一个工程,但这一点在quick-x中不一样,在quick-x中这两个库文件都位于同一个工程,所以它们之间引用不存在问题,但是在cocos2d-x 2.2.5中便存在了不同工程间的文件引用问题,所以笔者此处做了2,3步的修改)。

     

    二、脚本解密修改

    1.修改lua/cocos2dx_support/CCLuaStack.h  .cpp 文件

    2.增加 xxtea文件 目录 cocos2dx/support/xxtea.h  xxtea.c  

    3.增加 CCZipFile.h .cpp文件 目录 cocos2dx/platform/CCZipFile.h  .cpp  

    4.修改 unzip.h .cpp文件 目录cocos2dx/support/zip_support/unzip.h  .cpp 

    5.增加 loapi_mem.h .cpp文件 目录 cocos2dx/support/zip_support/loapi_mem.h .cpp 

     

    修改成功后,在Cocos2d-x v2.2.5中也可以使用该加密方法了。

    转载于:https://www.cnblogs.com/damowang/p/4940084.html

    展开全文
  • 在多个场景切换时候,场景的生命周期会更加复杂。这一节我们介绍一下场景切换生命周期。 多个场景切换时候分为几种情况: 情况1,使用pushScene函数从实现HelloWorld场景进入Setting场景。 情况2,使用...

    在多个场景切换时候,场景的生命周期会更加复杂。这一节我们介绍一下场景切换生命周期。

    多个场景切换时候分为几种情况:

    情况1,使用pushScene函数从实现HelloWorld场景进入Setting场景。

    情况2,使用replaceScene函数实现从HelloWorld场景进入Setting场景。

    情况3,使用popScene函数从实现Setting场景回到HelloWorld场景。

    我们参考HelloWorld重写Setting层的中几个生命周期函数,代码如下:

    bool Setting::init()
    {           
        if( !Layer::init() )
        {
             returnfalse;
        }
      
        log("Settinginit");
        ......
        returntrue;
    }
      
    void Setting::onEnter()
    {
        Layer::onEnter();
        log("SettingonEnter");
    }
      
    void Setting::onEnterTransitionDidFinish()
    {
        Layer::onEnterTransitionDidFinish();
        log("SettingonEnterTransitionDidFinish");
    }
      
    void Setting::onExit()
    {
        Layer::onExit();
        log("SettingonExit");
    }
      
    void Setting::onExitTransitionDidStart()
    {
        Layer::onExitTransitionDidStart();
        log("SettingonExitTransitionDidStart");
    }
      
    void Setting::cleanup()
    {
        Layer::cleanup();
        log("Settingcleanup");
    }

    情况1时候,它的调用顺序如下图所示。

    情况2时候,它的调用顺序如下图所示,从图中可见与上面不同是多出HelloWorld中cleanup函数,这也说明replaceScene函数会释放场景对象。

    情况3时候,它的调用顺序如下图所示,从图中可见popScene函数时候调用Setting中cleanup函数,这说明popScene函数会释放Setting场景对象,当回到HelloWorld场景时候并不会调用init()函数,而是调用onEnter函数。

    转载于:https://www.cnblogs.com/damowang/p/4844647.html

    展开全文
  • Node类 不解释 ActionTimeline类是一个3.0时代的动画类, 案例一 //建立node方案一Data data = FileUtils::getInstance()->getDataFromFile("ActionTimeline/DemoPlayer.csb");...Node* node = CSLoader::...

    Node类 不解释

     

    ActionTimeline类是一个3.0时代的动画类,

    案例一

    //建立node方案一
    Data data = FileUtils::getInstance()->getDataFromFile("ActionTimeline/DemoPlayer.csb"); Node* node = CSLoader::createNode(data);
    //建立node方案二
    Node* node = CSLoader::createNode("ActionTimeline/DemoPlayer.csb");
    ActionTimeline* action = CSLoader::createTimeline(data, "ActionTimeline/DemoPlayer.csb");
    node->runAction(action);
    action->gotoFrameAndPlay(0);
    
    node->setScale(0.2f);
    node->setPosition(VisibleRect::center());
    
    addChild(node);

     

    案例二

        Node* node = CSLoader::createNode("ActionTimeline/DemoPlayer.csb");
        ActionTimeline* action = CSLoader::createTimeline("ActionTimeline/DemoPlayer.csb");
        cocostudio::timeline::AnimationInfo standinfo("stand", 0, 40);
        cocostudio::timeline::AnimationInfo walkinfo("walk", 41, 81);
        action->addAnimationInfo(standinfo);
        action->addAnimationInfo(walkinfo);
        node->runAction(action);
        action->play("walk", true);
        
        node->setScale(0.2f);
        node->setPosition(150,100);
        addChild(node);

     

    Armature,ArmatureAnimation,ProcessBase这个是传统的帧动画使用的api类

    案例一:

    //异步加载方案
    ArmatureDataManager::getInstance()->addArmatureFileInfoAsync("armature/testEasing.ExportJson", this, CC_SCHEDULE_SELECTOR(TestAsynchronousLoading::dataLoaded)); 
    //同步加载方案   
    ArmatureDataManager::getInstance()->addArmatureFileInfo("armature/bear.ExportJson");
    
    Armature *armature = Armature::create("bear");
    //按动画索引播放
    armature->getAnimation()->playWithIndex(0);
    //按动画名称播放
    armature->getAnimation()->play("fire")
    armature->setPosition(VisibleRect::center().x, VisibleRect::center().y);
    addChild(armature);

     

    转载于:https://www.cnblogs.com/damowang/p/4997474.html

    展开全文
  • cocos2d-x3.0API常用接口 Director::getInstance()->getOpenGLView()->setDesignResolutionSize() //设计分辨率大小及模式 Director::getInstance()->setContentScaleFactor() //内容缩放因子 ...

    cocos2d-x3.0API常用接口

    • Director::getInstance()->getOpenGLView()->setDesignResolutionSize() //设计分辨率大小及模式
    • Director::getInstance()->setContentScaleFactor() //内容缩放因子
    • FileUtils::getInstance()->setSearchPaths() //资源搜索路径
    • Director::getInstance()->getOpenGLView()->getFrameSize() //屏幕分辨率
    • Director::getInstance()->getWinSize() //设计分辨率
    • Director::getInstance()->getVisibleSize() //设计分辨率可视区域大小
    • Director::getInstance()->getVisibleOrigin() //设计分辨率可视区域起点

    资源分辨率,设计分辨率,屏幕分辨率

    • Resources width 以下简写为RW,Resources height 以下简写为RH
    • Design width 以下简写为DW,Design height 以下简写为DH
    • Screen width 以下简写为SW,Screen height 以下简写为SH

    Cocos2d-x图片显示有下面两个逻辑过程。 资源布局到 到 设计分辨率,设计分辨率 布局到 屏幕。

    如下图所示:

    接口setContentScaleFactor()和setSearchPaths()控制着第一个转换过程。

    而setDesignResolutionSize()控制第二个过程。两个过程结合在一起,影响最终的显示效果。

    从资源分辨率到设计分辨率

    setSearchPaths()需要根据当前屏幕分辨率做恰当的设置,HelloCpp展示了一套简单方案,但可能不是最佳的。

    setContentScaleFactor()决定了图片显示到屏幕的缩放因子,但是这个接口的参数不是通过资源图片的宽、高比屏幕宽、高得来。Cocos2d-x引擎设计试图屏蔽游戏开发者直接去关注屏幕,所以这个因子是资源宽、高比设计分辨率宽、高。

    setContentScaleFactor()通常有两个方式来设置参数。 RH/DH或RW/DW,不同的因子选择有不同的缩放负作用。 先看一张图:

    用高度比作为内容缩放因子,保证了背景资源的垂直方向在设计分辨率范围内的全部显示。

    用宽度比作为内容缩放因子,保证了背景资源的水平方向在设计分辨率范围内的全部显示。

    从设计分辨率到屏幕分辨率

    setDesignResolutionSize(DW, DH, resolutionPolicy)

    有三个参数,设计分辨率宽,设计分辨率高,分辨率策略。

    前两个很好理解,复杂点在分辨率策略的选择上。

    先来看ResolutionPolicy::EXACT_FIT,ResolutionPolicy::NO_BORDER,ResolutionPolicy::SHOW_ALL这三种情况,2.1.3新加入的策略稍后分析。

    三种策略的设计分辨率都是传入值,内部不做修正。

    先看一张图:

    ResolutionPolicy::SHOW_ALL

    屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(小)者作为宽、高的缩放因子。保证了设计区域全部显示到屏幕上,但可能会有黑边。

    ResolutionPolicy::EXACT_FIT

    屏幕宽 与 设计宽比 作为X方向的缩放因子,屏幕高 与 设计高比 作为Y方向的缩放因子。保证了设计区域完全铺满屏幕,但是可能会出现图像拉伸。

    ResolutionPolicy::NO_BORDER

    屏幕宽、高分别和设计分辨率宽、高计算缩放因子,取较(大)者作为宽、高的缩放因子。保证了设计区域总能一个方向上铺满屏幕,而另一个方向一般会超出屏幕区域。

    ResolutionPolicy::NO_BORDER是之前官方推荐使用的方案,他没有拉伸图像,同时在一个方向上撑满了屏幕,但是2.1.3新加入的两种策略将撼动ResolutionPolicy::NO_BORDER的地位。

    ResolutionPolicy::FIXED_HEIGHT和ResolutionPolicy::FIXED_WIDTH都是会在内部修正传入设计分辨率,以保证屏幕分辨率到设计分辨率无拉伸铺满屏幕。 如图:

    ResolutionPolicy::FIXED_HEIGHT
    保持传入的设计分辨率高度不变,根据屏幕分辨率修正设计分辨率的宽度。

    ResolutionPolicy::FIXED_WIDTH
    保持传入的设计分辨率宽度不变,根据屏幕分辨率修正设计分辨率的高度。

    结合两个过程

    第一过程有两种情况,第二过程有5种情况,在一个分辨率下会有10种可能的方案组合。 如何选择自己需要的?

    我们需要作出选择,是牺牲效果还是牺牲部分显示区域。

    这里我们选者牺牲一个方向的显示区域为例,结果说明两个过程。

    在我的游戏里面,背景图的高需要全部显示,而宽方向可以裁减。

    要实现这个目的,需要保证两个过程都是在宽方向裁减。

    • 第一过程选择 setContentScaleFactor(RH/DH)
    • 第二过程有两个选择:ResolutionPolicy::NO_BORDER和ResolutionPolicy::FIXED_HEIGHT

    为了说明两者的区别,需要结合VisibleOrigin和VisibleSize。 看图

    ResolutionPolicy::NO_BORDER情况下,设计分辨率并不是可见区域,我们布局精灵需要根据VisibleOrigin和VisibleSize来做判断处理。

    而ResolutionPolicy::FIXED_HEIGHT则不同,设计分辨率就是可见区域,VisibleOrigin总是(0,0)

    getVisibleSize() = getWinSize(),ResolutionPolicy::FIXED_HEIGHT达到了同样的目的,但是却简化了代码。

    ResolutionPolicy::FIXED_HEIGHT和ResolutionPolicy::FIXED_WIDTH是ResolutionPolicy::NO_BORDER的进化,新项目中建议立即开始使用这两种方式。

    小结

    ResolutionPolicy::FIXED_HEIGHT

    适合高方向需要撑满,宽方向可裁减的游戏,结合setContentScaleFactor(RH/DH)使用。

    ResolutionPolicy::FIXED_WIDTH

    适合宽方向需要撑满,高方向可裁减的游戏,结合setContentScaleFactor(RW/DW)使用。

    tip:正确设置AppMacros.h里面的宽高,注意横屏游戏和竖屏游戏的不同。

     

     

    转载于:https://www.cnblogs.com/damowang/p/4828590.html

    展开全文
  • cc.CallFunc.create(selector, data) selector:函数名(函数指针) data:参数 table类型 函数写法 function(node,args ) ...node:动作调用对象,这个在系统会在-runAction的时候自动赋值进去的,不需要cc....
  • CC_CALLBACK_1,CC_CALLBACK_2,CC_CALLBACK_3 这些都是std::bind的宏,数字1,2,3主要表示要占位的数量,也是将来传递参数的数量。 // new callbacks based on C++11#define CC_CALLBACK_0(__selector__,__target_...
  • 1、写自己的C++类,按照cocos2d-x的规矩,继承cocos2d::Ref类,以便使用cocos2d-x的内存回收机制。当然不这么干也行,但是不推荐,不然在Lua环境下对象的释放狠麻烦。 2、编写一个.ini文件,让bindings-generator...
  • title: CocosCreator进阶实战第四部分:工厂模式 date: 2019-12-26 12:00:00 摘要 工厂模式是最常用的设计模式之一。这种类型的设计模式属于创建型模式,我们在创建对象时不会暴露创建逻辑而是直接给出“产品”。 ...
  • title: CocosCreator进阶实战第二部分:编码规范 date: 2019-12-20 12:00:00 摘要 代码规范的重要性不再赘述,所以第二部分文章内容为项目使用的编码规范并使用代码举例。 正文 版本说明 使用 CocosCreator 的 ...
  • title: CocosCreator进阶实战第三部分:面向对象 date: 2019-12-24 12:00:00 摘要 面向对象是一种对现实世界的理解和抽象、是把属性和方法组织为一个对象来看待的思维、是作为程序员必然要掌握的一种方法! 正文 ...
  • title: CocosCreator进阶实战第一部分:头脑风暴 date: 2019-12-17 12:00:00 摘要 经过一段时间的学习,相信小伙伴们已经能够写出一些小游戏了。不过不知你是否同我一样,在学习之初不注意代码结构呢?KUOKUO 不敢说...
  • title: CocosCreator进阶实战第五部分:工具类与子弹射击 date: 2019-12-28 12:00:00 摘要 最终部分:工具类、子弹射击与 Boss 随机移动。 正文 版本说明 使用 CocosCreator 的 2.1.3 版本开发。 建议先下载完整...
  • cocos creator 例子进阶版,初入门例子增强版,特效等都已经加入了。
  • cocos2dx进阶学习之CCEGLView
  • cocos2dx进阶学习之CCBI文件
  • cocos2dx进阶学习之CCLayer

    千次阅读 2014-01-24 11:59:41
    继承关系CCLayer -> CCNode,CCTouchDelegate,CCAccelerometerDelegate,CCKeypadDelegateCCLayer在cocos2dx中抽象的是一个层,场景的一部分,CCLayer的父类很多,除了CCNode之外还有CCTouchDelegate,...
  • cocos2dx进阶学习之CCTMXTiledMap

    千次阅读 2014-02-10 17:04:33
    继承关系CCTMXTiledMap -> CCNode它由CCNode派生,我们已经知道CCNode是cocos2dx的舞台对象的公共父类,所以CCTMXTiledMap也是个舞台对象成员static CCTMXTiledMap* create(const char *tmxFile);通过一个文件,创建...
  • cocos2dx进阶学习之CCNode

    千次阅读 2014-01-24 05:48:08
    继承关系CCNode -> CCObjectCCNode在cocos2dx中抽象舞台对象,需要渲染的对象都是从CCNode派生,包括CCScene,CCLayer,CCSprite等等CCNode提供包容关系管理成员函数virtual bool init();static CCNode * create...
  • cocos2dx进阶学习之CCAction

    千次阅读 2014-02-14 17:22:52
    CCAction在cocos2dx中,抽象了节点的动作。它由CCObject派生,因此它不是渲染节点。它经常的用法是,创建一个action,然后让某个CCNode对象(一般是精灵),去执行它。在马里奥代码里,执行马里奥跳跃的代码如下://...
  • cocos2dx进阶学习之CCScene

    千次阅读 2014-01-23 10:42:15
    继承关系CCScene -> CCNode -> ...静态创建函数,创建一个CCScene对象,并初始化以及调用autorelease函数让cocos2dx管理该对象生命周期bool init();初始化函数,对该对象进行初始化说明CCScene从CCNode继承,因此更多的
  • cocos2dx进阶学习之CCSprite

    千次阅读 2014-01-26 00:08:42
    继承关系CCSprite -> CCNodeRGBA -> CCNode, CCRGBAProtocol CCTextureProtocol从继承关系可以看出,CCSprite也是一个CCNode的子类,在cocos2dx中,CCSprite抽象了舞台中的角色对象,类似舞台中的舞者,或者舞台...
  • cocos2dx进阶】开篇

    2014-01-17 17:33:21
    Cocos2dx 进阶序 新年伊始,总会有个目标,其他的暂且不表,多年积累下来的知识其实需要好好整理回顾一下,又正好有朋友怂恿,于是在51cto开了博客,打算分享一些干货。 先来介绍下自己,10年的游戏开发经验,号称...
  • cocos2dx进阶学习之CCApplication

    千次阅读 2014-01-20 23:16:33
    其他代码都是处理windows消息,与cocos2dx关系不大,忽略就好 static CCApplication* sharedApplication(); 这个静态函数返回单例的application对象,任何时候想调用CCApplication的接口时,只要使用CCApplication::...
  • cocos2dx进阶学习之CCSpriteBatchNode

    千次阅读 2014-02-11 23:09:28
    继承关系CCSpriteBatchNode -> CCNode, CCTextureProtocol成员变量inline CCTextureAtlas* getTextureAtlas(void)inline void setTextureAtlas(CCTextureAtlas* textureAtlas) 获取/设置纹理图集,纹理图集是管理...
  • cocos2dx进阶学习之CCTMXLayer

    千次阅读 2014-02-11 13:43:15
    继承关系CCTMXLayer -> CCSpriteBatchNodeCCTMXLayer是在瓦片地图中,抽象一个层的类,它继承自CCSpriteBatchNode,也就是说它抽象了一批相同图片的精灵,在瓦片地图中,用层来抽象她们。成员函数CCSprite* tileAt...
  • cocos2dx进阶学习之CCObject

    千次阅读 2014-01-18 22:27:58
    继承关系 CCObject -> CCCopying 类定义 class CC_DLL CCObject : public CCCopying ...CCObject作为cocos2dx中大部分类的父类,提供了 1)内存管理功能 2)为脚本提供对象ID管理 3)序列化接口 4)提供update接口
  • cocos2dx进阶学习之CCDirector

    千次阅读 2014-01-23 10:35:14
    cocos2dx中有不少缓存类,这些缓存类,类似舞台上的常用道具,常用道具当然放在离演员最近的地方(内存) 但是当地方(内存)不够时,导演负责指挥清除这些缓存。 void setDefaultValues(void); void ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,351
精华内容 940
关键字:

cocos进阶