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

隨筆 - 132  文章 - 51  trackbacks - 0
<2012年6月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用鏈接

留言簿(7)

隨筆分類(lèi)

隨筆檔案

文章分類(lèi)

文章檔案

cocos2d-x

OGRE

OPenGL

搜索

  •  

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

從lua調(diào)用C++函數(shù)和對(duì)象
    利用LuaPlus可以方便的從C++中調(diào)用lua腳本,翻過(guò)也一樣。通過(guò)注冊(cè)函數(shù)或類(lèi)對(duì)象,lua便可以訪問(wèn)C++。
   
一、C風(fēng)格函數(shù)注冊(cè)
    Lua提供了C風(fēng)格的回調(diào)函數(shù)注冊(cè),該函數(shù)原型如下:
    int Callback(LuaState* state);
   
    無(wú)論是全局函數(shù)、類(lèi)非虛函數(shù)、類(lèi)虛函數(shù),只要符合上面的原型,都可以向Lua注冊(cè)。我們以全局函數(shù)為例,下面是我們提供的一個(gè)回調(diào)函數(shù)CStyleAddFunc:

int CStyleAddFunc(LuaState * state)
{    LuaStack args(state);
      if( args[1].IsNumber() && args[2].IsNumber() )
      {    state->PushNumber(args[1].GetInteger() + args[2].GetInteger());
           return 1;    
      }    
      return 0;
}


    在回調(diào)函數(shù)中,我們通過(guò)棧來(lái)訪問(wèn)參數(shù),棧中可以存貯多個(gè)參數(shù),LuaStack args(state);語(yǔ)句獲取棧對(duì)象供后續(xù)訪問(wèn)。     接下來(lái)判斷參數(shù)是否是數(shù)字,如果兩個(gè)參數(shù)都是數(shù)字,那么進(jìn)行加操作,將結(jié)果壓入棧中,將壓入棧中的數(shù)據(jù)的個(gè)數(shù)返回。注意,返回值代表壓入棧中的元素的個(gè)數(shù),而不是某種計(jì)算結(jié)果或其它意義的返回值。通過(guò)改變返回值來(lái)查看程序的輸出,這樣可以對(duì)返回值的含義有個(gè)感性的了解。     要注冊(cè)回到只需調(diào)用Register函數(shù)即可,這在第一篇中已經(jīng)用到。下面是測(cè)試函數(shù):

void TestCFunctionCallBack()
{
   LuaStateOwner state;      //"print" need this
   state->OpenLibs();      //register my function CStyleAddFunc to Add
   state->GetGlobals().Register("Add", CStyleAddFunc);      //call my function and print the result  
   state->DoString("ret = Add(1,5);print(ret)");
}

   state->DoString("ret = Add(1,5); print(ret)");該句用來(lái)從執(zhí)行Lua命令串。我們先調(diào)用Add并將結(jié)果賦值給ret變量,然后打印ret的值。 main函數(shù)如下:

int _tmain(int argc, _TCHAR* argv[])
{   
   TestCFunctionCallBack();  
   return 0;
}

   編譯運(yùn)行,一切OK。     我們也可以從Lua腳本文件中調(diào)用注冊(cè)的回調(diào)函數(shù),第一篇中有演示。     要注冊(cè)類(lèi)的成員函數(shù),則需要調(diào)用Register的另一種形式Register( const char* funcName, const Callee& callee, int (Callee::*func)(LuaState*), int nupvalues = 0 );,提供類(lèi)實(shí)例指針和函數(shù)即可完成注冊(cè)。下面是示例代碼:

class CTestCallBack
{
public:
   int NonVirtualFunc(LuaState *state)    
   {  
    LuaStack args(state);    
    printf("In non-virtual member function. no msg. ");   
    return 0;
   }   
  
   int virtual VirtualFunc(LuaState *state)   
   {
    LuaStack args(state);    
    printf("In virtual member function.msg=%s ", args[1].GetString());     
    return 0;
   }
};

void TestClassMemberFuncReg()
{   
   LuaStateOwner state;      //"print" need this   
   state->OpenLibs();  
   LuaObject globalobj = state->GetGlobals();
   CTestCallBack tcb;   
   globalobj.Register("MemberFunc", tcb, &CTestCallBack::NonVirtualFunc);   
   state->DoString("MemberFunc()");   
   globalobj.Register("VirMemberFunc", tcb, &CTestCallBack::VirtualFunc);   
   state->DoString("VirMemberFunc('Hi,myboy')");
}


