存档

2014年7月 的存档

DontDestroyOnLoad(Unity3D开发之五)

2014年7月31日 没有评论

Unity中我们从A场景切换到B场景的时候,A场景所有对象都会销毁,但有时候我不需要销毁某些东西。

比如一个简单的游戏的背景音乐,我不需要多次重复创建,多个场景播放这一个就行了。这个时候就需要用到DontDestroyOnLoad。

using UnityEngine;
using System.Collections;

public class MusicManager : MonoBehaviour {
    string volumeSetting;
	void Awake () 
	{
        volumeSetting = PlayerPrefs.GetString("Volume");
        if (volumeSetting == "False")
        {
            AudioListener.volume = 0;
        }
		DontDestroyOnLoad(gameObject);
	}
}

我在场景加载的时候初始化场景音乐,之后的进入游戏场景,就不需要重新加载了。

注意:Unity 4.5之前的版本,在来回切换场景的时候会导致多次加载DontDestroyOnLoad的对象,导致出现多个的bug。
如果你是Unity 4.5之前,请使用一个static变量记录你的对象是否已经初始化,防止多次创建。

上面是一个办法,当然你也可以使用单例的方式代替DontDestroyOnLoad。

宣雨松的博客中提到过这种方式,下面一段是宣雨松写的,仅此记录一下。
原文:http://www.xuanyusong.com/archives/2938

首先程序会进入static Global方法中,这个方法永远只会走一遍,所以我在这里创建一个GameObjcet,然后把Global这条脚本绑定上去,我在DontDestroyOnLoad这个对象。

using UnityEngine;
using System.Collections;
 
public class Global :MonoBehaviour
{
    public static Global instance;
 
    static Global()
    {
        GameObject go = new GameObject("Globa");
        DontDestroyOnLoad(go);
        instance = go.AddComponent<Global>();
    }
 
    public void DoSomeThings()
    {
        Debug.Log("DoSomeThings");
    }
 
    void Start () 
    {
        Debug.Log("Start");
    }
 
}

这样这条脚本就类似一个静态脚本了,而且这个游戏对象也永远不会因为切换场景而被销毁。而且用起来非常方便。在需要调用它的地方直接调用就行了。

Global.instance.DoSomeThings();

分类: 未分类 标签:

cocos2d-js:游戏进入后台和返回游戏的事件捕获和处理

2014年7月29日 没有评论

cocos2d-js 3.x处理 游戏置入后台和返回游戏的事件处理很方便

只需通过事件管理类cc.eventManager,自定义一个监听事件即可

代码如下

cc.eventManager.addCustomListener(cc.game.EVENT_HIDE, function(){
    cc.log("游戏进入后台");
 });
cc.eventManager.addCustomListener(cc.game.EVENT_SHOW, function(){
    cc.log("重新返回游戏");
});

分类: cocos2d, cocos2d-js, 未分类 标签:

cocos2dx 网络编程(CCHttpRequest和CURL两个方式)

2014年7月23日 没有评论

在使用之前需要设置一些参数:参考:http://blog.csdn.net/wangbin_jxust/article/details/9632771

在完成上面的操作后,还需要在链接器的输入里面添加一个参数pthreadVCE2.lib;

使用CCHttpRequest方法实现:(异步连接)

  1. void HallView::Qudian(){//网络异步连接方法  
  2.     cocos2d::extension::CCHttpRequest* postRequest=new cocos2d::extension::CCHttpRequest();  
  3.     postRequest->setRequestType(cocos2d::extension::CCHttpRequest::kHttpPost);//设置发送类型  
  4.     postRequest->setUrl("");//设置网址  
  5.     postRequest->setResponseCallback(this,callfuncND_selector(HallView::onHttpRequestCompleted));//回调函数,处理接收到的信息  
  6.   
  7.     string caozuo="";  
  8.     CCString *data=CCString::stringWithString(caozuo);  
  9.     postRequest->setRequestData(data->getCString(),data->length());//这里的代码会接在网络地址后面,一起发送。  
  10.   
  11.     cocos2d::extension::CCHttpClient* httpClient=cocos2d::extension::CCHttpClient::getInstance();  
  12.     httpClient->setTimeoutForConnect(10);<span style="font-family: Arial, Helvetica, sans-serif;">//设置连接超时时间</span>  
  13.     httpClient->setTimeoutForRead(10);//设置发送超时时间  
  14.     httpClient->send(postRequest);//设置接收数据类型  
  15.     postRequest->release();//释放  
  16. }  


