zoukankan      html  css  js  c++  java
  • Cocos2d-x 开发手记

    1、所有的源文件统一新建到Classes里,否则无法找到源文件,这样也便于跨平台编译
     
    2、绘图坐标系,与opengl采用相同坐标系,左下角为原点
    纹理坐标系,以左上角为原点
     
    3、最近有在学习COCOS2D,看到书中有使用SCENE_FUNC_CREATE这个宏
    经查找,发现SCENE_NODE_FUNC这个宏在这个版本中并不存在(至少我没有找到)
    抱着试一试的想法,直接换成CREATE_FUNC这个宏,发现程序可以正常运行。
    如果有遇到这个问题的朋友,可以尝试将SCENE_NODE_FUNC 替换成CREATE_FUNC。
     
    4、今天在项目中,又看了一下MoveTo和MoveBy,我以前理解错了一些!CCMoveBy::actionWithDuration(2, CCPointMake(80,80));这里的ccp(80,80)不是像ActionTo中的一样(屏幕上的目标坐标点);这里是偏移量(80,80) ? 这里不是点吗? 对,它对于CCMoveBy是相对于CCNode原先的坐标点横坐标向右偏移80个像素,纵坐标也偏移80个像素。
     
    5、windows phone不支持MP3
     
    6、真正的随机数??
    关于随机数 cocos2d-x 定义了一个宏 CCRANDOM_0_1 生成的是 [0, 1] 之间的值
    因此,要生成  [0-100] 之间的数    CCRANDOM_0_1 * 100
    生成 [1,5]  之间的float 数,  就是 CCRANDOM_0_1 * 4 + 1
    但是这个随机并不是真正的随机,你多试几次就会发现,每次都是固定的顺序产生,对于随机数我们一般都需要指定一个种子,让它依据这个种子产生。
    这里采用当前时间生成随机种子:
    srand(GetTickCount()+ rand()); 可惜的是GetTickCount()属于win,打包apk的时候会报错,经测试,简单点的方法是 srand(int(time(0))+ rand());
        cc_timeval psv; 
        CCTime::gettimeofdayCocos2d(&psv, NULL); 
        unsigned long int rand_seed = psv.tv_sec*1000 + psv.tv_usec/1000; 
        srand(rand_seed);
     
    7、乱序数组内容
    #include <vector>
    #include <algorithm>
    std::vector<int> randVector;
    for(int i=1;i<=10;i++)
        {
            randVector.push_back(i);
        }
        std::random_shuffle(randVector.begin(),randVector.end());
     
    8、检测触摸点是否在精灵内部
            if(sp->getBoundingBox().containsPoint(sp->convertTouchToNodeSpace(touch)))
            {
                touchNode = sp;
                break;
            }
     
    9、
    1. 当使用create的时候,都是被加入了autorelease的,所以如果需要使用的话,要记得retain一下啊,addchild自动retain了;
    2. 如果使用的是new,那么就要记得不用的时候一定要release啊;
    3. 一般来说cocos2dx的CCNode都是有create的,比如CCArray不用担心释放问题;
    4. vector这些c++函数不要忘记释放内存啊;
    5. 最好是不要混用,如果你对他们很清楚,ok,可以的;
    6. 为了格式统一,我一般喜欢自己创建create函数。
     
    10、避免手打输入项目cpp文件到android.mk里面编译
    FILE_LIST := hellocpp/main.cpp
    FILE_LIST += $(wildcard $(LOCAL_PATH)/../../Classes/*.cpp)
    LOCAL_SRC_FILES := hellocpp/main.cpp
    LOCAL_SRC_FILES := $(FILE_LIST:$(LOCAL_PATH)/%=%) 
     
    11、CClayer的锚点在0,0,而精灵的默认锚点为中点(0.5,0.5)
     
    12、对象层添加触摸
    this->setTouchEnabled(true);
    CCDirector::sharedDirector()->getTouchDispatcher()->addTargetedDelegate(this, 0, true);
    在头文件添加函数
        bool ccTouchBegan(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
        void ccTouchMoved(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
        void ccTouchEnded(cocos2d::CCTouch *pTouch, cocos2d::CCEvent *pEvent);
     
    13、NDK调试
     
    14、触摸屏蔽
    在窗口弹出的情况下,要屏蔽底层的触摸,调用该层的setTouchEnable即可,注意,init在OnEnter之前调用,runing在OnEnter中这是true,所以在init函数中设置是否触摸没用。
     
    15、Button添加点击监听的函数
    void StartSence::startGame1(CCObject *sender,TouchEventType eventType)
    {
        if (eventType == TOUCH_EVENT_BEGAN)
        {
     
        }
        if (eventType == TOUCH_EVENT_MOVED)
        {
            
        }
        if (eventType == TOUCH_EVENT_ENDED)
        {
     
        }
        if(eventType==TOUCH_EVENT_CANCELED)
        {
     
        }
    }
     
    16、
    场景: cocos2dx 跨平台开发, 移植Android版本时, 当进行到build_native.sh步骤后
     
    ndk版本: android-ndk-r9
     
    开发环境: mac os 64bit, Android+Eclipse
     
    BUG:
     
      CCCommon.cpp:54:77: error: format not a string literal and no format arguments [-Werror=format-security]
     
    原因:
     
      android-ndk-r9与Eclipse的版本不兼容问题
     
    方案之一(我搜到的):
     
      在对应项目的proj.android/jni/Application.mk添加一句话
     
      APP_CFLAGS += -Wno-error=format-security
     
      意思就是无视这个error
     
    可以解决编译出错问题, 如有更好方案, 请不吝赐教.
     
    17、开启重力感应
    this->setKeypadEnabled(true);
    GameUILayer::didAccelerate(CCAcceleration* pAccelerationValue)
     
    18、异步加载plist
    CCTextureCache::sharedTextureCache()->addImageAsync("ui_text.png",this,callfuncO_selector(CTestLayer::showSprite));
     
    CCTexture2D* texture_ui_text=(CCTexture2D*)obj;//传入的obj即是异步生成的纹理
        CCSpriteFrameCache::sharedSpriteFrameCache()->addSpriteFramesWithFile("ui_text.plist",texture_ui_text);//通过纹理和.plist文件加入CCSpriteFrameCache
        CCSprite* raffle_b_friend=CCSprite::createWithSpriteFrameName("raffle_b_friend.png");//尽情使用小图片吧
     
    19、动作序列的延迟,回调
    CCSequence::create( CCDelayTime::create(0.3f),CCHide::create(),NULL)
    (1).无发送者无数据回调:CCCallFunc,示例如下
    (2).有发送者无数据回调:CCCallFuncN  (N是CCNode),示例如下
    (3).有发送者有数据回调:CCCallFuncND  (N是CCNode,D是data,是void *类型)
     
    20、error LNK2001: 无法解析的外部符号
    最佳答案首先可以肯定地告诉你,出现这种错误,原因不在于编程平台或者编译器的某些文件,是你自己程序有问题。请检查一下自己的程序。上面提到的那几个函数,可能在你的class KSwordOnLineSever类里面定义了,但它的实现部分还没有写,看看是不是忘了?看看你是不是犯了如下所示的错误:class a{int x;public:void set(int p);};/*漏掉函数的实现部分:void a::set (int p){x = p;}*/这种错误不会在编译时被显示,因为它符合语法规则,但无法build!
  • 相关阅读:
    c#数据类型
    遮罩层
    图片轮播
    js 获取浏览器高度和宽度值
    bootstrap、jquery
    洛谷P1442 铁球落地 题解
    HDU3016 Man Down 题解
    POJ2892 Tunnel Warfare 题解
    HDU2795 Billboard 题解
    CF920F SUM and REPLACE 题解
  • 原文地址:https://www.cnblogs.com/leestar54/p/3627972.html
Copyright © 2011-2022 走看看