修改一下main函數(shù),將TestClassMemberFuncReg()加進(jìn)去就可以看效果了。

 

二、任意形式C++函數(shù)注冊(cè)
    LuaPlus提供了 RegisterDirect() 來(lái)直接注冊(cè)任意形式的函數(shù),這樣更為直接,不必受限于上述的函數(shù)原型,使用起來(lái)很方便。同樣此函數(shù)像Register一樣,可以注冊(cè)類(lèi)的成員函數(shù)(也需要顯示指定this指針)。下面是代碼:


float Add(float num1, float num2)
{    
return num1 + num2;
}

class CForRegDirect
{
public:
int Sum(int a, int b, int c)   
{
     return a+b+c;
}      //const is necessary
virtual void SeeMessage(const char *msg)    
{
     printf("msg=%s ", msg);
}
};

void TestRegisterDirect()
{
LuaStateOwner state;
state->OpenLibs();
LuaObject gobj = state->GetGlobals();        //register global function directly    
gobj.RegisterDirect("Add", Add);    
state->DoString("print(Add(1.5, 2.3))");      //register memberfunction    
CForRegDirect forobj;    
gobj.RegisterDirect("MemberSum", forobj, CForRegDirect::Sum);    
state->DoString("print(MemberSum(1,2,7))");     
gobj.RegisterDirect("VirCMsg", forobj, CForRegDirect::SeeMessage);    
state->DoString("print(VirCMsg('haha,Do you see me?'))");
}


三、注冊(cè)函子對(duì)象
    上面兩節(jié)的方式可以實(shí)現(xiàn)簡(jiǎn)單的回調(diào)注冊(cè),注冊(cè)類(lèi)的成員函數(shù)時(shí)需要顯式提供類(lèi)指針,不適合用于映射C++中的類(lèi)結(jié)構(gòu)。     RegisterObjectFunctor()和元表(metatable)結(jié)合,提供了一種新的方法。我們不需要在注冊(cè)函數(shù)時(shí)顯式的提供this指針,作為替代,this指針可以從調(diào)用者的userdata或__object成員獲取。     元表(metatable)是一個(gè)普通的表對(duì)象,它定義了一些可以被重寫(xiě)的操作,如add,sub,mul,index,call等,這些操作以"__"開(kāi)頭,如__add,__index等。加入你重寫(xiě)了__add,那么在執(zhí)行add操作時(shí)就會(huì)調(diào)用你自己定義的__add操作。這種特性可以用來(lái)模擬C++中的類(lèi)對(duì)象,注冊(cè)函子對(duì)象正是利用了這種特性來(lái)實(shí)現(xiàn)的。     下面我們將一個(gè)C++類(lèi)映射到Lua中。類(lèi)代碼如下:


class CMultiObject
{
public:
   CMultiObject(int num) :m_num(num)
   {     }
  
   int Print(LuaState* state)
   {
    printf("%d ", m_num);
    return 0;
   }
protected:   
   int m_num;

};
void TestRegObjectDispatchFunctor()
{
   LuaStateOwner state;
   state->OpenLibs();      //create metaTable

   LuaObject metaTableObj = state->GetGlobals().CreateTable("MultiObjectMetaTable");
   metaTableObj.SetObject("__index", metaTableObj);     //register functor for multiobject
   metaTableObj.RegisterObjectFunctor("Print", CMultiObject::Print);      //get a instances of CMultiObject

   CMultiObject obj1(10);     //"clone" a object in lua, the lua object(here is table) has obj1's data
   LuaObject obj1Obj = state->BoxPointer(&obj1);     //set lua object's metatable to MetaTableObj  
   obj1Obj.SetMetaTable(metaTableObj);     //put lua object to Global scope, thus it can be accessed later.
   state->GetGlobals().SetObject("obj1", obj1Obj);   

   CMultiObject obj2(20);
   LuaObject obj2Obj = state->BoxPointer(&obj2);    
   obj2Obj.SetMetaTable(metaTableObj);
   state->GetGlobals().SetObject("obj2", obj2Obj);      //now call Print and Print2    
   state->DoString("obj1:Print();");
   state->DoString("obj2:Print();");
}

    首先我們需要生成一個(gè)元表(metatable),將C++類(lèi)的成員函數(shù)注冊(cè)到該元表中。然后依據(jù)CMultiObject的實(shí)例生成lua中與其對(duì)應(yīng)的對(duì)象(也是表),將該對(duì)象的metatable(也即該表的__object成員)設(shè)置為之前產(chǎn)生的元表。最后將新生成的lua對(duì)象放置到全局作用域中,這樣后面就可以直接引用這些對(duì)象。     我們可以做這樣的近似理解:每個(gè)實(shí)例的數(shù)據(jù)元素存放在與已對(duì)應(yīng)的lua table中,而類(lèi)的成員函數(shù)則存放在metatable中(函子對(duì)象)。當(dāng)調(diào)用obj1obj:Print()時(shí),會(huì)先找到其metatable,然后在metatable中找Print()函數(shù)。     這樣便實(shí)現(xiàn)了類(lèi)似C++中的類(lèi)結(jié)構(gòu)。每個(gè)實(shí)例有自己的數(shù)據(jù),而所有實(shí)例共享一份方法列表。         另外一種方式是利用表的userdata來(lái)實(shí)現(xiàn),需要先創(chuàng)建一個(gè)lua表對(duì)象,然后將C++對(duì)象obj1設(shè)置為該表的userdata(也是設(shè)置其__object成員),再將該表對(duì)象的metatable設(shè)置為我們之前創(chuàng)建的元表。最后就可以用表明來(lái)調(diào)用Print函數(shù)。代碼如下:
   