添加一个回调方法。

  1. void HallView::onHttpRequestCompleted(cocos2d::CCNode *sender ,void *data){  
  2.     cocos2d::extension::CCHttpResponse* response=(cocos2d::extension::CCHttpResponse*)data;  
  3.     if(!response) {CCLOG("Log:response =null,plase check it."); return;}  
  4.       
  5.      //请求失败  
  6.     if(!response->isSucceed())  
  7.     {  
  8.         this->removeChildByTag(Animate_loading,true);  
  9.         CCDictionary* pDict = CCDictionary::createWithContentsOfFile("chines.xml");  
  10.         platform::showMsg(((CCString*)pDict->objectForKey("networking"))->getCString());  
  11.         CCLOG("ERROR BUFFER:%s",response->getErrorBuffer());  
  12.         return;  
  13.     }     
  14.   
  15.     int codeIndex=response->getResponseCode();  
  16.     const char* tag=response->getHttpRequest()->getTag();  
  17.       
  18.     //请求成功  
  19.     std::vector<char>* buffer=response->getResponseData();  
  20.     std::string temp(buffer->begin(),buffer->end());  
  21.     CCString* responseData=CCString::create(temp);  
  22.     Json::Reader reader;//json解析    
  23.     Json::Value value;//表示一个json格式的对象    
  24.     if(reader.parse(responseData->getCString(),value))//解析出json放到json中区    
  25.     {    
  26.           //这里就可以对返回来的信息做处理  
  27.         }  
  28.           
  29. }  





使用异步连接,程序和联网的方法将互相不干扰,联网方法将为一个独立的线程。

使用CURL方法实现:(同步连接)

第一个方法

需要加入 头文件#include "curl/curl.h"

  1. void HallView::denglu(){    //登陆游戏  
  2.     CURL *curl;    
  3.     CURLcode res;    
  4.     string cc;   
  5.     curl=curl_easy_init();    
  6.     if(curl)    
  7.     {   
  8.         curl_easy_setopt(curl, CURLOPT_URL, ""); //设置请求的地址    
  9.         curl_easy_setopt(curl, CURLOPT_POST, true); //设置数据类型  
  10.         string caozuo="";  
  11.         curl_easy_setopt(curl, CURLOPT_POSTFIELDS,caozuo.c_str()); //将操作代码,和连接的网站组合,一起发送!   
  12.         curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);  
  13.         curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,HallView::writehtml); //数据处理回调函数    
  14.         curl_easy_setopt(curl, CURLOPT_WRITEDATA, &cc);//缓冲的内存    
  15.         curl_easy_setopt(curl,CURLOPT_TIMEOUT_MS,5000); //设置连接超时时间    
  16.         res=curl_easy_perform(curl);    
  17.         if(res!=CURLE_OK)    
  18.         {    
  19.             CCDictionary* pDict = CCDictionary::createWithContentsOfFile("chines.xml");  
  20.             string mes=((CCString*)pDict->objectForKey("networking"))->getCString();  
  21.             platform::showMsg(mes);  
  22.         }    
  23.         curl_easy_cleanup(curl);    
  24.     }    
  25.     else    
  26.     {    
  27.         CCLog("curl is null");    
  28.     }    
  29. }  




在定义回调函数:这个方法为静态方法,如果里面要引用其他变量,需要为静态变量。

  1. size_t HallView::writehtml(uint8_t* ptr,size_t size,size_t number,void *stream)      
  2. {       
  3.     CCString* a=CCString::createWithFormat("%s",ptr);    
  4.     std::string str1=a->getCString();  
  5.     Json::Reader reader;//json解析    
  6.     Json::Value value;//表示一个json格式的对象    
  7.     if(reader.parse(str1,value))//解析出json放到json中区    
  8.     {    
  9.         string out=value["gameId"].asString();      
  10.         gameda->gameId=out;  
  11.         out=value["newIMSI"].asString();  
  12.         gameda->newIMSI=out;  
  13.     }    
  14.     return size*number;//这里一定要返回实际返回的字节数      
  15. }  




