• <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轉換

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

            一 C語言中存在著兩種類型轉換:

            隱式轉換和顯式轉換

            隱式轉換:不同數據類型之間賦值和運算,函數調用傳遞參數……編譯器完成

            char ch;
            int i = ch;

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

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


            二 C++
            中的類型轉換

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

            至于能不能進行轉換,轉換后的結果如何,編譯器不管需要用戶自己去控制。

              C++繼承了C中的隱式和顯式轉換的方式。但這種轉換并不是安全和嚴格的,

            加上C++本身對象模型的復雜性,C++增加了四個顯示轉換的關鍵字。(C++是強類型語言)

            static_castdynamic_castconst_staticreinterpret_cast


            1 static_cast

            (1)用于基本的數據類型轉換(char,int),及指針之間的轉換

            復制代碼
            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);
            復制代碼


            (2)類層次中基類與子類成員函數指針的轉換

             

            復制代碼
            class A
            {

            public:
            void set(){}
            };

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

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

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


            (3)類層次結構中基類與子類指針或引用之間的轉換  

               上行轉換:子類指針或引用轉換成基類表示——安全

              下行轉換:基類指針或引用轉換成子類表示——危險(沒有動態類型檢查)

            復制代碼
            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); //轉換為基類引用
            objA = static_cast<A>(objB);

            objB = static_cast<B>(objA); //error 不能進行轉換

            pObjA = pObjB; //right 基類指針指向子類對象
            //objB = objA; //error 子類指針指向基類對象
            pObjA = static_cast<A*>(pObjB); //right 基類指針指向子類
            pObjB = static_cast<B*>(pObjA); //強制轉換 OK 基類到子類
            //pObjC = static_cast<C*>(pObjB); //error 繼承于統一類的派生指針之間轉換
            //pObjD = static_cast<D*>(pObjC); //error 兩個無關聯之間轉換
            復制代碼


            2 dynamic_cast

            (1)繼承關系的類指針對象或引用之間轉換

                    

            復制代碼
            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 不是多態類型不能轉換 若有虛函數則可以進行轉換

            pObjA = dynamic_cast<A*>(pObjB);
            //pObjB = dynamic_cast<B*>(pObjA); //error A 繼承關系 不是多態類型不能轉換
            //pObjB = dynamic_cast<B*>(pObjC); //error C 兄弟關系 不是多態類型不能轉換
            //pObjB = dynamic_cast<B*>(pObjD); //error D 沒有關系 不是多態類型不能轉換
            復制代碼

             

             

            (2)包含有虛函數之間對象指針的轉換   

            復制代碼
            class A
            {
            Public:
            Virtual ~A(){}
            };
            class B:public A
            {
            };
            class C:public A
            {
            };
            class D
            {
            Public:
            Virtual ~D(){}
            };
            pObjB = dynamic_cast<B*>(pObjA);    // worning 繼承關系 父類具有虛函數 多態
            pObjB = dynamic_cast<B*>(pObjD); //worning 沒有關系 D是多態類型可以轉換
            //以上結果:pObjB == NULL 此處會發生一個運行時錯誤
            復制代碼

                     也就是說除了基類指針指向子類對象,可以沒有虛函數外,其它要進行dynamic_cast轉換必須具有虛函數才行。

            那這是為什么呢?下面繼續>


            (3)dynam_cast轉換的安全性

                     dynamic_cast是動態轉換,只有在基類指針轉換為子類指針時才有意義。

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

            但是基類指針轉換為子類指針,并不是每一次都有效:只有基類指針本身指向的是一個派生類的對象,

            然后將此基類指針轉換為對應的派生類指針才是有效的。這種情況在表面上是無法判定的。此時dynamic就發揮了作用。

            情況1: static_cast轉換       

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


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

            //如果:

            pObjB = dynamic_cast<B*>(pObjA); //error 基類A沒有虛函數 不構成多態
            復制代碼

            情況2:     dynamic_cast轉換    

            復制代碼
            class A
            {
            public:
            virtual ~A(){} //虛函數 多態
            };

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

            A* pObjA = new A();
            B* pObjB = NULL;
            pObjB = dynamic_cast<B*>(pObjA); //編譯通過
            //實際運行結果:pObjB == NULL // dynamic_cast保證轉換無效 返回NULL
            復制代碼

                     dynamic_cast轉換不成功,則返回0

            4 虛函數對于dynamic_cast轉換的作用

              為何使用dynamic_cast轉換類指針時,需要虛函數呢。

            Dynamic_cast轉換是在運行時進行轉換,運行時轉換就需要知道類對象的信息(繼承關系等)。

            如何在運行時獲取到這個信息——虛函數表。

              C++對象模型中,對象實例最前面的就是虛函數表指針,

            通過這個指針可以獲取到該類對象的所有虛函數,包括父類的。

            因為派生類會繼承基類的虛函數表,所以通過這個虛函數表,我們就可以知道該類對象的父類,在轉換的時候就可以用來判斷對象有無繼承關系。

              所以虛函數對于正確的基類指針轉換為子類指針是非常重要的。

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

            lua意見

            table for循環的例子,這么一個明顯的坑,都沒人作一個提醒,這樣肯定不利于一門語言的推廣與發展

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

            COCOS2DX,LUA,學習筆記

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

            以下大部分來自網絡,只做學習記錄用。

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

            一 框架層
            整體來說,cocos2dX提供的一個簡便的框架,包含了渲染,動畫,事件分發,網絡還有UI,物理引擎等幾大模塊。對于做一個游戲從功能上來說已經
            足夠了。我從這幾個方面分別探討下cocos2dX的優缺點以及我們在項目中是如何用到的

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

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

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

            對于游戲數據的管理,cocos采用CCTextureCache這個單例類進行管理。釋放可以采用全部釋放,還有釋放沒有用過的。并且也提供了異步加載動畫資源的方法

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

            (2)動畫:cocos他提供了一套action機制。整體來說,是sprite run action。然后驅動action里面的動畫數據,進行播放動畫。所有的動畫都可以走action

            接口。對于使用者來說,也不用去關心其他東西,只需要初始化好你想要的動作,然后把動作數據塞給action。然后讓sprite run 就可以了。大概action就是這個

            流程。本來我們想自己寫自己的動畫,但是到后期,因為自己寫一套工作量大。所以對于move,scale什么的仍舊采用cocos自己的。只有animation采用了我們的。

            但是現在想起來,完全沒有必要。cocos提供的已經足夠了。我們所需要做的就是把動作編輯器導出的動畫數據用cocos的動作翻譯(對于動作編輯器我后面會講)寫
            這么一個層就好

            (3)事件分發:cocos對于事件分發這塊就比較弱了。他是事件管理是通過存儲每一個object以及他接收事件的優先級。然后進行分發。但是他并沒有對場景進行樹的管理

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

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

            BSDSocket

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

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

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

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

            (1)通訊:cocos采用了tolua++來進行C++與lua的通訊。看Cocos2dXLuaLoad文件里,那些就是lua與C++通訊的一個層。具體通訊原理比如是通過

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

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

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

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

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

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

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

            1.windows下,用decoda。然后也可以打斷點。

            2.mac下,暫時用Eclips加lua插件進行寫lua,然后通過log進行調試。不過最近想嘗試Vim,應該會比之前靠譜。

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

            四 andrid打包
            android打包,其實難點在于調試。因為無法打斷點。本來lua就難調試,結果還要加上android。打包android那邊就是多看看NDK,JNI的
            一些資料,然后了解mk文件怎么書寫。看看cocos提供的那些sh腳本。打包大部分問題都是路徑的問題。根據錯誤一步步來,別急,肯定能打上。

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

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

            寫一點。沒必要深究。對了,android好奇葩,上網還需要權限配置!!!在mainfest.xml配置權限。靠,搞了好久這個問題。


            好了,我對于cocos的見解就這么些。可能包含了cocos所有的東西吧。都不細,只是給大家當一個消遣時間的東西。歡迎大家一起討論。
            最后,感謝cocos2dX的那些大牛們。是你們的無私讓我們才有機會這么容易接近游戲開發。謝謝你們

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

            Lua的sleep函數

            一個不幸的消息是Lua中沒有內置sleep函數,我們需要DIY。有4種方法可以實現sleep函數,如下:

            方法1

            --在一個死循環中設置一個跳出條件,但是這樣的做法會占用大量CPU資源,強烈不推薦使用哦

            function sleep(n)

               local t0 = os.clock()

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

            方法2

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

            function sleep(n)

               os.execute("sleep " .. n)

            方法3

            --雖然Windows沒有內置sleep命令,但是我們可以稍微利用下ping命令的性質

            function sleep(n)

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

            方法4

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

            ‍require("socket")

            function sleep(n)

               socket.select(nil, nil, n)

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

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

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

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

            Cocos Code IDE新建工程時最好選中Add Native Codes

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

            Cocos Code IDE添加Native Codes

            3、有了frameworks/runtime-src/Classes目錄,就可以去修改AppDelegate.cpp等C++文件了。簡單修改一下,打印個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目錄下看到多了一個CocosLuaGame.app程序包,這就是剛剛編譯生成的Mac程序,以后每次frameworks目錄下的C++文件有修改都需要再編譯一次。

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

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

            Cocos Code IDE的Debug選項要選中正確的啟動程序

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

            cocos compile -p mac

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

            8、現在來啟動一下,可以看到C++文件中修改的代碼已經生效了:

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

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

            cocos2dx3.2 lua學習

            官方網站永遠是個不錯的地方:
              http://cn.cocos2d-x.org/
              http://cn.cocos2d-x.org/tutorial/lists?id=82

            現在主流c++ + lua開發, 主要是lua更新的優勢

            新建lua項目
            lua項目有兩個模板,lua-template-default和lua-timeplate-runtime,
            可以用cocos new 命令,也可以用cocos code ide.
            用cocos new 命令創建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 創建lua工程
            code ide 用的是runtime模板, 創建工程時記得選中"添加C++代碼", 這樣會在工程目錄下生成frameworks文件夾,里面是c++層的代碼

            Lua 調用自定義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時,需要修改frameworks\cocos2d-x\cocos\scripting\lua-bindings\Android.mk文件
            將自定義的c++類文件添加到LOCAL_SRC_FILES, 文件所在目錄添加到LOCAL_C_INCLUDES
            如果是用Cocos Code IDE開發,
            c++文件修改后,需要在Cocos Code IDE 里執行如下操作才能生效, 項目右擊-->cocos 工具-->構建自定義Runtime

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

            ----遇到的錯誤------------------------------
            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 多彩人生 閱讀(2428) | 評論 (0)編輯 收藏

            使用cocos compile -p android時總是報錯誤 BUILD FAILED \ant\build.xml:892

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

            錯誤如下。。。但是使用eclipse生成apk包時不收影響。。

            -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

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

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

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

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

            python處理帶空格目錄

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

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

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

            一些不錯的博客


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

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

            一個很不錯的lua教程

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

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

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

            復制代碼
             1 #include <stdio.h>  2 #include <string.h>  3 #include <lua.hpp>  4 #include <lauxlib.h>  5 #include <lualib.h>  6   7 //待注冊的C函數,該函數的聲明形式在上面的例子中已經給出。  8 //需要說明的是,該函數必須以C的形式被導出,因此extern "C"是必須的。  9 //函數代碼和上例相同,這里不再贅述。 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結構體的第一個字段為字符串,在注冊時用于通知Lua該函數的名字。 27 //第一個字段為C函數指針。 28 //結構體數組中的最后一個元素的兩個字段均為NULL,用于提示Lua注冊函數已經到達數組的末尾。 29 static luaL_Reg mylibs[] = {  30     {"add", add}, 31     {"sub", sub}, 32     {NULL, NULL}  33 };  34  35 //該C庫的唯一入口函數。其函數簽名等同于上面的注冊函數。見如下幾點說明: 36 //1. 我們可以將該函數簡單的理解為模塊的工廠函數。 37 //2. 其函數名必須為luaopen_xxx,其中xxx表示library名稱。Lua代碼require "xxx"需要與之對應。 38 //3. 在luaL_register的調用中,其第一個字符串參數為模塊名"xxx",第二個參數為待注冊函數的數組。 39 //4. 需要強調的是,所有需要用到"xxx"的代碼,不論C還是Lua,都必須保持一致,這是Lua的約定, 40 //   否則將無法調用。 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 }
            復制代碼

                見如下Lua代碼:

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

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

            僅列出標題
            共25頁: 1 2 3 4 5 6 7 8 9 Last 

            導航

            統計

            常用鏈接

            留言簿(3)

            隨筆分類

            隨筆檔案

            搜索

            最新評論

            閱讀排行榜

            評論排行榜

            久久久国产精品福利免费| 国产A级毛片久久久精品毛片| 国产精品久久自在自线观看| 久久精品国产72国产精福利| 久久久久高潮毛片免费全部播放| 91超碰碰碰碰久久久久久综合| 一本一本久久A久久综合精品| 久久夜色精品国产欧美乱| 亚洲国产视频久久| 国产精品久久久久久久午夜片| 亚洲AV日韩AV永久无码久久| 亚洲国产香蕉人人爽成AV片久久| 99久久无码一区人妻| 久久精品日日躁夜夜躁欧美| 2021国内久久精品| 久久免费视频1| 91精品国产91久久| 久久综合九色综合网站| 老司机午夜网站国内精品久久久久久久久 | 97久久国产亚洲精品超碰热| 久久精品人妻一区二区三区| 国内精品久久久人妻中文字幕| 少妇久久久久久被弄高潮| 久久精品一区二区影院| 久久久久免费看成人影片| 日韩久久久久中文字幕人妻| 午夜精品久久久久9999高清| 久久香蕉一级毛片| 精品久久久久久久无码| 国产色综合久久无码有码| 无码人妻少妇久久中文字幕| 国产成人久久精品麻豆一区| 国产亚洲婷婷香蕉久久精品| 99久久99久久精品国产片果冻| 久久亚洲私人国产精品vA| 国内精品久久久久久久久电影网| 无码人妻久久一区二区三区蜜桃 | 少妇久久久久久被弄高潮| 亚洲午夜精品久久久久久浪潮| 久久毛片免费看一区二区三区| 91精品婷婷国产综合久久|