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

李錦俊(mybios)的blog

游戲開發(fā) C++ Cocos2d-x OpenGL DirectX 數(shù)學 計算機圖形學 SQL Server

  C++博客 :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
  86 Posts :: 0 Stories :: 370 Comments :: 0 Trackbacks

公告

QQ:30743734
EMain:mybios@qq.com

常用鏈接

留言簿(16)

我參與的團隊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 373341
  • 排名 - 67

最新評論

閱讀排行榜

評論排行榜

一.Hello World

1.前言
  
  偶最近在學習Lua, 所以寫出心得和大家共享, 爭取一天寫一篇, 嘿嘿.
  才開始學所以內(nèi)容很淺, 希望大家包涵.
  Lua是一種完全免費的腳本語言, 可以和C/C++語言緊密結(jié)合,
  它的官方網(wǎng)站在http://www.lua.org. 在網(wǎng)站上可以下載到lua的源碼, 沒有可
  執(zhí)行版本, 不過不用擔心, 因為lua源碼可以在任何一種C/C++的編譯器上編譯.
  
  如果要學習Lua, 官方網(wǎng)站上的Reference是必備的,上面有每個命令的用法,非常詳細。
  參考手冊 http://www.lua.org/manual/5.0/
  作者寫的Programming in Lua http://www.lua.org/pil/
  
2.編譯
  如果用的VC6, 可以下載所需的project文件,地址在
  http://sourceforge.net/project/showfiles.php?group_id=32250&package_id=115604
  VSNET2003可以下載這個sln文件http://home.comcast.net/~vertigrated/lua/vs7.zip
  偶用的是cygwin和linux, 打入以下命令即可,
  tar -zxvf lua-5.0.2.tar.gz
  cd lua-5.0.2
  sh ./configure
  make
  這樣就OK了。
  為了以后使用方便,最好把bin目錄加入到path里面。
  
3."Hello, world!"
  現(xiàn)在開始偶們的第一個小程序"Hello, world!"
  把以下程序打入文件e01.lua
  
  例1:e01.lua
  -- Hello World in Lua
  print("Hello World.")
  
  Lua有兩種執(zhí)行方式,一種是嵌入到C程序中執(zhí)行,還有一種是直接從命令行方式下執(zhí)行。
  這里為了調(diào)試方便,采用第二種方式,執(zhí)行命令 lua e01.lua
  
  輸出結(jié)果應該是:
  Hello World.
  
4.程序說明
  第一行 -- Hello World in Lua
  這句是注釋,其中--和C++中的//意思是一樣的
  第二行 print("Hello World.")
  調(diào)用lua內(nèi)部命令print,輸出"Hello World."字符串到屏幕,Lua中的字符串全部是由"括起來的。
  這個命令是一個函數(shù)的調(diào)用,print是lua的一個函數(shù),而"Hello World."是print的參數(shù)。
  
5.試試看
  在Lua中有不少字符串的處理操作,本次的課后試試看的內(nèi)容就是,找出連接兩個字符串的操作,
  并且print出來。

二.流程控制

