青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

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)變量 對變量進(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++本身對象模型的復(fù)雜性,C++增加了四個(gè)顯示轉(zhuǎn)換的關(guān)鍵字。(C++是強(qiáng)類型語言)

static_castdynamic_castconst_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 基類指針指向子類對象
//objB = objA; //error 子類指針指向基類對象
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)系的類指針對象或引用之間轉(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ù)之間對象指針的轉(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ù)制代碼

         也就是說除了基類指針指向子類對象,可以沒有虛函數(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)換為基類指針本來就是可以的:基類指針指向子類對象OK)。

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

然后將此基類指針轉(zhuǎn)換為對應(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所指向的對象 是A類對象
//上面會(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ù)對于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)換就需要知道類對象的信息(繼承關(guān)系等)。

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

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

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

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

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

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

lua意見

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

posted @ 2015-01-13 10:54 多彩人生 閱讀(891) | 評(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,物理引擎等幾大模塊。對于做一個(gè)游戲從功能上來說已經(jīng)
足夠了。我從這幾個(gè)方面分別探討下cocos2dX的優(yōu)缺點(diǎn)以及我們在項(xiàng)目中是如何用到的

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

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

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

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

(PS:這個(gè)對于想做ARPG的同學(xué)來說,可是好東西了)。所以對于渲染這塊,我們盡量用批次,然后記得釋放內(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

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

流程。本來我們想自己寫自己的動(dòng)畫,但是到后期,因?yàn)樽约簩懸惶坠ぷ髁看蟆K詫τ趍ove,scale什么的仍舊采用cocos自己的。只有animation采用了我們的。

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

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

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

完全丟棄了cocos的那一套事件分發(fā)機(jī)制。對于場景樹的維護(hù),只需要每次step的時(shí)候更新下。所以對于查詢性能需要好好寫一下
(4)網(wǎng)絡(luò):cocos提供了對curl的封裝。提供了http的一些簡單比如get,post的封裝。但對于斷點(diǎn)續(xù)傳等并沒有封裝。對于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上,對于頁面移動(dòng),頁面關(guān)閉處理起來比較麻煩。
所以這個(gè)暫時(shí)還不能用)

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

(1)通訊:cocos采用了tolua++來進(jìn)行C++與lua的通訊。看Cocos2dXLuaLoad文件里,那些就是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è)是退出
該模塊的銷毀方法。