在.h中定义:

static size_t writehtml(uint8_t* ptr,size_t size,size_t number,void *stream); 
使用同步连接,联网方法的启动就直接阻塞游戏主进程的运行,直到获取到返回值为止。


curl_easy_setopt::属性
curlopt_url//URL地址值
curlopt_writefunction//将得到的数据传递相应的函数
curlopt_writeddata//将函数传递给相应的第四个参数里
curlopt_header//如果设置为1,可以返回http头的值;如果设置为非0值,则可以把一个头包含在输出中
CURLOPT_TIMEOUT_MS //设置cURL允许执行的最长毫秒数。
curlopt_low_speed_limit//设置一个长整型。控制传送多少字节
curlopt_cookie//传递一个包含httpcookie的头连接
curlopt_flie//传送到输出文件
curlopt_infile//传送过来的输出文件
curlopt_writeheader//输出头部分
curlopt_proxyuserpwd//传递一个形如[username]:[password]格式的字符串去连接http代理
curlopt_postfields//传递一个作为httppost操作的所有数据的字符串
curlopt_referer //在http请求中包含一个referer头的字符串
curlopt_useragent//在http请求中包含一个user-agent 头的字符串
curlpot_ftpport 传递一个包含被ftppost指令使用的IP地址
使用格式curl_easy_setopt( curl, CURLOPT_FOLLOWLOCATION, 1L); //第一个参数实例化的curl,第二个数属性,第三个为属性值

如果,获取的返回值是josn格式,我的博客中有方法非常方便提取指定的值。

分类: cocos2d, cocos2d-x, 未分类 标签:

cocos2dx研究:删除项目下的文件后,提示"missing file"

2014年7月18日 没有评论

如果直接删除掉项目下的文件,编译时提示 “ missing file”;

这是有项目有通过svn或git进行管理引起的

需手动清理一下

1、打开mac的终端

2、

$cd 需要清除的文件所在目录
$svn delete "文件夹或文件名"

分类: 未分类 标签:

Cocos2dx研究:关于‘Can't install application The Info.plist for application at..'的错误

2014年7月18日 没有评论

现象:编译已通过,但最后安装程序的时候,会提示下面的消息框信息

Can’t install application The Info.plist for application at ***************** specifies a CFBundleExecutable of ${EXECUTABLE_NAME}, which does not exist ”

分析:工程的资源文件夹即Resources是从有从其他工程中复制过来,而这个工程是cocos2dx 2.14版本的工程,info.list是放在Resourecs下的。所以就引起了Info.list重复问题了

解决:解决删除掉Resources目录下的Info.list文件

分类: 未分类 标签:

【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】

2014年7月17日 没有评论

游戏开发中常遇到资源保护的问题。

目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑。

需要安全那就得耗费一定的资源去实现它。目前网上也有用TexturePacker工具来加密的,不过针对性还是不够强。

分析一下原理为:

1,转格式:将需要加密的文件转为流的方式;

2,加密:根据自己需要使用加密手段,MD5,AES,甚至可以直接改变位移,加一些自己的特殊字符也可以使文件简单加密,加密完后基本保证

图片类型基本用特殊软件预览不了也打不开,Lua文件加密后一片乱码····;

3,保存自定义格式文件:另存为自己特殊类型的文件名如”xx.d” “xx.xyz”等。

4,图片解密:修改cocos2dx底层库的获取路径处,和加载CCImage纹理处理时的源码修改;

5,特殊Lua文件界面:修改对应Lua加载方法;

 

基本原理清楚了后我贴几段我自己项目中常用的加密方式:

首先是转格式并且加密的方式