1. 函數(shù)的使用
  以下程序演示了如何在Lua中使用函數(shù), 及局部變量
  例e02.lua
  -- functions
  function pythagorean(a, b)
  local c2 = a^2 + b^2
  return sqrt(c2)
  end
  print(pythagorean(3,4))
  
  運行結(jié)果
  5
  
  程序說明
  在Lua中函數(shù)的定義格式為:
  function 函數(shù)名(參數(shù))
  ...
  end
  與Pascal語言不同, end不需要與begin配對, 只需要在函數(shù)結(jié)束后打個end就可以了.
  本例函數(shù)的作用是已知直角三角形直角邊, 求斜邊長度. 參數(shù)a,b分別表示直角邊長,
  在函數(shù)內(nèi)定義了local形變量用于存儲斜邊的平方. 與C語言相同, 定義在函數(shù)內(nèi)的代
  碼不會被直接執(zhí)行, 只有主程序調(diào)用時才會被執(zhí)行.
  local表示定義一個局部變量, 如果不加local剛表示c2為一個全局變量, local的作用域
  是在最里層的end和其配對的關(guān)鍵字之間, 如if ... end, while ... end等。全局變量的
  作用域是整個程序。
  
  2. 循環(huán)語句
  例e03.lua
  -- Loops
  for i=1,5 do
  print("i is now " .. i)
  end
  
  運行結(jié)果
  i is now 1
  i is now 2
  i is now 3
  i is now 4
  i is now 5
  
  程序說明
  這里偶們用到了for語句
  for 變量 = 參數(shù)1, 參數(shù)2, 參數(shù)3 do
  循環(huán)體
  end
  變量將以參數(shù)3為步長, 由參數(shù)1變化到參數(shù)2
  例如:
  for i=1,f(x) do print(i) end
  for i=10,1,-1 do print(i) end
  
  這里print("i is now " .. i)中,偶們用到了..,這是用來連接兩個字符串的,
  偶在(1)的試試看中提到的,不知道你們答對了沒有。
  雖然這里i是一個整型量,Lua在處理的時候會自動轉(zhuǎn)成字符串型,不需偶們費心。
  
  3. 條件分支語句
  例e04.lua
  -- Loops and conditionals
  for i=1,5 do
  print(“i is now “ .. i)
     if i < 2 then
     print(“small”)
     elseif i < 4 then
     print(“medium”)
     else
     print(“big”)
     end
  end
  
  運行結(jié)果
  i is now 1
  small
  i is now 2
  medium
  i is now 3
  medium
  i is now 4
  big
  i is now 5
  big
  
  程序說明
  if else用法比較簡單, 類似于C語言, 不過此處需要注意的是整個if只需要一個end,
  哪怕用了多個elseif, 也是一個end.
  例如
    if op == "+" then
     r = a + b
    elseif op == "-" then
     r = a - b
    elseif op == "*" then
     r = a*b
    elseif op == "/" then
     r = a/b
    else
     error("invalid operation")
    end
  
  
  4.試試看
  Lua中除了for循環(huán)以外, 還支持多種循環(huán), 請用while...do和repeat...until改寫本文中的for程序