LuaObject table1Obj = state->GetGlobals().CreateTable("table1");
table1Obj.SetLightUserData("__object", &obj1);  
table1Obj.SetMetaTable(metaTableObj);   
LuaObject table2Obj = state->GetGlobals().CreateTable("table2");
table2Obj.SetLightUserData("__object", &obj2);  
table2Obj.SetMetaTable(metaTableObj);  
state->DoString("table1:Print()");
state->DoString("table2:Print()");

注冊(cè)函子對(duì)象(RegisterObjectFunctor)這種方式的限制在于:要注冊(cè)的函數(shù)必須符合原型(int Callback(LuaState* state);)。為了打破這種限制,LuaPlus提供了另外一種方式。
   
   
   
四、直接注冊(cè)函子對(duì)象

    直接注冊(cè)函子對(duì)象(RegisterObjectDirect)和RegisterDirect類(lèi)似,不考慮函數(shù)原型,可以直接向元表注冊(cè)任意形式的函數(shù)。     為CMultiObject添加新的成員函數(shù):
   
void Print2(int num)  
{       
   printf("%d %d\n", m_num, num);  
}  

調(diào)用RegisterObjectDirect方法:
metaTableObj.RegisterObjectDirect("Print2", (CMultiObject*)0, &CMultiObject::Print2);

第二個(gè)參數(shù)(CMultiObject*)0有點(diǎn)奇怪,這是模板參數(shù)的需要。
   
最后:  
state->DoString("obj1:Print2(5)");   
state->DoString("obj2:Print2(15)");  
state->DoString("table1:Print2(5)");    
state->DoString("table2:Print2(15)");

五、注銷(xiāo)回調(diào)

    注銷(xiāo)回調(diào)是件簡(jiǎn)單的事情,調(diào)用SetNil("yourCallBack")即可,如:
gobj.SetNil("Add");
metaTableObj.SetNil("Print2");

好了,迄今為止最長(zhǎng)的一篇,看著像是LuaPlus文檔的翻譯(?),不過(guò)還是加入了一些自己的理解。文檔我看了下,琢磨了半天才明白。希望能快點(diǎn)將LuaPlus用起來(lái)。
資料:     (1)Lua5.1參考手冊(cè)     (2)Lua入門(mén)wiki     (3)LuaPlus.html,源碼包中帶的。

轉(zhuǎn)載自http://hi.baidu.com/li9chuan/blog/item/e65e1d6dc0bd79f642169461.html

參考:http://gpwiki.org/index.php/Scripting_with_LuaPlus_and_Cpp  簡(jiǎn)單的LUA腳本編寫(xiě)
            http://wwhiz.com/LuaPlus/LuaPlus.html
            http://www.shnenglu.com/iwangchuchu/default.html?page=2



------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
引擎中的簡(jiǎn)單應(yīng)用:

void CAICharacterCore::LoadLuaScript( const char* LuaFileName )
{


    
try
    
{
     
//LuaScript->GetGlobals().RegisterDirect( "Thinking", *this, &CAICharacterCore::Thinking );

     
//////////////////////////////////////////////////////////////////////////

     LuaObject metaTableObj 
= m_LuaScript->GetGlobals().CreateTable("MultiObjectMetaTable");
     metaTableObj.SetObject(
"__index", metaTableObj);
     
//metaTableObj.RegisterObjectFunctor( "ClearMoveStep", &CAICharacterCore::ClearMoveStep );
     
//metaTableObj.RegisterObjectFunctor( "RestoreHPInstant", &CAICharacterCore::RestoreHPInstant );
     
//metaTableObj.RegisterObjectDirect( "SetSayTimeInterval", (CAICharacterCore*)0, &CAICharacterCore::SetSayTimeInterval );


     metaTableObj.RegisterObjectDirect( 
"LoseHPInstant", (CAICharacterCore*)0&CAICharacterCore::LoseHPInstant );
     metaTableObj.RegisterObjectDirect( 
"LoseMPInstant", (CAICharacterCore*)0&CAICharacterCore::LoseMPInstant );
     metaTableObj.RegisterObjectDirect( 
"RestoreHPInstant", (CAICharacterCore*)0&CAICharacterCore::RestoreHPInstant );
     metaTableObj.RegisterObjectDirect( 
"RestoreMPInstant", (CAICharacterCore*)0&CAICharacterCore::RestoreMPInstant );
     metaTableObj.RegisterObjectDirect( 
"GetHP", (CAICharacterCore*)0&CAICharacterCore::GetHP );
     metaTableObj.RegisterObjectDirect( 
"GetMP", (CAICharacterCore*)0&CAICharacterCore::GetMP );
     metaTableObj.RegisterObjectDirect( 
"GetHPMax", (CAICharacterCore*)0&CAICharacterCore::GetHPMax );
     metaTableObj.RegisterObjectDirect( 
"GetMPMax", (CAICharacterCore*)0&CAICharacterCore::GetMPMax );
     metaTableObj.RegisterObjectDirect( 
"UseSkill", (CAICharacterCore*)0&CAICharacterCore::UseSkill );
     metaTableObj.RegisterObjectDirect( 
"Say", (CAICharacterCore*)0&CAICharacterCore::Say );
     metaTableObj.RegisterObjectDirect( 
"SayAdvance", (CAICharacterCore*)0&CAICharacterCore::SayAdvance );
     metaTableObj.RegisterObjectDirect( 
"GetRand", (CAICharacterCore*)0&CAICharacterCore::GetRand );
     metaTableObj.RegisterObjectDirect( 
"GetLevel", (CAICharacterCore*)0&CAICharacterCore::GetLevel );
     metaTableObj.RegisterObjectDirect( 
"DropItemRand", (CAICharacterCore*)0&CAICharacterCore::DropItemRand );
     metaTableObj.RegisterObjectDirect( 
"AddTimer", (CAICharacterCore*)0&CAICharacterCore::AddTimer );
     metaTableObj.RegisterObjectDirect( 
"GetTimer", (CAICharacterCore*)0&CAICharacterCore::GetTimer );
     metaTableObj.RegisterObjectDirect( 
"GetTargetHP", (CAICharacterCore*)0&CAICharacterCore::GetTargetHP );
     metaTableObj.RegisterObjectDirect( 
"GetTargetMP", (CAICharacterCore*)0&CAICharacterCore::GetTargetMP );
     metaTableObj.RegisterObjectDirect( 
"GetTargetHPMax", (CAICharacterCore*)0&CAICharacterCore::GetTargetHPMax );
     metaTableObj.RegisterObjectDirect( 
"GetTargetMPMax", (CAICharacterCore*)0&CAICharacterCore::GetTargetMPMax );
     metaTableObj.RegisterObjectDirect( 
"GetTargetLevel", (CAICharacterCore*)0&CAICharacterCore::GetTargetLevel );
     metaTableObj.RegisterObjectDirect( 
"GetTargetEnmity", (CAICharacterCore*)0&CAICharacterCore::GetTargetEnmity );
     metaTableObj.RegisterObjectDirect( 
"SetTargetEnmity", (CAICharacterCore*)0&CAICharacterCore::SetTargetEnmity );
        metaTableObj.RegisterObjectDirect( 
"GetTargetDistance", (CAICharacterCore*)0&CAICharacterCore::GetTargetDistance );
        metaTableObj.RegisterObjectDirect( 
"SetArray", (CAICharacterCore*)0&CAICharacterCore::SetArray );
     metaTableObj.RegisterObjectDirect( 
"GetArray", (CAICharacterCore*)0&CAICharacterCore::GetArray );
     metaTableObj.RegisterObjectDirect( 
"SetBoolArray", (CAICharacterCore*)0&CAICharacterCore::SetBoolArray );
     metaTableObj.RegisterObjectDirect( 
"GetBoolArray", (CAICharacterCore*)0&CAICharacterCore::GetBoolArray );


     metaTableObj.RegisterObjectDirect( 
"SelfMurder", (CAICharacterCore*)0&CAICharacterCore::SelfMurder );

     
//metaTableObj.RegisterObjectDirect( "GetTargetName", (CAICharacterCore*)0, &CAICharacterCore::GetTargetName );

     LuaObject CAICharacterCoreObj 
= m_LuaScript->BoxPointer(this);

     CAICharacterCoreObj.SetMetaTable(metaTableObj);

     m_LuaScript
->GetGlobals().SetObject( "AI", CAICharacterCoreObj );

     
if!m_LuaScript->LoadFile( LuaFileName ) )
     
{
      m_bLuaScriptLoaded 
= true;
      m_LuaScript
->Call( 00 );
     }


     
//LuaStateOwner LuaScript;
     
//LuaScript->LoadFile( "D:/ArenWorkstation/XSanguoRun/Server/Script/AI/test.lua" );
     
//LuaObject luaFun = LuaScript->GetGlobal( "Event_OnInit" );

     
//if( luaFun.IsFunction() )
     
//{
     
// int y = 0;
     
//}

     
//m_LuaScript->DoString("print(obj1:ClearMoveStep())");
     
//LuaScript->LoadFile( "D:/ArenWorkstation/XSanguoRun/Server/test.lua" );
    }

    