bool PublicCommen::recode_getFileByName(string pFileName){
    
    unsigned long nSize = 0;
    unsigned char* pBuffer = CCFileUtils::sharedFileUtils()->getFileData(
                                                                         pFileName.c_str(),
                                                                         "rb",&nSize);
    
    unsigned char* newBuf = new unsigned char[nSize];
    int newblen = nSize;
    if(pBuffer!=NULL&&nSize>0)
    {
        for (int i = 0; i<nSize; i++) {
            newBuf[i]=pBuffer[i]+MD5;
        }
        string savepath = pFileName;
        savepath = savepath.substr(0,savepath.length()-4);
        savepath = savepath + "xx.X";
      
        FILE *fp = fopen(savepath.c_str(), "wb+");
        fwrite(newBuf, 1, newblen, fp);
        fclose(fp);
        CCLOG("save file ok. path = %s" ,savepath.c_str());
        return true;
    }
    return false;
}

通常可以自己写一个应用程序遍历一下自定义目录下,需要转的资源文件,对应的把所有资源转换并加密;

里面newBuf[i]=pBuffer[i]+MD5;这段可以自由发挥!解密的时候需要对应!

当然你也可以取巧的放进你的游戏中修改cocos2dx底层的CCFileUtils::fullPathForFilename获取全路径的方法中;

 

下面说一下解密:

图片的解密需要修改cocos2dx CCTexture2D 的CCTextureCache::addImage类里面修改

CCTexture2D * CCTextureCache::addImage(const char * path)
{
    CCAssert(path != NULL, "TextureCache: fileimage MUST not be NULL");

    CCTexture2D * texture = NULL;
    CCImage* pImage = NULL;
    // Split up directory and filename
    // MUTEX:
    // Needed since addImageAsync calls this method from a different thread
    
    //pthread_mutex_lock(m_pDictLock);

    std::string pathKey = path;

    pathKey = CCFileUtils::sharedFileUtils()->fullPathForFilename(pathKey.c_str());
    if (pathKey.size() == 0)
    {
        return NULL;
    }
    texture = (CCTexture2D*)m_pTextures->objectForKey(pathKey.c_str());

    std::string fullpath = pathKey; // (CCFileUtils::sharedFileUtils()->fullPathFromRelativePath(path));
    if (! texture) 
    {
        std::string lowerCase(pathKey);
        for (unsigned int i = 0; i < lowerCase.length(); ++i)
        {
            lowerCase[i] = tolower(lowerCase[i]);
        }
        // all images are handled by UIImage except PVR extension that is handled by our own handler
        do 
        {
            if (std::string::npos != lowerCase.find(".pvr"))
            {
                texture = this->addPVRImage(fullpath.c_str());
            }
            else if (std::string::npos != lowerCase.find(".pkm"))
            {
                // ETC1 file format, only supportted on Android
                texture = this->addETCImage(fullpath.c_str());
            }
            else
            {
                CCImage::EImageFormat eImageFormat = CCImage::kFmtUnKnown;
                if (std::string::npos != lowerCase.find(".png"))
                {
                    eImageFormat = CCImage::kFmtPng;
                }
                else if (std::string::npos != lowerCase.find(".jpg") || std::string::npos != lowerCase.find(".jpeg"))
                {
                    eImageFormat = CCImage::kFmtJpg;
                }
                else if (std::string::npos != lowerCase.find(".tif") || std::string::npos != lowerCase.find(".tiff"))
                {
                    eImageFormat = CCImage::kFmtTiff;
                }
                else if (std::string::npos != lowerCase.find(".webp"))
                {
                    eImageFormat = CCImage::kFmtWebp;
                }
                else if (std::string::npos != lowerCase.find("XX.X"))
                {
                    eImageFormat = CCImage::xxxxx;
                }
                
                pImage = new CCImage();
                CC_BREAK_IF(NULL == pImage);

                bool bRet = pImage->initWithImageFile(fullpath.c_str(), eImageFormat);
                CC_BREAK_IF(!bRet);

                texture = new CCTexture2D();
                
                if( texture &&
                    texture->initWithImage(pImage) )
                {
#if CC_ENABLE_CACHE_TEXTURE_DATA
                    // cache the texture file name
                    VolatileTexture::addImageTexture(texture, fullpath.c_str(), eImageFormat);
#endif
                    m_pTextures->setObject(texture, pathKey.c_str());
                    texture->release();
                }
                else
                {
                    CCLOG("cocos2d: Couldn't create texture for file:%s in CCTextureCache", path);
                }
            }
        } while (0);
    }

    CC_SAFE_RELEASE(pImage);

    //pthread_mutex_unlock(m_pDictLock);
    return texture;
}

