• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            colorful

            zc qq:1337220912

             

            static_cast與dynamic_cast轉(zhuǎn)換

            http://www.cnblogs.com/bastard/archive/2011/12/14/2288117.html

            一 C語言中存在著兩種類型轉(zhuǎn)換:

            隱式轉(zhuǎn)換和顯式轉(zhuǎn)換

            隱式轉(zhuǎn)換:不同數(shù)據(jù)類型之間賦值和運(yùn)算,函數(shù)調(diào)用傳遞參數(shù)……編譯器完成

            char ch;
            int i = ch;

            顯示轉(zhuǎn)換:在類型前增加 :(Type)變量 對(duì)變量進(jìn)行的轉(zhuǎn)換。用戶顯式增加

            char *pc = (char*)pb;
            void *ps = (void*)pa;


            二 C++
            中的類型轉(zhuǎn)換

              通過這兩種方式,C語言中大部分的類型轉(zhuǎn)換都可以順利進(jìn)行。

            至于能不能進(jìn)行轉(zhuǎn)換,轉(zhuǎn)換后的結(jié)果如何,編譯器不管需要用戶自己去控制。

              C++繼承了C中的隱式和顯式轉(zhuǎn)換的方式。但這種轉(zhuǎn)換并不是安全和嚴(yán)格的,

            加上C++本身對(duì)象模型的復(fù)雜性,C++增加了四個(gè)顯示轉(zhuǎn)換的關(guān)鍵字。(C++是強(qiáng)類型語言)

            static_cast,dynamic_cast,const_staticreinterpret_cast


            1 static_cast

            (1)用于基本的數(shù)據(jù)類型轉(zhuǎn)換(char,int),及指針之間的轉(zhuǎn)換

            復(fù)制代碼
            test_enum type = test_enum_1;

            char a ;
            int b = static_cast<int>(a);
            char c = static_cast<char>(b);
            type = static_cast<test_enum>(b);

            char* pa = NULL;
            int *pb = (int*)pa;
            //int *pb = static_cast<int*>(pa); //error
            //pa = static_cast<char*>(pb) //error
            char *pc = (char*)pb;
            //char *pc = static_cast<char*>(pb); //error

            void *p = static_cast<void*>(pa);
            pb = static_cast<int*>(p);
            pc = static_cast<char*>(p);
            復(fù)制代碼


            (2)類層次中基類與子類成員函數(shù)指針的轉(zhuǎn)換

             

            復(fù)制代碼
            class A
            {

            public:
            void set(){}
            };

            class B:public A
            {
            public:
            void set(){}
            };

            typedef void (A::*PS_MFunc)();   //指向類A的成員函數(shù)指針

            PS_MFunc func = &A::set;
            func = static_cast<PS_MFunc>(&B::set); //基類指向子類成員函數(shù)指針,必須進(jìn)行轉(zhuǎn)換
            復(fù)制代碼


            (3)類層次結(jié)構(gòu)中基類與子類指針或引用之間的轉(zhuǎn)換  

               上行轉(zhuǎn)換:子類指針或引用轉(zhuǎn)換成基類表示——安全

              下行轉(zhuǎn)換:基類指針或引用轉(zhuǎn)換成子類表示——危險(xiǎn)(沒有動(dòng)態(tài)類型檢查)

            復(fù)制代碼
            class A
            {
            };
            class B:public A
            {
            };
            class C:public A
            {
            };
            class D
            {
            };

            A objA;
            B objB;
            A* pObjA = new A();
            B* pObjB = new B();
            C* pObjC = new C();
            D* pObjD = new D();

            objA = static_cast<A&>(objB); //轉(zhuǎn)換為基類引用
            objA = static_cast<A>(objB);

            objB = static_cast<B>(objA); //error 不能進(jìn)行轉(zhuǎn)換

            pObjA = pObjB; //right 基類指針指向子類對(duì)象
            //objB = objA; //error 子類指針指向基類對(duì)象
            pObjA = static_cast<A*>(pObjB); //right 基類指針指向子類
            pObjB = static_cast<B*>(pObjA); //強(qiáng)制轉(zhuǎn)換 OK 基類到子類
            //pObjC = static_cast<C*>(pObjB); //error 繼承于統(tǒng)一類的派生指針之間轉(zhuǎn)換
            //pObjD = static_cast<D*>(pObjC); //error 兩個(gè)無關(guān)聯(lián)之間轉(zhuǎn)換
            復(fù)制代碼


            2 dynamic_cast

            (1)繼承關(guān)系的類指針對(duì)象或引用之間轉(zhuǎn)換

                    

            復(fù)制代碼
            class A
            {
            };
            class B:public A
            {
            };
            class C:public A
            {
            };
            class D
            {
            };

            A objA;
            B objB;
            A* pObjA = new A();
            B* pObjB = new B();
            C* pObjC = new C();
            D* pObjD = new D();
            //objA = dynamic_cast<A>(objB); //error 非引用

            objA = dynamic_cast<A&>(objB);
            //objB = dynamic_cast<B&>(objA); //error A 不是多態(tài)類型不能轉(zhuǎn)換 若有虛函數(shù)則可以進(jìn)行轉(zhuǎn)換

            pObjA = dynamic_cast<A*>(pObjB);
            //pObjB = dynamic_cast<B*>(pObjA); //error A 繼承關(guān)系 不是多態(tài)類型不能轉(zhuǎn)換
            //pObjB = dynamic_cast<B*>(pObjC); //error C 兄弟關(guān)系 不是多態(tài)類型不能轉(zhuǎn)換
            //pObjB = dynamic_cast<B*>(pObjD); //error D 沒有關(guān)系 不是多態(tài)類型不能轉(zhuǎn)換
            復(fù)制代碼

             

             

            (2)包含有虛函數(shù)之間對(duì)象指針的轉(zhuǎn)換   

            復(fù)制代碼
            class A
            {
            Public:
            Virtual ~A(){}
            };
            class B:public A
            {
            };
            class C:public A
            {
            };
            class D
            {
            Public:
            Virtual ~D(){}
            };
            pObjB = dynamic_cast<B*>(pObjA);    // worning 繼承關(guān)系 父類具有虛函數(shù) 多態(tài)
            pObjB = dynamic_cast<B*>(pObjD); //worning 沒有關(guān)系 D是多態(tài)類型可以轉(zhuǎn)換
            //以上結(jié)果:pObjB == NULL 此處會(huì)發(fā)生一個(gè)運(yùn)行時(shí)錯(cuò)誤
            復(fù)制代碼

                     也就是說除了基類指針指向子類對(duì)象,可以沒有虛函數(shù)外,其它要進(jìn)行dynamic_cast轉(zhuǎn)換必須具有虛函數(shù)才行。

            那這是為什么呢?下面繼續(xù)>


            (3)dynam_cast轉(zhuǎn)換的安全性

                     dynamic_cast是動(dòng)態(tài)轉(zhuǎn)換,只有在基類指針轉(zhuǎn)換為子類指針時(shí)才有意義。

            (子類指針轉(zhuǎn)換為基類指針本來就是可以的:基類指針指向子類對(duì)象OK)。

            但是基類指針轉(zhuǎn)換為子類指針,并不是每一次都有效:只有基類指針本身指向的是一個(gè)派生類的對(duì)象,

            然后將此基類指針轉(zhuǎn)換為對(duì)應(yīng)的派生類指針才是有效的。這種情況在表面上是無法判定的。此時(shí)dynamic就發(fā)揮了作用。

            情況1: static_cast轉(zhuǎn)換       

            復(fù)制代碼
            class A
            {
            };
            class B:public A
            {
            public:
            int m; //B 成員
            };


            A* pObjA = new A();
            B* pObjB = NULL;
            pObjB = static_cast<B*>(pObjA); //基類指針轉(zhuǎn)化為子類指針 成功轉(zhuǎn)換
            pObjB->m = 10;   //實(shí)際中pObj所指向的對(duì)象 是A類對(duì)象
            //上面會(huì)發(fā)生什么呢,在VC6.0中正常運(yùn)行。。。?

            //如果:

            pObjB = dynamic_cast<B*>(pObjA); //error 基類A沒有虛函數(shù) 不構(gòu)成多態(tài)
            復(fù)制代碼

            情況2:     dynamic_cast轉(zhuǎn)換    

            復(fù)制代碼
            class A
            {
            public:
            virtual ~A(){} //虛函數(shù) 多態(tài)
            };

            class B:public A
            {
            public:
            int m;
            };

            A* pObjA = new A();
            B* pObjB = NULL;
            pObjB = dynamic_cast<B*>(pObjA); //編譯通過
            //實(shí)際運(yùn)行結(jié)果:pObjB == NULL // dynamic_cast保證轉(zhuǎn)換無效 返回NULL
            復(fù)制代碼

                     dynamic_cast轉(zhuǎn)換不成功,則返回0。

            4 虛函數(shù)對(duì)于dynamic_cast轉(zhuǎn)換的作用

              為何使用dynamic_cast轉(zhuǎn)換類指針時(shí),需要虛函數(shù)呢。

            Dynamic_cast轉(zhuǎn)換是在運(yùn)行時(shí)進(jìn)行轉(zhuǎn)換,運(yùn)行時(shí)轉(zhuǎn)換就需要知道類對(duì)象的信息(繼承關(guān)系等)。

            如何在運(yùn)行時(shí)獲取到這個(gè)信息——虛函數(shù)表。

              C++對(duì)象模型中,對(duì)象實(shí)例最前面的就是虛函數(shù)表指針,

            通過這個(gè)指針可以獲取到該類對(duì)象的所有虛函數(shù),包括父類的。

            因?yàn)榕缮悤?huì)繼承基類的虛函數(shù)表,所以通過這個(gè)虛函數(shù)表,我們就可以知道該類對(duì)象的父類,在轉(zhuǎn)換的時(shí)候就可以用來判斷對(duì)象有無繼承關(guān)系。

              所以虛函數(shù)對(duì)于正確的基類指針轉(zhuǎn)換為子類指針是非常重要的。

            posted @ 2015-01-13 17:14 多彩人生 閱讀(370) | 評(píng)論 (0)編輯 收藏

            lua意見

            table for循環(huán)的例子,這么一個(gè)明顯的坑,都沒人作一個(gè)提醒,這樣肯定不利于一門語言的推廣與發(fā)展

            posted @ 2015-01-13 10:54 多彩人生 閱讀(885) | 評(píng)論 (0)編輯 收藏

            COCOS2DX,LUA,學(xué)習(xí)筆記

            http://blog.sina.com.cn/s/blog_4ceb1a410101d4tq.html

            以下大部分來自網(wǎng)絡(luò),只做學(xué)習(xí)記錄用。

            一 框架層面
            二 Lua層面
            三 工具層面
            四 android打包

            一 框架層
            整體來說,cocos2dX提供的一個(gè)簡便的框架,包含了渲染,動(dòng)畫,事件分發(fā),網(wǎng)絡(luò)還有UI,物理引擎等幾大模塊。對(duì)于做一個(gè)游戲從功能上來說已經(jīng)
            足夠了。我從這幾個(gè)方面分別探討下cocos2dX的優(yōu)缺點(diǎn)以及我們?cè)陧?xiàng)目中是如何用到的

            (1)渲染:渲染這塊,他的渲染數(shù)據(jù)跟Sprite進(jìn)行了綁定,然后對(duì)于openGl也是直接進(jìn)行了調(diào)用,而不是采用策略或者插件進(jìn)行調(diào)用。對(duì)于后期如果采用DX的話

            我覺得這塊比較冗余些。但是這些并不會(huì)影響游戲的渲染速度。它提供了batch來進(jìn)行批次渲染。所以在游戲里,我們對(duì)資源進(jìn)行了分組,然后分別用textPacker

            拼成一張圖片,格式呢 沒有alpha的采用 RGB565,有alpha的采用RGBA4444,要求高的話就采用RGBA8888,然后統(tǒng)一采用批次渲染。游戲的速度會(huì)提升很多。

            對(duì)于游戲數(shù)據(jù)的管理,cocos采用CCTextureCache這個(gè)單例類進(jìn)行管理。釋放可以采用全部釋放,還有釋放沒有用過的。并且也提供了異步加載動(dòng)畫資源的方法

            (PS:這個(gè)對(duì)于想做ARPG的同學(xué)來說,可是好東西了)。所以對(duì)于渲染這塊,我們盡量用批次,然后記得釋放內(nèi)存就OK了。

            (2)動(dòng)畫:cocos他提供了一套action機(jī)制。整體來說,是sprite run action。然后驅(qū)動(dòng)action里面的動(dòng)畫數(shù)據(jù),進(jìn)行播放動(dòng)畫。所有的動(dòng)畫都可以走action

            接口。對(duì)于使用者來說,也不用去關(guān)心其他東西,只需要初始化好你想要的動(dòng)作,然后把動(dòng)作數(shù)據(jù)塞給action。然后讓sprite run 就可以了。大概action就是這個(gè)

            流程。本來我們想自己寫自己的動(dòng)畫,但是到后期,因?yàn)樽约簩懸惶坠ぷ髁看?。所以?duì)于move,scale什么的仍舊采用cocos自己的。只有animation采用了我們的。

            但是現(xiàn)在想起來,完全沒有必要。cocos提供的已經(jīng)足夠了。我們所需要做的就是把動(dòng)作編輯器導(dǎo)出的動(dòng)畫數(shù)據(jù)用cocos的動(dòng)作翻譯(對(duì)于動(dòng)作編輯器我后面會(huì)講)寫
            這么一個(gè)層就好

            (3)事件分發(fā):cocos對(duì)于事件分發(fā)這塊就比較弱了。他是事件管理是通過存儲(chǔ)每一個(gè)object以及他接收事件的優(yōu)先級(jí)。然后進(jìn)行分發(fā)。但是他并沒有對(duì)場景進(jìn)行樹的管理

            。所以我們的改變就是建立起場景樹,然后事件分發(fā)先從場景頂端往下分發(fā)。期間每個(gè)節(jié)點(diǎn)可以設(shè)置是否響應(yīng)以及是否繼續(xù)往下傳遞的屬性(作為OC出身,這塊完全模仿蘋果那套)

            完全丟棄了cocos的那一套事件分發(fā)機(jī)制。對(duì)于場景樹的維護(hù),只需要每次step的時(shí)候更新下。所以對(duì)于查詢性能需要好好寫一下
            (4)網(wǎng)絡(luò):cocos提供了對(duì)curl的封裝。提供了http的一些簡單比如get,post的封裝。但對(duì)于斷點(diǎn)續(xù)傳等并沒有封裝。對(duì)于socket,cocos則完全沒有提供。我們采用了

            BSDSocket

            (5)UI:UI這邊,cocos提供了幾種簡單的控件,比如CCButton等。他們都繼承于CCSprite,但是太少。而且初始化方法是在是太過于奇葩。所以我們自己寫了一套UI。

            (其實(shí)無非也就是 button,label,tableView,scrollView,image還有textInput)他們也都繼承CCSprite。然后加入一些每個(gè)控件獨(dú)有的邏輯就可以了。最麻煩

            的應(yīng)該就是textInput了。照著cocos提供的input寫一遍,然后改改。(cocos提供了CCEditeBox,但是這貨的的解決辦法是在IOS上調(diào)用IOS的的控件。但是他是直接加到了egLView上,對(duì)于頁面移動(dòng),頁面關(guān)閉處理起來比較麻煩。
            所以這個(gè)暫時(shí)還不能用)

            二 lua
            為了讓游戲更有靈活性,cocos提供了lua。由C++做引擎,然后lua去寫邏輯。這樣就可以繞開蘋果的審核。我們就討論下C++與lua碰到的問題。

            (1)通訊:cocos采用了tolua++來進(jìn)行C++與lua的通訊??碈ocos2dXLuaLoad文件里,那些就是lua與C++通訊的一個(gè)層。具體通訊原理比如是通過

            棧,什么的我就不講了(其實(shí)我也不太懂)。這些東西tolua++都已經(jīng)替咱封裝好了。我們需要做的就是寫好C++文件
            然后生成load文件。在CCLuaEngine里調(diào)用你生成的那個(gè)load方法。lua就可以訪問C++了。需要說明的是,我們這邊盡量是lua調(diào)用C++的方法,C++不會(huì)去調(diào)用
            Lua的方法。調(diào)用也是通過callBack去調(diào)用。

            (2)問題:
            問題1.當(dāng)C++里面的函數(shù)需要傳遞lua指針時(shí):在C++里,lua的函數(shù)指針是一個(gè)int的變量。生成時(shí)用Lua_Func來代替。然后生成后執(zhí)行cocos2dX源碼

            里面build.xml。xml的左右就是定制tolua++的生成。在里面把lua的函數(shù)指針轉(zhuǎn)成了int了。具體的看xml內(nèi)容就可以了。
            問題2.在CCLuaEngine里調(diào)用那些load方法時(shí),是有順序的。一定要父類在前,子類在后。不然子類就無法訪問父類的方法。

            (3)寫法:
            lua都要加入module,變成模塊化,提高代碼的可讀性,然后require的時(shí)候一定要像cocos例子那樣,寫全路徑。不然打包android的時(shí)候
            就悲劇了。

            lua里面不要用全局變量持有sprite等C++數(shù)據(jù)。每個(gè)模塊也要像cocos那樣提供2個(gè)方法,一個(gè)是進(jìn)入該模塊的初始化方法,一個(gè)是退出
            該模塊的銷毀方法。

            對(duì)于lua這邊寫法,我們參考了 moai,還有corona,在lua那邊在封裝下C++,其他lua不是直接調(diào)用C++,盡量不要讓lua的寫法太過于
            活躍。不然以后調(diào)試真心頭大。

            (4)調(diào)試:lua的調(diào)試是最大的問題。僅憑一個(gè)lua_error所報(bào)錯(cuò)的信息是完全不夠的。而且Xcode對(duì)于lua的語法高亮支持的也不好。我們對(duì)此
            進(jìn)行了2方面的嘗試

            1.windows下,用decoda。然后也可以打斷點(diǎn)。

            2.mac下,暫時(shí)用Eclips加lua插件進(jìn)行寫lua,然后通過log進(jìn)行調(diào)試。不過最近想嘗試Vim,應(yīng)該會(huì)比之前靠譜。

            三 工具層面
            工具上,cocos提供了 cocosBuilder,我覺得他屬于一個(gè)集成的工具。想要追求全,必然不精。所以cocosBuilder不管是
            場景編輯,界面編輯,還是動(dòng)作編輯都不是很好用。所以我們采用的策略是用Flash的那一套。界面編輯用FlexBuilder的界面編輯,然后
            導(dǎo)出xml,寫一個(gè)xml翻譯類,根據(jù)xml創(chuàng)建面板,動(dòng)作編輯用FlashPro。然后用jsfl讀出flash信息,導(dǎo)出xml,用cocos自己的action機(jī)制
            去翻譯,演繹。場景編輯的話,我們的游戲并沒有用場景編輯的需求,所以沒有進(jìn)行研究,不過titleMap是個(gè)不錯(cuò)的選擇

            四 andrid打包
            android打包,其實(shí)難點(diǎn)在于調(diào)試。因?yàn)闊o法打斷點(diǎn)。本來lua就難調(diào)試,結(jié)果還要加上android。打包android那邊就是多看看NDK,JNI的
            一些資料,然后了解mk文件怎么書寫??纯碿ocos提供的那些sh腳本。打包大部分問題都是路徑的問題。根據(jù)錯(cuò)誤一步步來,別急,肯定能打上。

            打包完成以后,剩下就是調(diào)試。調(diào)試的話主要就是C++與java之間的通訊了。那就要多看看jni的一些東西。然后看cocos/platform/ 還有android

            里面的類。那些是c++跟java通訊的類。我們調(diào)試主要就在那打log。jni的原理我就不講了。。多看看懂一點(diǎn)就可以了。畢竟咱只是為了看懂,會(huì)照貓畫虎

            寫一點(diǎn)。沒必要深究。對(duì)了,android好奇葩,上網(wǎng)還需要權(quán)限配置?。?!在mainfest.xml配置權(quán)限???,搞了好久這個(gè)問題。


            好了,我對(duì)于cocos的見解就這么些??赡馨薱ocos所有的東西吧。都不細(xì),只是給大家當(dāng)一個(gè)消遣時(shí)間的東西。歡迎大家一起討論。
            最后,感謝cocos2dX的那些大牛們。是你們的無私讓我們才有機(jī)會(huì)這么容易接近游戲開發(fā)。謝謝你們

            posted @ 2015-01-01 17:12 多彩人生 閱讀(1113) | 評(píng)論 (0)編輯 收藏

            Lua的sleep函數(shù)

            一個(gè)不幸的消息是Lua中沒有內(nèi)置sleep函數(shù),我們需要DIY。有4種方法可以實(shí)現(xiàn)sleep函數(shù),如下:

            方法1

            --在一個(gè)死循環(huán)中設(shè)置一個(gè)跳出條件,但是這樣的做法會(huì)占用大量CPU資源,強(qiáng)烈不推薦使用哦

            function sleep(n)

               local t0 = os.clock()

               while os.clock() - t0 <= n do end

            方法2

            --調(diào)用系統(tǒng)的sleep函數(shù),不消耗CPU,但是Windows系統(tǒng)中沒有內(nèi)置這個(gè)命令(如果你又安裝Cygwin神馬的也行)。推薦在Linux系統(tǒng)中使用該方法

            function sleep(n)

               os.execute("sleep " .. n)

            方法3

            --雖然Windows沒有內(nèi)置sleep命令,但是我們可以稍微利用下ping命令的性質(zhì)

            function sleep(n)

               if n > 0 then os.execute("ping -n " .. tonumber(n + 1) .. " localhost > NUL") end

            方法4

            --使用socket庫中select函數(shù),可以傳遞0.1給n,使得休眠的時(shí)間精度達(dá)到毫秒級(jí)別。

            ‍require("socket")

            function sleep(n)

               socket.select(nil, nil, n)

            posted @ 2015-01-01 16:59 多彩人生 閱讀(1453) | 評(píng)論 (0)編輯 收藏

            用Cocos Code IDE寫Lua,如何與項(xiàng)目中的C++代碼和諧相處

            http://segmentfault.com/blog/hongliang/1190000000628902

            1、在用Cocos Code IDE建立新的cocos2d-x項(xiàng)目時(shí),最好選中Add Native Codes這個(gè)選項(xiàng),只有選中了它,項(xiàng)目目錄里才會(huì)有frameworks目錄,里面才會(huì)有AppDelegate.cpp等重要的C++類(程序真正的入口)。如果不勾選這個(gè),則Cocos Code IDE使用的是默認(rèn)編譯好的PrebuiltRuntimeLua.app程序,日后如果要更改C++部分的程序邏輯,還是需要frameworks目錄中的源代碼才行,所以建議Cocos Code IDE應(yīng)該把Add Native Codes這個(gè)選項(xiàng)默認(rèn)為選中狀態(tài)才對(duì)。

            Cocos Code IDE新建工程時(shí)最好選中Add Native Codes

            2、如果之前建立項(xiàng)目時(shí)沒有勾選Add Native Codes,也可以隨時(shí)通過右鍵菜單->Cocos Tools->Add Native Codes Support給補(bǔ)回來。

            Cocos Code IDE添加Native Codes

            3、有了frameworks/runtime-src/Classes目錄,就可以去修改AppDelegate.cpp等C++文件了。簡單修改一下,打印個(gè)log看看:

            簡單修改AppDelegate.cpp

            4、C++文件修改好了,需要編譯才能使修改生效,最簡單的辦法是在Cocos Code IDE中通過右鍵菜單->Cocos Tools->Build Custom Runtimes,選中Build Mac Runtime即可。

            Cocos Code IDE Build Mac Runtime

            Cocos Code IDE Build Mac Runtime

            5、編譯完成后,感興趣的話就能在runtime/mac目錄下看到多了一個(gè)CocosLuaGame.app程序包,這就是剛剛編譯生成的Mac程序,以后每次frameworks目錄下的C++文件有修改都需要再編譯一次。

            cocos2d-x編譯后的程序都在runtime/目錄下

            6、使用Cocos Code IDE的Build Custom Runtimes功能后,感興趣的話就會(huì)發(fā)現(xiàn)當(dāng)前項(xiàng)目的Debug Configurations發(fā)生了變化,之前的Select Runtime中執(zhí)行的程序是PrebuiltRuntimeLua.app,現(xiàn)在已經(jīng)被自動(dòng)改成了新編譯出來的CocosLuaGame.app程序。這一步是Cocos Code IDE自動(dòng)做的,而且非常重要,如果不更改這個(gè)選項(xiàng)的話,會(huì)導(dǎo)致調(diào)試時(shí)仍然執(zhí)行的是舊的C++代碼,新修改的代碼無法起作用。

            Cocos Code IDE的Debug選項(xiàng)要選中正確的啟動(dòng)程序

            7、如果修改C++文件比較頻繁,使用Cocos Code IDE的右鍵菜單來編譯還不如直接在命令行下敲命令快:

            cocos compile -p mac

            注意,如果始終使用命令行來編譯,從來沒用過Cocos Code IDE的右鍵菜單,那么需要手工修改Debug ConfigurationsSelect Runtime,確保調(diào)試時(shí)啟動(dòng)的是CocosLuaGame.app。

            8、現(xiàn)在來啟動(dòng)一下,可以看到C++文件中修改的代碼已經(jīng)生效了:

            修改后的AppDelegate.cpp文件起作用了

            posted @ 2014-12-30 11:19 多彩人生 閱讀(533) | 評(píng)論 (0)編輯 收藏

            cocos2dx3.2 lua學(xué)習(xí)

            官方網(wǎng)站永遠(yuǎn)是個(gè)不錯(cuò)的地方:
              http://cn.cocos2d-x.org/
              http://cn.cocos2d-x.org/tutorial/lists?id=82

            現(xiàn)在主流c++ + lua開發(fā), 主要是lua更新的優(yōu)勢(shì)

            新建lua項(xiàng)目
            lua項(xiàng)目有兩個(gè)模板,lua-template-default和lua-timeplate-runtime,
            可以用cocos new 命令,也可以用cocos code ide.
            用cocos new 命令創(chuàng)建lua工程
            指定用runtime模板
            cocos new -p com.game.zc -l lua -t runtime -d e:/project helloLua
            使用default模板
            cocos new -p com.game.zc -l lua -d e:/project helloLua

            用Cocos Code IDE 創(chuàng)建lua工程
            code ide 用的是runtime模板, 創(chuàng)建工程時(shí)記得選中"添加C++代碼", 這樣會(huì)在工程目錄下生成frameworks文件夾,里面是c++層的代碼

            Lua 調(diào)用自定義c++類
            http://cn.cocos2d-x.org/tutorial/show?id=1749
            http://cn.cocos2d-x.org/tutorial/show?id=1555
            http://cn.cocos2d-x.org/tutorial/show?id=1295
            在移植android時(shí),需要修改frameworks\cocos2d-x\cocos\scripting\lua-bindings\Android.mk文件
            將自定義的c++類文件添加到LOCAL_SRC_FILES, 文件所在目錄添加到LOCAL_C_INCLUDES
            如果是用Cocos Code IDE開發(fā),
            c++文件修改后,需要在Cocos Code IDE 里執(zhí)行如下操作才能生效, 項(xiàng)目右擊-->cocos 工具-->構(gòu)建自定義Runtime

            關(guān)于移植,
            1/ 可先用cocos compile -p android 編譯項(xiàng)目,打包時(shí)再用eclipse來打包
            2/ 使用Cocos Code IDE 很方便, 項(xiàng)目右擊-->cocos 工具-->為Android打包apk

            ----遇到的錯(cuò)誤------------------------------
            1
            http://www.cocoachina.com/bbs/read.php?tid=234772
            問題: LibclangError: [Error 193] %1 不是有效的 Win32. To provide Config.set_library_path() or Config.set_library_file().

            原因:Python、pyyaml、pyCheetah都用32位版本(ps:tolua目錄下README.mdown里有下載鏈接)
            如果還不行的話,就去github上下載最新的bindings-generator(平ps:下載地址: https://github.com/guojian822/bindings-generator)



            posted @ 2014-12-25 16:20 多彩人生 閱讀(2439) | 評(píng)論 (0)編輯 收藏

            使用cocos compile -p android時(shí)總是報(bào)錯(cuò)誤 BUILD FAILED \ant\build.xml:892

            http://www.cocoachina.com/bbs/read.php?tid=215700

            錯(cuò)誤如下。。。但是使用eclipse生成apk包時(shí)不收影響。。

            -dex:
                  [dex] input: E:\cocos\Mine\frameworks\runtime-src\proj.android\bin\classes
                  [dex] input: E:\cocos\Mine\frameworks\js-bindings\cocos2d-x\cocos\platform\android\java\bin\classes.jar
                  [dex] Pre-Dexing E:\cocos\Mine\frameworks\js-bindings\cocos2d-x\cocos\platform\android\java\bin\classes.jar -> classes-022efb48739f8be18b60e7464733537d.jar
                  [dex] Converting compiled files and external libraries into E:\cocos\Mine\frameworks\runtime-src\proj.android\bin\classes.dex...
                   [dx]
                   [dx] UNEXPECTED TOP-LEVEL EXCEPTION:
                   [dx]com.android.dx.util.DexException: Multiple dex files define Lorg/cocos2dx/lib/Cocos2dxAccelerometer;
                   [dx]     at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:592)
                   [dx]     at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:550)
                   [dx]     at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:531)
                   [dx]     at com.android.dx.merge.DexMerger.mergeDexBuffers(DexMerger.java:168)
                   [dx]     at com.android.dx.merge.DexMerger.merge(DexMerger.java:186)
                   [dx]     at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:300)
                   [dx]     at com.android.dx.command.dexer.Main.run(Main.java:232)
                   [dx]     at com.android.dx.command.dexer.Main.main(Main.java:174)
                   [dx]     at com.android.dx.command.Main.main(Main.java:91)
                   [dx]

            BUILD FAILED
            E:\BST\adt-bundle-windows-x86-20130917\sdk\tools\ant\build.xml:892: The following error occurred while executing this line:
            E:\BST\adt-bundle-windows-x86-20130917\sdk\tools\ant\build.xml:894: The following error occurred while executing this line:
            E:\BST\adt-bundle-windows-x86-20130917\sdk\tools\ant\build.xml:906: The following error occurred while executing this line:
            E:\BST\adt-bundle-windows-x86-20130917\sdk\tools\ant\build.xml:284: null returned: 2

            ---------------------------
            查資料發(fā)現(xiàn),發(fā)現(xiàn):
            cocos compile 的腳本里會(huì)自動(dòng)把“frameworks\js-bindings\cocos2d-x\cocos\platform\android\java\bin\classes.jar”(2dx的java代碼)添加到classes.dex中。
            而當(dāng)用eclipse打開android項(xiàng)目時(shí),默認(rèn)是沒有引入2dx的java類的,此時(shí)如果想正常運(yùn)行android項(xiàng)目,需要引入2dx的jar包,或者引入2dx的java源碼。
            如 果引入java的源碼,當(dāng)再次執(zhí)行“cocos compile”時(shí),2dx的java源碼生成的class文件,會(huì)跟默認(rèn)引入的“frameworks\js-bindings\cocos2d-x \cocos\platform\android\java\bin\classes.jar”發(fā)生沖突,會(huì)報(bào) “com.android.dx.util.DexException: Multiple dex files define ……”的錯(cuò)誤;
            如 果不引入java源碼,而是直接在“Build path”中引入了jar包(位于引擎的:frameworks\js-bindings\cocos2d-x\cocos\platform \android\java\bin\下的classes.jar),此時(shí)android的項(xiàng)目不報(bào)錯(cuò)了,但是直接使用eclipse生成apk包時(shí)會(huì)發(fā) 現(xiàn)安裝到手機(jī)上無法運(yùn)行,這是因?yàn)轫?xiàng)目需要的2dx文件沒有被打入到apk中。此時(shí),可以將對(duì)應(yīng)的jar包放到android項(xiàng)目的libs目錄里 (frameworks\runtime-src\proj.android\libs\),這樣生成的apk包就可以正常運(yùn)行了。
            但是,如果這樣做了,再次執(zhí)行“cocos compile”時(shí),發(fā)現(xiàn)還會(huì)報(bào)如上的錯(cuò)誤,這是因?yàn)槟_本里會(huì)默認(rèn)將libs目錄里的文件添加到classes.dex中。

            綜上所述:
            出現(xiàn)如上錯(cuò)誤的原因是在使用“cocos compile”腳本時(shí),2dx文件被重復(fù)添加了。
            不過,如果像我這樣操作,使用“cocos compile”編譯腳本(主要是因?yàn)樵撃_本會(huì)將js文件和資源拷貝的android項(xiàng)目里),使用eclipse將android項(xiàng)目打包成apk,可以忽略如上問題的;感覺很不爽。。。。

            -------------解決方法
            注釋掉project.properties文件中的#android.library.reference.1=../cocos2d/cocos/platform/android/java就可以啦?。。?

            posted @ 2014-12-25 12:10 多彩人生 閱讀(11415) | 評(píng)論 (0)編輯 收藏

            python處理帶空格目錄

            http://www.pylife.net/?p=159

            給python的帶空格目錄給搞了倆鐘頭,我實(shí)在郁悶的不行,我想到我的同行們不能跟我一樣這么郁悶,我blog被google收錄的還挺快,如果你搜索標(biāo)題上面的文字,基本上都能搜到。
            原來的程序是這樣的:
            一個(gè)小小的新建:
            os.system(r"mkdir %s"%(dirname))
            比如你要是新建一個(gè):C:\Program Files\Adobe\
            這個(gè)時(shí)候問題就出來了,python的該命令只會(huì)新建:C:\Program,空格后面的東西全部去掉了。
            問題已經(jīng)出來了
            0-------------------------------------------------------------------------------------------------------------------------------------------------0
            解決:
            r'mkdir "%s"' % (dirname)
            其中%s兩邊的是雙引號(hào),不能是單引號(hào),這個(gè)是跟最后的命令的形成有關(guān)系,命令中可以存在雙引號(hào)或者沒有引號(hào),但是不能是單引號(hào)
            這樣,新建目錄的時(shí)候就會(huì)全部包含起來了,不會(huì)有空格的斷代。
            這讓我fuck python,love python

            posted @ 2014-12-23 17:50 多彩人生 閱讀(804) | 評(píng)論 (0)編輯 收藏

            一些不錯(cuò)的博客


            http://www.cnblogs.com/stephen-liu74/

            posted @ 2014-12-19 19:19 多彩人生 閱讀(192) | 評(píng)論 (0)編輯 收藏

            一個(gè)很不錯(cuò)的lua教程

            http://www.cnblogs.com/stephen-liu74/category/360139.html

              Lua可以調(diào)用C函數(shù)的能力將極大的提高Lua的可擴(kuò)展性和可用性。對(duì)于有些和操作系統(tǒng)相關(guān)的功能,或者是對(duì)效率要求較高的模塊,我們完全可以通過C函數(shù) 來實(shí)現(xiàn),之后再通過Lua調(diào)用指定的C函數(shù)。對(duì)于那些可被Lua調(diào)用的C函數(shù)而言,其接口必須遵循Lua要求的形式,即typedef int (*lua_CFunction)(lua_State* L)。 簡單說明一下,該函數(shù)類型僅僅包含一個(gè)表示Lua環(huán)境的指針作為其唯一的參數(shù),實(shí)現(xiàn)者可以通過該指針進(jìn)一步獲取Lua代碼中實(shí)際傳入的參數(shù)。返回值是整 型,表示該C函數(shù)將返回給Lua代碼的返回值數(shù)量,如果沒有返回值,則return 0即可。需要說明的是,C函數(shù)無法直接將真正的返回值返回給Lua代碼,而是通過虛擬棧來傳遞Lua代碼和C函數(shù)之間的調(diào)用參數(shù)和返回值的。這里我們將介 紹兩種Lua調(diào)用C函數(shù)的規(guī)則。
                1. C函數(shù)作為應(yīng)用程序的一部分。
            復(fù)制代碼
             1 #include <stdio.h>  2 #include <string.h>  3 #include <lua.hpp>  4 #include <lauxlib.h>  5 #include <lualib.h>  6   7 //待Lua調(diào)用的C注冊(cè)函數(shù)。  8 static int add2(lua_State* L)  9 { 10     //檢查棧中的參數(shù)是否合法,1表示Lua調(diào)用時(shí)的第一個(gè)參數(shù)(從左到右),依此類推。 11     //如果Lua代碼在調(diào)用時(shí)傳遞的參數(shù)不為number,該函數(shù)將報(bào)錯(cuò)并終止程序的執(zhí)行。 12     double op1 = luaL_checknumber(L,1); 13     double op2 = luaL_checknumber(L,2); 14     //將函數(shù)的結(jié)果壓入棧中。如果有多個(gè)返回值,可以在這里多次壓入棧中。 15     lua_pushnumber(L,op1 + op2); 16     //返回值用于提示該C函數(shù)的返回值數(shù)量,即壓入棧中的返回值數(shù)量。 17     return 1; 18 } 19  20 //另一個(gè)待Lua調(diào)用的C注冊(cè)函數(shù)。 21 static int sub2(lua_State* L) 22 { 23     double op1 = luaL_checknumber(L,1); 24     double op2 = luaL_checknumber(L,2); 25     lua_pushnumber(L,op1 - op2); 26     return 1; 27 } 28  29 const char* testfunc = "print(add2(1.0,2.0)) print(sub2(20.1,19))"; 30  31 int main() 32 { 33     lua_State* L = luaL_newstate(); 34     luaL_openlibs(L); 35     //將指定的函數(shù)注冊(cè)為Lua的全局函數(shù)變量,其中第一個(gè)字符串參數(shù)為Lua代碼 36     //在調(diào)用C函數(shù)時(shí)使用的全局函數(shù)名,第二個(gè)參數(shù)為實(shí)際C函數(shù)的指針。 37     lua_register(L, "add2", add2); 38     lua_register(L, "sub2", sub2); 39     //在注冊(cè)完所有的C函數(shù)之后,即可在Lua的代碼塊中使用這些已經(jīng)注冊(cè)的C函數(shù)了。 40     if (luaL_dostring(L,testfunc)) 41         printf("Failed to invoke.\n"); 42     lua_close(L); 43     return 0; 44 }
            復(fù)制代碼

                2. C函數(shù)庫成為Lua的模塊。
                將包含C函數(shù)的代碼生成庫文件,如Linux的so,或Windows的DLL,同時(shí)拷貝到Lua代碼所在的當(dāng)前目錄,或者是LUA_CPATH環(huán)境變 量所指向的目錄,以便于Lua解析器可以正確定位到他們。在我當(dāng)前的Windows系統(tǒng)中,我將其copy到"C:\Program Files\Lua\5.1\clibs\",這里包含了所有Lua可調(diào)用的C庫。見如下C語言代碼和關(guān)鍵性注釋:

            復(fù)制代碼
             1 #include <stdio.h>  2 #include <string.h>  3 #include <lua.hpp>  4 #include <lauxlib.h>  5 #include <lualib.h>  6   7 //待注冊(cè)的C函數(shù),該函數(shù)的聲明形式在上面的例子中已經(jīng)給出。  8 //需要說明的是,該函數(shù)必須以C的形式被導(dǎo)出,因此extern "C"是必須的。  9 //函數(shù)代碼和上例相同,這里不再贅述。 10 extern "C" int add(lua_State* L)  11 { 12     double op1 = luaL_checknumber(L,1); 13     double op2 = luaL_checknumber(L,2); 14     lua_pushnumber(L,op1 + op2); 15     return 1; 16 } 17  18 extern "C" int sub(lua_State* L) 19 { 20     double op1 = luaL_checknumber(L,1); 21     double op2 = luaL_checknumber(L,2); 22     lua_pushnumber(L,op1 - op2); 23     return 1; 24 } 25  26 //luaL_Reg結(jié)構(gòu)體的第一個(gè)字段為字符串,在注冊(cè)時(shí)用于通知Lua該函數(shù)的名字。 27 //第一個(gè)字段為C函數(shù)指針。 28 //結(jié)構(gòu)體數(shù)組中的最后一個(gè)元素的兩個(gè)字段均為NULL,用于提示Lua注冊(cè)函數(shù)已經(jīng)到達(dá)數(shù)組的末尾。 29 static luaL_Reg mylibs[] = {  30     {"add", add}, 31     {"sub", sub}, 32     {NULL, NULL}  33 };  34  35 //該C庫的唯一入口函數(shù)。其函數(shù)簽名等同于上面的注冊(cè)函數(shù)。見如下幾點(diǎn)說明: 36 //1. 我們可以將該函數(shù)簡單的理解為模塊的工廠函數(shù)。 37 //2. 其函數(shù)名必須為luaopen_xxx,其中xxx表示library名稱。Lua代碼require "xxx"需要與之對(duì)應(yīng)。 38 //3. 在luaL_register的調(diào)用中,其第一個(gè)字符串參數(shù)為模塊名"xxx",第二個(gè)參數(shù)為待注冊(cè)函數(shù)的數(shù)組。 39 //4. 需要強(qiáng)調(diào)的是,所有需要用到"xxx"的代碼,不論C還是Lua,都必須保持一致,這是Lua的約定, 40 //   否則將無法調(diào)用。 41 extern "C" __declspec(dllexport) 42 int luaopen_mytestlib(lua_State* L)  43 { 44     const char* libName = "mytestlib"; 45     luaL_register(L,libName,mylibs); 46     return 1; 47 }
            復(fù)制代碼

                見如下Lua代碼:

            1 require "mytestlib"  --指定包名稱 2  3 --在調(diào)用時(shí),必須是package.function 4 print(mytestlib.add(1.0,2.0)) 5 print(mytestlib.sub(20.1,19))

            posted @ 2014-12-19 19:12 多彩人生 閱讀(446) | 評(píng)論 (0)編輯 收藏

            僅列出標(biāo)題
            共25頁: 1 2 3 4 5 6 7 8 9 Last 

            導(dǎo)航

            統(tǒng)計(jì)

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            久久人人爽人人爽人人av东京热 | 精品久久久久久无码人妻热| 久久精品一区二区国产| 国产精品VIDEOSSEX久久发布| 久久精品国产亚洲av瑜伽| 欧美成人免费观看久久| 国产精品久久国产精品99盘| 狠狠色综合久久久久尤物| 久久久久久久女国产乱让韩| 久久精品国产精品青草| 99久久夜色精品国产网站| 久久精品国产黑森林| 久久精品www人人爽人人| 亚洲AV伊人久久青青草原| 久久不射电影网| 精品久久久久久无码中文字幕一区 | 久久精品国产一区二区| 久久91精品国产91久久小草| 久久精品国产99久久久古代| 久久国产视屏| 99久久婷婷国产一区二区| 99精品久久精品一区二区| 久久偷看各类wc女厕嘘嘘| 欧美伊人久久大香线蕉综合| 国产精品欧美久久久久天天影视 | 久久亚洲中文字幕精品一区四| 久久久久亚洲AV成人片| 国内精品人妻无码久久久影院导航| 久久久久亚洲av毛片大| 成人a毛片久久免费播放| 国产欧美久久久精品| www.久久99| 亚洲成色999久久网站| 91久久国产视频| 久久久久无码国产精品不卡| 国产精品久久网| 久久国产精品免费| 一本色道久久88综合日韩精品| 久久久免费观成人影院| 四虎久久影院| 色综合久久无码中文字幕|