三.Lua數(shù)據(jù)結(jié)構(gòu)

 1.簡介
  Lua語言只有一種基本數(shù)據(jù)結(jié)構(gòu), 那就是table, 所有其他數(shù)據(jù)結(jié)構(gòu)如數(shù)組啦,
  類啦, 都可以由table實現(xiàn).
  例e05.lua
  -- Arrays
  myData = {}
  myData[0] = “foo”
  myData[1] = 42
  
  -- Hash tables
  myData[“bar”] = “baz”
  
  -- Iterate through the
  -- structure
  for key, value in myData do
  print(key .. “=“ .. value)
  end
  
  輸出結(jié)果
  0=foo
  1=42
  bar=baz
  
  程序說明
  首先定義了一個table myData={}, 然后用數(shù)字作為下標賦了兩個值給它. 這種
  定義方法類似于C中的數(shù)組, 但與數(shù)組不同的是, 每個數(shù)組元素不需要為相同類型,
  就像本例中一個為整型, 一個為字符串.
  
  程序第二部分, 以字符串做為下標, 又向table內(nèi)增加了一個元素. 這種table非常
  像STL里面的map. table下標可以為Lua所支持的任意基本類型, 除了nil值以外.
  
  Lua對Table占用內(nèi)存的處理是自動的, 如下面這段代碼
    a = {}
    a["x"] = 10
    b = a   -- `b' refers to the same table as `a'
    print(b["x"]) --> 10
    b["x"] = 20
    print(a["x"]) --> 20
    a = nil  -- now only `b' still refers to the table
    b = nil  -- now there are no references left to the table
  b和a都指向相同的table, 只占用一塊內(nèi)存, 當執(zhí)行到a = nil時, b仍然指向table,
  而當執(zhí)行到b=nil時, 因為沒有指向table的變量了, 所以Lua會自動釋放table所占內(nèi)存
  
  3.Table的嵌套
  Table的使用還可以嵌套,如下例
  例e06.lua
  -- Table ‘constructor’
  myPolygon = {
  color=“blue”,
  thickness=2,
  npoints=4;
  {x=0,  y=0},
  {x=-10, y=0},
  {x=-5, y=4},
  {x=0,  y=4}
  }
  
  -- Print the color
  print(myPolygon[“color”])
  
  -- Print it again using dot
  -- notation
  print(myPolygon.color)
  
  -- The points are accessible
  -- in myPolygon[1] to myPolygon[4]
  
  -- Print the second point’s x
  -- coordinate
  print(myPolygon[2].x)
  
  程序說明
  首先建立一個table, 與上一例不同的是,在table的constructor里面有{x=0,y=0},
  這是什么意思呢? 這其實就是一個小table, 定義在了大table之內(nèi), 小table的
  table名省略了.
  最后一行myPolygon[2].x,就是大table里面小table的訪問方式.
  
四.函數(shù)的調(diào)用

 1.不定參數(shù)
  例e07.lua
  -- Functions can take a
  -- variable number of
  -- arguments.
  function funky_print (...)
  for i=1, arg.n do
  print("FuNkY: " .. arg[i])
  end
  end
  
  funky_print("one", "two")
  
  運行結(jié)果
  FuNkY: one
  FuNkY: two
  
  程序說明
  * 如果以...為參數(shù), 則表示參數(shù)的數(shù)量不定.
  * 參數(shù)將會自動存儲到一個叫arg的table中.
  * arg.n中存放參數(shù)的個數(shù). arg[]加下標就可以遍歷所有的參數(shù).
  
  
  2.以table做為參數(shù)
  例e08.lua
  -- Functions with table
  -- parameters
  function print_contents(t)
  for k,v in t do
  print(k .. "=" .. v)
  end
  end
  print_contents{x=10, y=20}
  
  運行結(jié)果
  x=10
  y=20
  
  程序說明
  * print_contents{x=10, y=20}這句參數(shù)沒加圓括號, 因為以單個table為參數(shù)的時候, 不需要加圓括號
  * for k,v in t do 這個語句是對table中的所有值遍歷, k中存放名稱, v中存放值
  
  
  3.把Lua變成類似XML的數(shù)據(jù)描述語言
  例e09.lua
  function contact(t)
  -- add the contact ‘t’, which is
  -- stored as a table, to a database
  end
  
  contact {
  name = "Game Developer",
  email = "hack@ogdev.net",
  url = "http://www.ogdev.net",
  quote = [[
  There are
  10 types of people
  who can understand binary.]]
  }
  
  contact {
  -- some other contact
  }
  
  程序說明
  * 把function和table結(jié)合, 可以使Lua成為一種類似XML的數(shù)據(jù)描述語言
  * e09中contact{...}, 是一種函數(shù)的調(diào)用方法, 不要弄混了
  * [[...]]是表示多行字符串的方法
  * 當使用C API時此種方式的優(yōu)勢更明顯, 其中contact{..}部分可以另外存成一配置文件
  
  4.試試看
  想想看哪些地方可以用到例e09中提到的配置方法呢?
  

五.Lua與C的交互

 1.簡介
  
  Lua與C/C++結(jié)合是很緊密的, Lua與C++交互是建立在Lua與C的基礎(chǔ)上的, 所
  以偶先從Lua與C講起.
  
  正如第一講所說, 運行Lua程序或者說調(diào)用Lua主要有兩種方式:
  * 通過命令行執(zhí)行"Lua"命令
  * 通過Lua的C庫
  雖然此前偶們一直用第一種方式, 但偶要告訴你, 通過Lua的C庫執(zhí)行才是游戲中
  常用的方式.
  
  2.Lua的C庫
  
  Lua的C庫可以做為Shared Library調(diào)用, 但一般開發(fā)游戲時會把Lua的所有源程序
  都包含在內(nèi), 并不把Lua編譯成共享庫的形式. 因為Lua程序只有100多K, 而且?guī)缀?br />  可以在任何編譯器下Clean Compile. 帶Lua源程序的另一個好處時, 可以隨時對Lua
  本身進行擴充, 增加偶們所需的功能.
  
  Lua的C庫提供一系列API:
  * 管理全局變量
  * 管理tables
  * 調(diào)用函數(shù)
  * 定義新函數(shù), 這也可以完全由C實現(xiàn)
  * 垃圾收集器Garbage collector, 雖然Lua可以自動進行, 但往往不是立即執(zhí)行的,
   所以對實時性要求比較高的程序, 會自己調(diào)用垃圾收集器
  * 載入并執(zhí)行Lua程序, 這也可以由Lua自身實現(xiàn)
  * 任何Lua可以實現(xiàn)的功能, 都可以通過Lua的C API實現(xiàn), 這對于優(yōu)化程序的運行速度
   有幫助. 經(jīng)常調(diào)用的共用的Lua程序片斷可以轉(zhuǎn)成C程序, 以提高效率. 連Lua都是C寫的
   還有什么C不能實現(xiàn)呢?
  
  3.Lua與C集成的例子
  例e10.c
  /* A simple Lua interpreter. */
  #include
  #include
  int main(int argc, char *argv[]) {
  char line[BUFSIZ];
  lua_State *L = lua_open(0);
  while (fgets(line, sizeof(line), stdin) != 0)
  lua_dostring(L, line);
  lua_close(L);
  return 0;
  }
  
  編譯
  Linux/Cygwin
  * 先編譯Lua, 并把頭文件放入include路徑
  * gcc e10.c -llua -llualib -o e10
  
  VC6/VC2003
  * 先編譯Lua, 在Option中設(shè)置頭文件和庫文件路徑
  * 新建工程,在工程配置中加入附加庫lua.lib和lualib.lib
  * 編譯成exe
  
  運行結(jié)果
  本程序的功能是實現(xiàn)一個Lua解釋器, 輸入的每行字符都會被解釋成Lua并執(zhí)行.
  
  程序說明
  * #include 包含lua頭文件, 然后才可以使用API
  * lua_State *L = lua_open(0) 打開一個Lua執(zhí)行器
  * fgets(line, sizeof(line), stdin) 從標準輸入里讀入一行
  * lua_dostring(L, line) 執(zhí)行此行
  * lua_close(L) 關(guān)閉Lua執(zhí)行器
  
  
  例e11.c
  /* Another simple Lua interpreter. */
  #include
  #include
  #include
  int main(int argc, char *argv[]) {
  char line[BUFSIZ];
  lua_State *L = lua_open(0);
  lua_baselibopen(L);
  lua_iolibopen(L);
  lua_strlibopen(L);
  lua_mathlibopen(L);
  while (fgets(line, sizeof(line), stdin) != 0)
  lua_dostring(L, line);
  lua_close(L);
  return 0;
  }
  
  運行結(jié)果
  本程序的功能是實現(xiàn)一個Lua解釋器, 輸入的每行字符都會被解釋成Lua并執(zhí)行.
  與上例不同的是, 本例調(diào)用了Lua的一些標準庫.
  
  程序說明
  * #include 包含Lua的標準庫
  * 以下這幾行是用來讀入Lua的一些庫, 這樣偶們的Lua程序就可以有更多的功能.
  lua_baselibopen(L);
  lua_iolibopen(L);
  lua_strlibopen(L);
  lua_mathlibopen(L);
  
  4.試試看
  把上面兩個小例子在你熟悉的編譯器中編譯執(zhí)行, 并試試能否與Lua源碼樹一起編譯

六.C/C++中用Lua函數(shù)

1.簡介
  偶們這次主要說說怎么由Lua定義函數(shù), 然后在C或者C++中調(diào)用. 這里偶們
  暫不涉及C++的對象問題, 只討論調(diào)用函數(shù)的參數(shù), 返回值和全局變量的使用.

  2.程序
  這里偶們在e12.lua里先定義一個簡單的add(), x,y為加法的兩個參數(shù),
  return 直接返回相加后的結(jié)果.
  
  例e12.lua
  -- add two numbers
  function add ( x, y )
  return x + y
  end
  
  在前一次里, 偶們說到 lua_dofile() 可以直接在C中執(zhí)行l(wèi)ua文件. 因為偶們
  這個程序里只定義了一個add()函數(shù), 所以程序執(zhí)行后并不直接結(jié)果, 效果相當
  于在C中定義了一個函數(shù)一樣.
  
  Lua的函數(shù)可以有多個參數(shù), 也可以有多個返回值, 這都是由棧(stack)實現(xiàn)的.
  需要調(diào)用一個函數(shù)時, 就把這個函數(shù)壓入棧, 然后順序壓入所有參數(shù), 然后用
  lua_call()調(diào)用這個函數(shù). 函數(shù)返回后, 返回值也是存放在棧中. 這個過程和
  匯編執(zhí)行函數(shù)調(diào)用的過程是一樣的.
  
  例e13.cpp 是一個調(diào)用上面的Lua函數(shù)的例子
  #include
  
  extern "C" { // 這是個C++程序, 所以要extern "C",
     // 因為lua的頭文件都是C格式的
  #include "lua.h"
  #include "lualib.h"
  #include "lauxlib.h"
  }
  
  /* the Lua interpreter */
  lua_State* L;
  
  int luaadd ( int x, int y )
  {
  int sum;
  
  /* the function name */
  lua_getglobal(L, "add");
  
  /* the first argument */
  lua_pushnumber(L, x);
  
  /* the second argument */
  lua_pushnumber(L, y);
  
  /* call the function with 2
    arguments, return 1 result */
  lua_call(L, 2, 1);
  
  /* get the result */
  sum = (int)lua_tonumber(L, -1);
  lua_pop(L, 1);
  
  return sum;
  }
  
  int main ( int argc, char *argv[] )
  {
  int sum;
  
  /* initialize Lua */
  L = lua_open();
  
  /* load Lua base libraries */
  lua_baselibopen(L);
  
  /* load the script */
  lua_dofile(L, "e12.lua");
  
  /* call the add function */
  sum = luaadd( 10, 15 );
  
  /* print the result */
  printf( "The sum is %d\n", sum );
  
  /* cleanup Lua */
  lua_close(L);
  
  return 0;
  }
  
  程序說明:
  main中過程偶們上次已經(jīng)說過了, 所以這次只說說luaadd的過程
  * 首先用lua_getglobal()把add函數(shù)壓棧
  * 然后用lua_pushnumber()依次把x,y壓棧
  * 然后調(diào)用lua_call(), 并且告訴程序偶們有兩個參數(shù)一個返回值
  * 接著偶們從棧頂取回返回值, 用lua_tonumber()
  * 最后偶們用lua_pop()把返回值清掉
  
  運行結(jié)果:
  The sum is 25
  
  編譯方法
  Linux下把程序存成e13.cpp
  g++ e13.cpp -llua -llualib -o e13
  ./e13
  
  VC下編譯方法
  * 首先建立一個空的Win32 Console Application Project
  * 把e13.cpp加入工程中
  * 點project setting,然后設(shè)置link選項, 再加上lua.lib lualib.lib兩個額外的庫
  * 最后編譯
  
  建立好的project可以在這里下載
  VC http://tonyandpaige.com/tutorials/luaadd.zip
  Linux http://tonyandpaige.com/tutorials/luaadd.tar.gz
  
  3.全局變量
  上面偶們用到了lua_getglobal()但并沒有詳細講, 這里偶們再舉兩個小例子來說下全局變量
  lua_getglobal()的作用就是把lua中全局變量的值壓入棧
  lua_getglobal(L, "z");
  z = (int)lua_tonumber(L, 1);
  lua_pop(L, 1);
  假設(shè)Lua程序中定義了一個全局變量z, 這段小程序就是把z的值取出放入C的變量z中.
  
  另外Lua中還有一個對應的函數(shù)lua_setglobal(), 作用是用棧頂?shù)闹堤畛渲付ǖ娜肿兞?br />  lua_pushnumber(L, 10);
  lua_setglobal(L, "z");
  例如這段小程序就是把lua中的全局變量z設(shè)為10, 如果lua中未定義z的話, 就會自動創(chuàng)建一個
  全局變量z并設(shè)為10.
  
  4.試試看
  自己寫個函數(shù)用C/C++來調(diào)用下試試

七.調(diào)用C/C++函數(shù)

1.前言
  上次偶說到從C/C++中調(diào)用Lua的函數(shù), 然后就有朋友問從Lua中如何調(diào)用C/C++的
  函數(shù), 所以偶們這次就來說說這個問題. 首先偶們會在C++中建立一個函數(shù), 然后
  告知Lua有這個函數(shù), 最后再執(zhí)行它. 另外, 由于函數(shù)不是在Lua中定義的, 所以
  無法確定函數(shù)的正確性, 可能在調(diào)用過程中會出錯, 因此偶們還會說說Lua出錯處
  理的問題.
  
  2.Lua中調(diào)用C函數(shù)
  在lua中是以函數(shù)指針的形式調(diào)用函數(shù), 并且所有的函數(shù)指針都必須滿足如下此種
  類型:
  typedef int (*lua_CFunction) (lua_State *L);
  
  也就是說, 偶們在C++中定義函數(shù)時必須以lua_State為參數(shù), 以int為返回值才能
  被Lua所調(diào)用. 但是不要忘記了, 偶們的lua_State是支持棧的, 所以通過棧可以
  傳遞無窮個參數(shù), 大小只受內(nèi)存大小限制. 而返回的int值也只是指返回值的個數(shù)
  真正的返回值都存儲在lua_State的棧中. 偶們通常的做法是做一個wrapper, 把
  所有需要調(diào)用的函數(shù)都wrap一下, 這樣就可以調(diào)用任意的函數(shù)了.
  
  下面這個例子是一個C++的average()函數(shù), 它將展示如何用多個參數(shù)并返回多個值
  
  例e14.cpp
  #include
  
  extern "C" {
  #include "lua.h"
  #include "lualib.h"
  #include "lauxlib.h"
  }
  
  /* the Lua interpreter */
  lua_State* L;
  
  static int average(lua_State *L)
  {
  /* get number of arguments */
  int n = lua_gettop(L);
  double sum = 0;
  int i;
  
  /* loop through each argument */
  for (i = 1; i <= n; i++)
  {
  /* total the arguments */
  sum += lua_tonumber(L, i);
  }
  
  /* push the average */
  lua_pushnumber(L, sum / n);
  
  /* push the sum */
  lua_pushnumber(L, sum);
  
  /* return the number of results */
  return 2;
  }
  
  int main ( int argc, char *argv[] )
  {
  /* initialize Lua */
  L = lua_open();
  
  /* load Lua base libraries */
  lua_baselibopen(L);
  
  /* register our function */
  lua_register(L, "average", average);
  
  /* run the script */
  lua_dofile(L, "e15.lua");
  
  /* cleanup Lua */
  lua_close(L);
  
  return 0;
  }
  
  例e15.lua
  -- call a C++ function
  
  avg, sum = average(10, 20, 30, 40, 50)
  
  print("The average is ", avg)
  print("The sum is ", sum)
  
  
  程序說明:
  * lua_gettop()的作用是返回棧頂元素的序號. 由于Lua的棧是從1開始編號的,
   所以棧頂元素的序號也相當于棧中的元素個數(shù). 在這里, 棧中元素的個數(shù)就
   是傳入的參數(shù)個數(shù).
  * for循環(huán)計算所有傳入?yún)?shù)的總和. 這里用到了數(shù)值轉(zhuǎn)換lua_tonumber().
  * 然后偶們用lua_pushnumber()把平均值和總和push到棧中.
  * 最后, 偶們返回2, 表示有兩個返回值.
  * 偶們雖然在C++中定義了average()函數(shù), 但偶們的Lua程序并不知道, 所以需
   要在main函數(shù)中加入
  
    /* register our function */
  lua_register(L, "average", average);
  
   這兩行的作用就是告訴e15.lua有average()這樣一個函數(shù).
  * 這個程序可以存成cpp也可以存成c, 如果以.c為擴展名就不需要加extern "C"
  
  編譯的方法偶們上次說過了, 方法相同.
  e15.lua執(zhí)行的方法只能用上例中的C++中執(zhí)行, 而不能用命令行方式執(zhí)行.
  
  3.錯誤處理
  在上例中, 偶們沒有對傳入的參數(shù)是否為數(shù)字進行檢測, 這樣做不好. 所以這里偶
  們再加上錯誤處理的片斷.
  
  把這段加在for循環(huán)之內(nèi):
  if (!lua_isnumber(L, i)) {
  lua_pushstring(L, "Incorrect argument to 'average'");
  lua_error(L);
  }
  這段的作用就是檢測傳入的是否為數(shù)字.
  
  加上這段之后, 偶們debug的時候就會簡單許多. 對于結(jié)合兩種語言的編程, 它們之
  間傳遞數(shù)據(jù)的正確性檢測是非常重要的.
  
  這里有別人寫好的例子:
  VC的 http://tonyandpaige.com/tutorials/luaavg.zip
  Linux的 http://tonyandpaige.com/tutorials/luaavg.tar.gz
  
posted on 2006-11-18 14:34 李錦俊(mybios) 閱讀(3024) 評論(0)  編輯 收藏 引用 所屬分類: LUA
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲免费电影在线| 亚洲国产精品一区二区第四页av | 一区二区三区四区国产| 亚洲福利视频三区| 亚洲精选一区二区| 亚洲午夜视频在线观看| 亚洲欧美日韩国产中文| 久久精品夜色噜噜亚洲a∨| 久久男人av资源网站| 欧美激情在线| 一区二区毛片| 久久国产精品毛片| 欧美激情一区二区三区全黄| 国产精品成人一区二区| 激情另类综合| 一本久久精品一区二区| 欧美怡红院视频一区二区三区| 久久婷婷国产麻豆91天堂| 亚洲激情专区| 99re66热这里只有精品3直播| 亚洲欧美日本另类| 欧美肥婆在线| 国内精品久久久久影院 日本资源| 夜夜嗨av一区二区三区| 午夜一区在线| 久久一区精品| 日韩视频永久免费观看| 久久精品免费| 欧美日韩www| 揄拍成人国产精品视频| 午夜一区在线| 99精品国产热久久91蜜凸| 久久免费观看视频| 国产女人18毛片水18精品| 99热在这里有精品免费| 蜜桃av一区二区| 亚洲男人的天堂在线| 免费一级欧美片在线播放| 国产一区二区丝袜高跟鞋图片| 一区二区三区精品在线 | 欧美一级大片在线免费观看| 亚洲国产二区| 久久免费高清| 一区免费在线| 久久国产精品一区二区| 亚洲网址在线| 欧美视频在线观看一区| 99精品欧美一区二区三区| 欧美国产日韩a欧美在线观看| 欧美亚洲综合网| 国产精品日韩一区二区三区| 亚洲一二三区视频在线观看| 亚洲肉体裸体xxxx137| 老司机免费视频一区二区三区| 国产欧美丝祙| 久久精品国产久精国产爱| 亚洲主播在线| 国产欧美一级| 久久久亚洲午夜电影| 欧美在线播放视频| 国产综合一区二区| 久久综合网色—综合色88| 久久精品成人| 亚洲国产精品第一区二区三区| 免费中文日韩| 欧美凹凸一区二区三区视频| 亚洲丶国产丶欧美一区二区三区| 久久夜色精品国产噜噜av| 久久久www成人免费毛片麻豆 | 中文在线资源观看网站视频免费不卡 | 一区二区三区免费看| 欧美少妇一区| 亚洲欧美制服另类日韩| 亚洲欧美视频在线观看| 亚洲一级影院| 亚洲手机视频| 国产日韩专区| 免费不卡欧美自拍视频| 蜜桃精品久久久久久久免费影院| 91久久线看在观草草青青| 最新69国产成人精品视频免费| 欧美精品一区二区三区久久久竹菊 | 99国产精品国产精品毛片| 欧美日韩在线播放| 午夜精品福利一区二区三区av| 亚洲欧美日韩精品| 好吊视频一区二区三区四区| 欧美国产精品久久| 欧美视频导航| 免费不卡亚洲欧美| 欧美午夜大胆人体| 久久国产免费看| 欧美肥婆bbw| 久久精品国产欧美激情| 欧美黄色aaaa| 久久精品国产一区二区电影| 欧美69视频| 久久国产日韩| 欧美日韩免费在线视频| 久久亚洲精品中文字幕冲田杏梨| 欧美激情久久久久| 久久精品一区二区| 欧美日韩国产区| 久久人人爽人人爽| 国产精品二区三区四区| 欧美成年人网站| 国产精品嫩草久久久久| 亚洲国产精品福利| 韩国精品一区二区三区| 在线视频你懂得一区| 亚洲黄色在线| 久久精品中文字幕一区| 午夜精品av| 欧美日韩免费在线观看| 欧美激情亚洲一区| 国产日本亚洲高清| 正在播放亚洲一区| 999在线观看精品免费不卡网站| 香蕉免费一区二区三区在线观看| 一区二区三区视频免费在线观看| 榴莲视频成人在线观看| 久久久亚洲国产天美传媒修理工| 国产精品美女久久久久久免费| 亚洲日本va在线观看| 亚洲国产女人aaa毛片在线| 久久精品国产一区二区三区免费看| 亚洲欧美日韩另类| 欧美日韩国产不卡| 亚洲精品国产品国语在线app | 在线看国产日韩| 一区二区三区欧美在线观看| 91久久综合| 久久亚洲高清| 欧美成人嫩草网站| 在线精品视频一区二区三四| 久久av在线| 美脚丝袜一区二区三区在线观看| 国产日韩一区二区三区在线播放 | 亚洲欧美日韩国产综合精品二区| 欧美美女日韩| 亚洲伦伦在线| 亚洲图片欧美日产| 国产精品xxxav免费视频| 亚洲美女视频网| 99在线精品视频| 欧美性猛交xxxx乱大交蜜桃| 这里只有精品丝袜| 久久久久久夜精品精品免费| 激情亚洲一区二区三区四区| 久久久成人网| 亚洲国产欧洲综合997久久| 日韩午夜在线播放| 国产精品mv在线观看| 亚洲欧美精品伊人久久| 久久午夜视频| 亚洲精品视频一区| 欧美视频二区36p| 午夜精品一区二区三区在线视| 久久久精品国产免大香伊| 亚洲大片av| 欧美日韩免费在线| 午夜一区二区三区在线观看| 免费一区二区三区| 一区二区福利| 国产亚洲精品bt天堂精选| 美女图片一区二区| 亚洲天堂av综合网| 美女免费视频一区| 一本色道久久88精品综合| 国产精品爽爽ⅴa在线观看| 久久国产精品久久精品国产| 欧美激情精品久久久久久| 亚洲一区二区在线| 永久久久久久| 国产精品久久久亚洲一区| 久久精品国产久精国产爱| 亚洲免费高清| 另类尿喷潮videofree| 亚洲一二三四久久| 亚洲国产99| 国产视频自拍一区| 欧美日韩国产综合视频在线| 欧美综合国产| 一区二区三区四区五区视频 | 国产精品一区二区久久久久| 美女脱光内衣内裤视频久久网站| 亚洲一级黄色| 亚洲激情另类| 久久天堂av综合合色| 中文在线不卡| 亚洲精品在线免费| 一区免费视频| 国产伊人精品| 国产欧美日韩三级| 亚洲久久在线| 午夜精品久久久久久久蜜桃app | 亚洲乱亚洲高清| 免费久久精品视频| 欧美一区二区三区视频免费| 日韩一二三区视频|