并且在CCImage的图片类型中添加你加密后的图片类型如:CCImage::xxxxx

 

然后跟到 bool bRet = pImage->initWithImageFile(fullpath.c_str(), eImageFormat);

CCImage.mm中的CCImage::initWithImageFile方法;

 

bool CCImage::initWithImageFile(const char * strPath, EImageFormat eImgFmt/* = eFmtPng*/)
{
    bool bRet = false;
    unsigned long nSize = 0;
    unsigned char* pBuffer = CCFileUtils::sharedFileUtils()->getFileData(
                CCFileUtils::sharedFileUtils()->fullPathForFilename(strPath).c_str(),
                "rb",
                &nSize);
    if(eImgFmt==xxxxxx)
    {
        for (int i= 0; i < nSize; i++) {
            pBuffer[i] = pBuffer[i]-MD5;
        }
        pBuffer[nSize] = pBuffer[nSize]-1;
        eImgFmt = kFmtPng;
    }
    
    if (pBuffer != NULL && nSize > 0)
    {
        bRet = initWithImageData(pBuffer, nSize, eImgFmt);
    }
    CC_SAFE_DELETE_ARRAY(pBuffer);
    return bRet;
}

 

其中 pBuffer[i] = pBuffer[i]-MD5;需要和之前加密的时候对应·····自己发挥!

Ok,只要是图片,并且是属于你自定义类型的图片都会得到解密的真实texture

Lua的解密也是基本一样的思路,不过解密需要单独在需要加载Lua的方法前先解密,要考虑跨平台性

 

 

 

 

 


			
分类: 未分类 标签:

Cocos2d-x研究: 序列帧动画实现

2014年7月16日 没有评论

cocos2d-x 2.x

    CCArray* splashFrames = CCArray::createWithCapacity(16);
    for (int i=1; i<=23; i++) {

        const char* str = CCString::createWithFormat("Splash_%04d.png",i)->getCString();
        CCSpriteFrame* frame = cache->spriteFrameByName(str);
        splashFrames->addObject(frame);
        
    }
    CCAnimation *splashAnim = CCAnimation::create();

    splashAnim = CCAnimation::createWithSpriteFrames(splashFrames, 0.02f);

Cocos2d-x 3.x

    Vector<SpriteFrame*> splashFrames;
    for (int i=1; i<=23; i++) {

        const char* str = CCString::createWithFormat("Splash_%04d.png",i)->getCString();
        SpriteFrame* frame = cache->getSpriteFrameByName(str);
        splashFrames.pushBack(frame);
        
    }
    Animation *splashAnim = Animation::create();

    splashAnim = Animation::createWithSpriteFrames(splashFrames, 0.02f);

很明显,2.x与3.x的实现方式,最大的区别在于3.x用不定长的Vector来组织帧序列,相对更加灵活

分类: 未分类 标签:

[转] 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文

2014年7月11日 没有评论

转自holydancer的CSDN专栏,原文地址:http://blog.csdn.net/holydancer/article/details/9219333

首先得描述一下各个证书的定位,作用,这样在制作的时候心中有谱,对整个流程的把握也会准确一些;

1、开发者证书(分为开发和发布两种,类型为ios Development,ios Distribution),这个是最基础的,不论是真机调试,还是上传到appstore都是需要的,是一个基证书,用来证明自己开发者身份的;

2、appID,这是每一个应用的独立标识,在设置项中可以配置该应用的权限,比如是否用到了PassBook,GameCenter,以及更常见的push服务,如果选中了push服务,那么就可以创建生成下面第3条所提到的推送证书,所以,在所有和推送相关的配置中,首先要做的就是先开通支持推送服务的appID;