對于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對于lua的語法高亮支持的也不好。我們對此
進(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文件怎么書寫。看看cocos提供的那些sh腳本。打包大部分問題都是路徑的問題。根據(jù)錯(cuò)誤一步步來,別急,肯定能打上。

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

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

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


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

posted @ 2015-01-01 17:12 多彩人生 閱讀(1134) | 評(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 多彩人生 閱讀(1459) | 評(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)才對。

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 多彩人生 閱讀(538) | 評(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)勢

新建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 多彩人生 閱讀(2443) | 評(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í),可以將對應(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 多彩人生 閱讀(11424) | 評(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 多彩人生 閱讀(809) | 評(píng)論 (0)編輯 收藏

一些不錯(cuò)的博客


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

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

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

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

  Lua可以調(diào)用C函數(shù)的能力將極大的提高Lua的可擴(kuò)展性和可用性。對于有些和操作系統(tǒng)相關(guān)的功能,或者是對效率要求較高的模塊,我們完全可以通過C函數(shù) 來實(shí)現(xiàn),之后再通過Lua調(diào)用指定的C函數(shù)。對于那些可被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注冊函數(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注冊函數(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ù)注冊為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函數(shù)之后,即可在Lua的代碼塊中使用這些已經(jīng)注冊的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函數(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è)字段為字符串,在注冊時(shí)用于通知Lua該函數(shù)的名字。 27 //第一個(gè)字段為C函數(shù)指針。 28 //結(jié)構(gòu)體數(shù)組中的最后一個(gè)元素的兩個(gè)字段均為NULL,用于提示Lua注冊函數(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ù)簽名等同于上面的注冊函數(shù)。見如下幾點(diǎn)說明: 36 //1. 我們可以將該函數(shù)簡單的理解為模塊的工廠函數(shù)。 37 //2. 其函數(shù)名必須為luaopen_xxx,其中xxx表示library名稱。Lua代碼require "xxx"需要與之對應(yīng)。 38 //3. 在luaL_register的調(diào)用中,其第一個(gè)字符串參數(shù)為模塊名"xxx",第二個(gè)參數(shù)為待注冊函數(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 多彩人生 閱讀(452) | 評(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)論排行榜

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩高清一区| 亚洲三级影院| 久久高清免费观看| 一本久久综合亚洲鲁鲁| 91久久在线视频| 欧美呦呦网站| 性欧美18~19sex高清播放| 一区二区三区鲁丝不卡| 一区二区三欧美| 午夜精品久久久久久久久久久久久 | 欧美日韩国产bt| 国产精品久久久久久妇女6080| 老巨人导航500精品| 久久久99爱| 欧美日韩国产一区二区三区| 国产精品毛片在线| 亚洲高清久久网| 亚洲欧美www| 欧美国产日韩一区| 国产精品免费福利| 亚洲日本中文字幕| 性色av一区二区三区在线观看| 久久久综合激的五月天| 欧美激情视频一区二区三区免费 | 亚洲欧洲av一区二区| 久久久精品日韩| 99热这里只有精品8| 久久九九热re6这里有精品 | 中日韩美女免费视频网站在线观看| 性欧美暴力猛交69hd| 欧美激情一区| 亚洲麻豆av| 欧美黄污视频| 久久久夜精品| 在线观看三级视频欧美| 亚洲欧美国产精品专区久久| 亚洲清纯自拍| 欧美日韩伦理在线免费| 日韩午夜在线播放| 亚洲日韩欧美视频一区| 欧美激情中文字幕一区二区| 亚洲毛片在线观看.| avtt综合网| 国产农村妇女精品一二区| 香蕉乱码成人久久天堂爱免费| 性色av香蕉一区二区| 激情成人中文字幕| 亚洲第一福利在线观看| 欧美日韩国产三级| 先锋资源久久| 欧美18av| 欧美一区二区三区免费观看| 欧美在线高清视频| 欧美有码在线观看视频| 尤妮丝一区二区裸体视频| 亚洲国产精品日韩| 国产精品色一区二区三区| 久久亚洲精品伦理| 国产精品一区二区在线观看| 麻豆成人91精品二区三区| 国产精品久久久久久久电影| 欧美成人午夜剧场免费观看| 欧美日韩一区二区在线播放| 老司机aⅴ在线精品导航| 国产精品久久久久久久7电影 | 亚洲人成网站999久久久综合| 99天天综合性| 亚洲日本中文字幕免费在线不卡| 欧美一区二区三区四区高清 | 国产视频在线一区二区| 91久久精品视频| 亚洲国内高清视频| 久久精品国产精品亚洲| 午夜亚洲精品| 国产精品v片在线观看不卡| 91久久国产自产拍夜夜嗨| 亚洲精品久久久久久久久久久久久 | 国产色综合久久| 欧美亚洲视频在线看网址| 久久久久久久网| 伊伊综合在线| 欧美韩日一区二区| 91久久久久久国产精品| 亚洲一品av免费观看| 国产精品成人一区二区三区夜夜夜| 亚洲精品国产无天堂网2021| 久久精品一区| 亚洲国产日韩欧美在线动漫| 亚洲精品美女在线| 国产精品日韩在线播放| 久久精品国产v日韩v亚洲| 亚洲激情网站免费观看| 性色av一区二区三区红粉影视| 激情久久中文字幕| 欧美三级电影一区| 久久福利影视| 99国产成+人+综合+亚洲欧美| 亚洲欧美韩国| 亚洲日本精品国产第一区| 国产亚洲精品久| 欧美性一区二区| 欧美成人午夜影院| 久久天天综合| 欧美一区二区三区男人的天堂| 日韩视频免费观看高清在线视频 | 久久夜色精品国产| 中文欧美日韩| 制服丝袜亚洲播放| 夜夜精品视频一区二区| 欧美激情久久久久| 欧美在线你懂的| 欧美一区视频在线| 欧美在线观看www| 亚洲欧美日韩在线一区| 亚洲手机成人高清视频| 在线视频精品一| 在线亚洲成人| 亚洲欧美在线观看| 先锋影院在线亚洲| 久久精品国产免费| 久久欧美中文字幕| 久久精品国产一区二区三区| 国产精品激情av在线播放| 亚洲综合视频1区| 性欧美办公室18xxxxhd| 久久天天躁狠狠躁夜夜av| 免费在线欧美视频| 亚洲成人在线视频网站| 一本色道久久综合亚洲精品婷婷| 99成人在线| 久久久午夜精品| 欧美日韩中文在线| 国产一区二区三区四区三区四| 亚洲欧洲在线视频| 欧美一区二区三区四区视频| 久久青草久久| 中文国产成人精品| 蜜桃av一区二区| 国产精品视频导航| 日韩视频亚洲视频| 欧美a级理论片| 午夜精品视频在线观看一区二区| 久久伊伊香蕉| 国产日韩视频一区二区三区| 妖精视频成人观看www| 久久久久久**毛片大全| 亚洲免费一级电影| 欧美新色视频| 亚洲主播在线| 亚洲精品在线免费观看视频| 久久五月天婷婷| 激情综合色综合久久| 久久精品五月| 久久久精彩视频| 黑人一区二区| 亚洲第一区在线| 欧美精品日韩综合在线| 亚洲裸体视频| 一个色综合av| 精品成人一区二区三区四区| 久久国产福利国产秒拍| 久久久www成人免费无遮挡大片| 国内一区二区三区| 亚洲国产精品小视频| 国产精品毛片在线| 性做久久久久久久免费看| 免费观看成人鲁鲁鲁鲁鲁视频| 久久久久久69| 这里只有精品视频| 亚洲小说欧美另类婷婷| 狠狠v欧美v日韩v亚洲ⅴ| 欧美成人综合网站| 国产精品人人做人人爽| 欧美在线视频a| 欧美电影在线观看| 久久精品伊人| 国产精品婷婷午夜在线观看| 亚洲第一精品夜夜躁人人爽| 欧美日韩一区二区在线| 亚洲福利久久| 亚洲大片在线观看| 午夜精品视频在线观看一区二区| 亚洲激情在线播放| 久久黄色小说| 免费视频亚洲| 国产亚洲精品激情久久| 亚洲制服av| 性18欧美另类| 国产亚洲成人一区| 午夜视频精品| 蜜桃av综合| 亚洲激情另类| 欧美激情第二页| 亚洲精品美女在线| 亚洲精品在线看| 欧美精品一二三| 亚洲手机成人高清视频| 午夜亚洲福利在线老司机| 国产欧美日韩视频一区二区| 国产一区二区三区久久久久久久久 |