catch (LuaPlus::LuaException &e)
    
{
        
char szErr[1024= {0};
        _snprintf(szErr, 
sizeof(szErr)-1"怪物 %s AI腳本載入錯(cuò)誤: %s", m_data.szCharacterName, e.GetErrorMessage());
        GetErrorLog()
->logString(szErr);
        m_bLuaScriptLoaded 
= false;
    }


}

posted on 2010-09-06 18:18 風(fēng)輕云淡 閱讀(2796) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): LUA

只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            美女啪啪无遮挡免费久久网站| 久久久久久9999| 久久露脸国产精品| 99精品视频免费| 国内一区二区三区| 国产精品二区二区三区| 久久久综合网站| 99视频日韩| 欧美国产激情二区三区| 久久久国产午夜精品| 亚洲欧美国产精品桃花| 99国内精品久久久久久久软件| 欧美国产日韩一二三区| 亚洲欧美制服中文字幕| 一区二区三区产品免费精品久久75 | 农夫在线精品视频免费观看| 在线午夜精品自拍| 亚洲欧洲一区二区三区在线观看 | 亚洲国产91精品在线观看| 欧美在线一二三区| 午夜国产精品视频免费体验区| 国产美女精品人人做人人爽| 欧美日本亚洲韩国国产| 欧美成人乱码一区二区三区| 久久婷婷成人综合色| 久久久久久色| 久久三级福利| 久久综合狠狠| 玖玖视频精品| 免费欧美高清视频| 欧美成人午夜77777| 女女同性女同一区二区三区91| 99精品热视频只有精品10| 亚洲国产精品第一区二区| 亚洲第一页在线| 亚洲国产日韩欧美综合久久| 亚洲国产精品999| 91久久综合亚洲鲁鲁五月天| 亚洲精品国产系列| 亚洲精品一区二区在线| 99国产欧美久久久精品| 宅男噜噜噜66一区二区| 亚洲特级毛片| 亚洲伊人观看| 欧美一区2区三区4区公司二百| 亚洲国产精品专区久久| 亚洲国产日本| 日韩亚洲一区在线播放| 一本大道久久a久久精二百| 亚洲视频每日更新| 性伦欧美刺激片在线观看| 久久成人精品视频| 欧美成人精品高清在线播放| 欧美日韩亚洲综合| 国产欧美一区二区三区另类精品| 欧美国产成人精品| 欧美先锋影音| 国产一区二区三区最好精华液| 欧美日韩不卡在线| 国产精品嫩草99a| 国产乱码精品一区二区三区不卡| 欧美日韩另类视频| 国产精品日日摸夜夜摸av| 国自产拍偷拍福利精品免费一| 国产精品久久久久久久久久尿| 免费亚洲视频| 欧美日本中文| 国产精品日韩欧美大师| 精品动漫3d一区二区三区| 亚洲人成人99网站| 亚洲欧美日本另类| 母乳一区在线观看| 一级成人国产| 久久亚洲免费| 国产精品白丝黑袜喷水久久久| 欧美精品不卡| 国产欧美日韩精品专区| 亚洲国产天堂久久综合| 亚洲欧美美女| 免费观看成人| 亚洲视频第一页| 老司机成人在线视频| 国产精品久久久一区麻豆最新章节| 欧美日韩午夜剧场| 国产日韩在线不卡| a4yy欧美一区二区三区| 久久久久久色| 亚洲图片欧洲图片日韩av| 久久综合伊人77777蜜臀| 国产精品久久久久久久久久久久| 国产精品久久久久久久久久久久久| 欧美日韩免费看| 国产一区二区在线观看免费| 一区二区三区精品在线 | 亚洲精品久久久久久下一站| 亚洲自拍电影| 蜜桃av久久久亚洲精品| 国产日韩欧美麻豆| 中日韩美女免费视频网址在线观看 | 老司机免费视频久久| 一区二区三区高清视频在线观看| 99热在线精品观看| 久久亚洲精品视频| 国产欧美成人| 亚洲色图在线视频| 最近看过的日韩成人| 久久免费国产精品| 国产在线不卡| 欧美在线观看一区| 一区二区免费看| 欧美激情视频给我| 亚洲国产综合在线看不卡| 久久婷婷亚洲| 性欧美xxxx大乳国产app| 国产精品高清在线| 亚洲伊人第一页| 99在线热播精品免费| 欧美精品久久一区二区| 亚洲精品免费网站| 欧美国产1区2区| 卡一卡二国产精品| 亚洲高清不卡av| 免费欧美电影| 开心色5月久久精品| 伊人成年综合电影网| 久久久综合网站| 久久精品成人一区二区三区蜜臀 | 欧美激情一区三区| 久久综合导航| 亚洲黄色在线看| 欧美激情国产高清| 欧美成年网站| 99国内精品久久| 9色porny自拍视频一区二区| 国产精品v片在线观看不卡| 亚洲一区高清| 亚洲综合大片69999| 国产麻豆一精品一av一免费| 欧美中文字幕第一页| 欧美在线首页| 在线观看日韩一区| 亚洲国产精品电影| 欧美日韩一级黄| 亚洲自拍高清| 久久aⅴ国产紧身牛仔裤| 在线成人黄色| 亚洲精品日韩久久| 国产精品a久久久久久| 欧美一区二区在线免费播放| 亚洲免费影视第一页| 国语自产精品视频在线看8查询8| 亚洲一区二区高清视频| 亚洲无吗在线| 国产在线观看精品一区二区三区| 亚洲系列中文字幕| 亚洲欧美春色| 在线电影欧美日韩一区二区私密| 午夜日韩电影| 久久久www免费人成黑人精品| 国产精品久久久久秋霞鲁丝| 欧美在线日韩在线| 久久字幕精品一区| 亚洲一区二区3| 午夜免费在线观看精品视频| 在线观看一区二区视频| 亚洲美女尤物影院| 国产午夜精品全部视频在线播放| 亚洲摸下面视频| 久久激情网站| 亚洲精品激情| 亚洲男人的天堂在线| 亚洲第一黄色| 一区二区三区日韩欧美精品| 红桃视频一区| 9l视频自拍蝌蚪9l视频成人| 黄色日韩在线| 99国内精品久久| 在线观看国产欧美| 亚洲深夜福利| 亚洲黄色三级| 午夜精品视频在线观看| 亚洲精品黄色| 久久不射中文字幕| 亚洲一区二区三区高清| 久久综合伊人77777麻豆| 羞羞漫画18久久大片| 欧美aⅴ99久久黑人专区| 久久精品国产清自在天天线| 欧美日韩国产精品一区| 另类激情亚洲| 国产精品日韩在线一区| 亚洲全黄一级网站| 在线观看成人av电影| 午夜精品国产精品大乳美女| 一区二区高清视频| 免费久久精品视频| 久久久久9999亚洲精品| 国产精品福利av| 亚洲日本一区二区三区| 激情视频一区二区|