3、推送证书(分为开发和发布两种,类型分别为APNs Development ios,APNs Distribution ios),该证书在appID配置中创建生成,和开发者证书一样,安装到开发电脑上;

4、Provisioning Profiles,这个东西是很有苹果特色的一个东西,我一般称之为PP文件,该文件将appID,开发者证书,硬件Device绑定到一块儿,在开发者中心配置好后可以添加到Xcode上,也可以直接在Xcode上连接开发者中心生成,真机调试时需要在PP文件中添加真机的udid;是真机调试和必架必备之珍品;

平常我们的制作流程一般都是按以上序列进行,先利用开发者帐号登陆开发者中心,创建开发者证书,appID,在appID中开通推送服务,在开通推送服务的选项下面创建推送证书(服务器端的推送证书见下文),之后在PP文件中绑定所有的证书id,添加调试真机等;

 

具体操作流程如下:

1、开发者证书的制作,首先登陆到开发者中心,找到证书配置的版块,猛戳进入,点进证书,会显示如下界面,点击右上角的加号[转] 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文

会出现以下界面,该操作重复两次,分别创建开发测试证书和发布证书,开发测试证书用于真机调试,发布证书用于提交到appStore,我们以开发测试证书为例,选择第一个红框中的内容;[转] 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文
然后下一步,会提示创建CSR文件,也就是证书签名请求文件,会有很详细的操作说明,如果英文不太好,可以参考下图;

[转] 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文

[转] 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文

之后将该CSR文件保存到一处;

备注:CSR文件尽量每个证书都制作一次,将常用名称区分开来,因为该常用名称是证书中的密钥的名字;

之后在开发者中心将该CSR文件提交;[转] 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文

提交上去后就会生成一个cer证书,如图所示,有效期为一年;

[转] 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文

利用同样的方法配置一下Distribution发布证书,下载保存,双击安装;在钥题串登陆证书中可以查看,其中专用密钥的名字即为CSR请求文件中的常用名称;

 

2、以上开发者证书的配置完成了,下面我们来配置appID和推送证书;在左边栏中选择appID,勾选右边的push可选项,为该appID所对应的应用添加推送功能,下面会看到创建证书的按钮,分别为开发证书和发布证书,下面的流程就和上述1中创建证书一样了,都是先建立证书请求文件,然后提交生成就行了,需要注意的是,虽然在左边栏证书栏中也可以直接创建推送证书,但是还是建议在appID中,勾选了push服务后在此处创建,这样会避免因为忘了开通push服务而导致推送不可用的情况发生;

[转] 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文

证书创建完成后,下载保存,双击安装即可;

3、最后我们来进行PP文件的制作

 

[转] 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文

该流程进行两次,分别创建开发测试用PP文件和发布PP文件,前者用于真机测试,后者用于提交发布;Ad Hoc格式一般用于企业帐号,此处我们忽略;

选择后提交[转] 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文

会自动检测匹配appID,另外下拉项中还可以选择wildCard格式,该格式为自动生成,使用*通配符,适用于批量的,没有推送,PassCard等服务的应用;我们选择我们刚刚创建的appID,之后下一步选择证书;

[转] 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文

继续,这里有一个区别,因为PP文件的开发测试版需要真机调试,所以我们需要绑定真机,这里因为之前我添加过一些设备,所以这里就可以直接全选添加,如果没有的话,需要将真机的udid复制出来在此添加,在发布PP文件中,是没有这一步的;

[转] 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文

之后就是输入一个PP文件的名字了,然后生成,下载保存,双击添加到Xcode库中,这样在真机调试或者发布时,就可以分别有不同的PP文件与其对应;

[转] 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文

添加到Xcode中的效果如下:

 

[转] 苹果所有常用证书,appID,Provisioning Profiles配置说明及制作图文

分类: cocos2d 标签:

cocos2d-x-3.2alpha0 如何创建新工程

2014年7月7日 没有评论

一直在用2.x所以对3.x接触的比较晚。直接上手cocos2d-x-3.2alpha0

1.在cocos2d-x-3.2alpha0/运行python命令

python setup.py

//它的作用是将下面这些路径加入到你的用户环境变量中,当然你也可以不添加

COCOS_CONSOLE_ROOT = ‘COCOS_CONSOLE_ROOT’
NDK_ROOT = ‘NDK_ROOT’
ANDROID_SDK_ROOT = ‘ANDROID_SDK_ROOT’
ANT_ROOT = ‘ANT_ROOT’

//如果你已经将COCOS_CONSOLE_ROOT = "COCOS_CONSOLE_ROOT’加入到了你的环境变量中,也就是说你运行了setup.py

2.那么直接运行下面命令

cocos new MyGame -p com.MyCompany.MyGame -l cpp -d e:/MyCompany

MyGame: name of your project
-p com.MyCompany.MyGame: package name for android
-l cpp: programming language used for the project, valid value is cppand lua
-d e:/MyCompany: directory to hold your project 

cocos在cocos2d-x-3.2alpha0/tools/cocos2d-console/bin下

好了,恭喜你新的项目创建成功了!你会发现这个项目很大,编译后有0.98G,因为它把引擎也拷贝过来了,我想它这样做的好处是简化项目配置环境,也就是说不管谁拿到这个项目都可以跑起来,不需要重新去改项目的配置了,不过也有缺点,就是每次新建一个项目,就得把cocos2d库重新编译下,不过在编译过后,可以直接copy政企项目后改项目名和名改名即可。

分类: cocos2d, cocos2d-x 标签:

CCProgressTo和CCProgressTimer 图片载入(进度条,动画)

2014年7月2日 没有评论

在cocos2d中同样提供了很多表现图片和精灵的方式,上一篇当中提到的切换场景的方式之一是顺或逆时针切入的方法,在图片上也可以使用,test里有一个例子介绍CCProgressTimer可以实现一些图片的特效效果,这样的效果可以在载入的时候作为载入动画

 步骤1.定义CCProgressTo,通过actionWithDuration函数,第一个参数是时间是一个CCTime对象,第二个参数是结果显示图片的百分比,如例子中一个100%,一个50%

步骤2 定义CCProgressTimer,通过progressWithFile,参数是图片路径

步骤3 调用setType设置类型,

kCCProgressTimerTypeRadialCW   顺时针生成

kCCProgressTimerTypeRadialCCW  逆时针生成

kCCProgressTimerTypeHorizontalBarLR 从左到右生成

kCCProgressTimerTypeHorizontalBarRL 从右到左生成

kCCProgressTimerTypeVerticalBarBT 从下到上生成

kCCProgressTimerTypeVerticalBarTB 从上到下生成

步骤4:设置位置,没什么好说的,直接setPosition

步骤5:开始,使用CCRepeatForever(重复进行),传入CCProgressTo对象

刚开始研究此引擎,如有错误之处,希望大家多多指正

下一篇写一下test类里面的其他场景

    CCProgressTimer *progress1=CCProgressTimer::create(CCSprite::create("Icon.png"));

    progress1->setPosition(ccp(100,100));

    //设置进度条的样式

    progress1->setType(kCCProgressTimerTypeRadial);

    //设置进度值范围[0,100]

    progress1->setPercentage(100);

    //反进度计时

    progress1->setReverseProgress(true);

    this->addChild(progress1);

   

    //第一个参数是时间,第二个参数是表示旋转100%

    CCProgressTo *to1 = CCProgressTo::create(10, 100);

    progress1->runAction(to1);

   

    //——————————————

    CCProgressTimer *progress2=CCProgressTimer::create(CCSprite::create("Icon.png"));

    progress2->setPosition(ccp(200,100));

    //设置进度条的样式

    progress2->setType(kCCProgressTimerTypeBar);

    //设置计时器运动方向

    progress2->setMidpoint(ccp(0,1));

    //设置计时器的宽高起始比例

    progress2->setBarChangeRate(ccp(0, 1));

    this->addChild(progress2);

    //第一个参数是时间,第二个参数是表示旋转100%

    CCProgressTo *to2 = CCProgressTo::create(10, 100);

    progress2->runAction(to2);

分类: 未分类 标签: