锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
鎴戜滑鍏堢湅涓嬫瀯閫犲嚱鏁扮殑瑙勫垯
鏋勯犲弬鏁伴噺: 0琛ㄧず娌℃湁鏋勯犲嚱鏁? 1琛ㄧず鏈夋瀯閫犲嚱鏁?涓弬鏁?/p>
| 鏈被鏋勯?/th> | 鐖剁被鏋勯?/th> | 澶勭悊鏂規硶 |
|---|---|---|
| 0 | 0 | 涓嶅鐞?/td> |
| 1 | 0 | 璋冩湰綾籧tor |
| 0 | 1 | 璋冪埗綾籧tor |
| 1 | 1 | 璋冩湰綾籧tor, 鏈被ctor璋冪埗綾籧tor |
| 2 | 1 | 璋冩湰綾籧tor, 鏈被ctor璋冪埗綾籧tor |
| 1 | 2 | 鎶ラ敊, 鎵嬪姩璋冪埗綾籧tor |
| 2 | 2 | 鎶ラ敊, 鎵嬪姩璋冪埗綾籧tor |
瀹為檯鍙敤鑰冭檻鏈鍏稿瀷鐨勪竴縐嶈涓? 瀹炰緥鍖栧瓙綾? 杞負鐖剁被璋冪敤鏂規硶, 榪欎釜鏃跺?/p>
濡傛灉鏂規硶鏄痮verride, 璋冪敤鐨勬槸瀛愮被
濡傛灉鏂規硶鏄痸irutal鎴栬呬笉鎸囨槑, 璋冪敤鐨勬槸鐖剁被
鏁翠釜閲嶈澆榪囩▼, 瀛愮被緇濆涓嶄細闅愬紡璋冪敤鐖剁被鐨勮涓?/p>
鏋勯犲嚱鏁扮殑浼樼偣
鏋勯犲嚱鏁扮殑緙虹偣
鍏跺疄鎴戜滑瀵瑰垵濮嬪寲鍑芥暟鐨勯渶姹傚彧鏈?鏉? 鑷畾涔?/p>
鎵浠? 鍙互鐞嗚ВGolang涓嶅姞鍏ユ瀯閫犲嚱鏁扮殑璁捐鏄紜殑
鍗? 綆鍗? 娓呮櫚, 鏈夎寰?/p>
鍦ㄦ瘡涓猵rotoc-gen-lua鐢熸垚鐨刲ua鏂囦歡閲? 閮芥湁涓琛?/p>
local protobuf = require "protobuf"
鏈韓鎸夌収瀹樻柟鍑虹殑娌¢棶棰? 浣嗘槸鍦╱lua鐨勭洰褰曢噷, 鎬繪槸鎶rotobuf鎵句笉鍒扮殑閿欒. 鍓嶅悗瀵規瘮浜嗕笅鎴戠敓鎴愮殑lua鍜寀lua瀹樻柟鐢熸垚鐨勪唬鐮侀噷
鍙戠幇灞呯劧浠栦慨鏀逛簡鍦板潃鏀逛負浜?/p>
local protobuf = require "protobuf/protobuf"
濂藉惂, 鍙湁淇敼鐢熸垚鍣ㄤ唬鐮乸rotoc-gen-lua\plugin\protoc-gen-lua涓412琛屾敼涓?/p>
lua('local protobuf = require "protobuf/protobuf"\n')鍦↙uaFramework\ToLua\Lua\protobuf\protobuf.lua鐨?39琛屾坊鍔?/pre>message_meta._member.Descriptor = descriptor鍦ㄦ秷鎭噷灝卞彲浠ラ氳繃msg.Descriptor鑾峰緱姝ゆ秷鎭殑鍙嶅皠淇℃伅鐢變簬proto鏂囦歡瀹氫箟鐨勫唴瀹硅繃澶氬鑷寸殑lua local瓚呰繃闄愬埗鐨勮鍛?/h2>
榪欎釜閿欒鐪熸槸璁╂垜鍝瑧涓嶅緱, protoc-gen-lua鐨勫彲鐢ㄦу啀涓嬈¤鎬鐤?/p>
鎴戜滑鐨勫崗璁ソ姝瑰垎鎴愪簡鎺ヨ繎100涓? 姣忎釜閲岄潰娑堟伅鍜屾暟鎹槸娣峰悎鐨? 鏇村埆璇存湁浜涚闉嬪枩嬈㈡妸涓涓」鐩殑鍗忚鍏ㄥ啓鍦ㄤ竴涓枃浠墮噷, 閭g敓鎴愮殑local鏁伴噺綆鐩存槸閰哥埥
鍚庤
鎼滅儲protoc-gen-lua鏃? 鏃犳剰闂村張鎼滃埌3騫村墠鑷繁鐨勫崥鏂?a title="http://m.shnenglu.com/sunicdavy/archive/2013/04/24/199693.html" href="http://m.shnenglu.com/sunicdavy/archive/2013/04/24/199693.html">http://m.shnenglu.com/sunicdavy/archive/2013/04/24/199693.html
璁板緱閭d釜鏃跺欏噯澶囧湪鏈嶅姟鍣ㄤ嬌鐢╨ua, 榪樺ソ娌¤繖涔堝共, 杞簡go, 鍚﹀垯鍚庢灉涓嶅牚璁炬兂
lua涓婁嬌鐢╬b鍏跺疄騫朵笉瀹規槗, 浜戦鐨刾bc鍐欑殑涓嶉敊, 浣嗘曟湁鍧? sproto鐩存帴涓嶅吋瀹圭幇鏈夐」鐩? 椋庨櫓澶т簬鏄撶敤鎬ф墍浠ユ灉鏂純鐢?/p>
鍥犳, 鐪嬫潵鏈夊繀瑕佽嚜宸卞啓涓涓敮鎸佽壇濂界殑lua pb搴?/p>
]]>
Action[] a = new Action[3];for (int i = 0; i < 3; i++)
{ a[i] = ( ) => { Console.WriteLine(i); };}
for (int i = 0; i < 3; i++){
a[i]();
}
C#鎵撳嵃緇撴灉涓? 3 3
Golang鐨勪緥瀛?/p>
a := make([]func(), 3 )
for i := 0; i < 3; i++ { a[i]= func( ){fmt.Println(i)
}
}
for _, s := range a {s()
}
Golang鎵撳嵃緇撴灉涓? 3 3
鏈鍚庢槸Lua鐨勪緥瀛?/p>
a = {}for i = 1, 3 do
table.insert( a, function()
print(i)
end
)
end
for _, v in ipairs(a) do
v()
end
Lua鎵撳嵃緇撴灉涓? 2 3
宸紓鍦ㄤ簬, C#鍜孏olang灝嗗彉閲忔崟鑾峰埌闂寘鍐呮椂, 鍧囦嬌鐢ㄥ紩鐢ㄦ柟寮? 鍗沖綋鏈鍚庡紑濮嬭皟鐢ㄤ嬌鐢ㄥ彉閲忔椂, 鐢變簬鍙橀噺宸茬粡緇撴潫寰幆, 鎵浠ユ槸鏈緇堝?/p>
浣嗘槸Lua鎹曡幏鏂瑰紡鏄兼崟鑾? 鍥犳姣旇緝瀹規槗鐞嗚В, 鏄灝戝氨鏄灝?/p>
鍦?a title="http://code.google.com/p/protobuf/" >http://code.google.com/p/protobuf/涓嬭澆protobuf-2.5鐗堟湰
棰勫鐭ヨ瘑: 宸茬粡浣跨敤榪噋rotobuf, 鐔熺粌搴旂敤protobuf搴忓垪鍖栧湪鍚勮璦闂翠氦浜掍俊鎭?/p>
鐩爣: 鑾峰彇proto鍐呭鑰屾棤闇鎵嬪姩瑙f瀽proto鏂囦歡
涓簆roto鏂囦歡娣誨姞鏇村鐨刴eta淇℃伅, 騫跺湪榪愯鏈熻幏鍙?
protoc緙栬瘧鍣ㄥ噯澶?/strong>
閫氳繃protobuf-2.5鐨勬簮鐮佹垨鑰呬粠瀹樼綉涓嬭澆, 鍙互鑾峰緱protoc鐨刾rotobuf緙栬瘧鍣? 榪欎釜緙栬瘧鍣ㄧ敱C++緙栧啓, 瀹樻柟鏀寔瀹屾暣鐨刾rotobuf鐗規? 緙栬瘧鍣ㄩ粯璁ゆ敮鎸丆++, python鍜宩ava 涓夌璇█鐨勪唬鐮佺敓鎴? 濡傞渶鐢熸垚鏇村鐨勮璦, 鍙互閫氳繃瀹樼綉鐨勭涓夋柟欏甸潰鑾峰彇.
protoc鎻掍歡鍘熺悊
浣嗘垜浠湪鏃ュ父浣跨敤涓? 鍙兘闇瑕佹彁鍙杙roto淇℃伅, 渚嬪: 鎵鏈夌殑鏋氫婦,娑堟伅絳変俊鎭? 瀛楁鍚嶇О鍜屽鍑哄彿. 鑷繁緙栧啓璇嶆硶瑙f瀽鍣ㄦ潵鍋氭槸璐瑰姏涓嶈濂界殑. 瀹樻柟鎺ㄨ崘鐨勬柟娉曟槸浣跨敤protoc澶栨寕鎻掍歡鏉ュ疄鐜?
protoc鐨勬彃浠惰璁℃瘮杈冪嫭鐗? 涓嶄嬌鐢ㄥ姩鎬侀摼鎺ュ簱鎴栬卝ava鐨刯ar鍖呭鍏ユ柟寮? 鑰屾槸鐩存帴浣跨敤浜嗗懡浠よ鏉ヤ氦鎹㈡暟鎹?鏌ョ湅protobuf婧愮爜鎴戜滑鍙互鍙戠幇榪欐牱涓涓枃浠?
protobuf-2.5.0\src\google\protobuf\descriptor.proto
榪欎釜鏂囦歡鎻忚堪浜嗕竴涓猵roto鏂囦歡鐨勬牸寮? 娑堟伅緇勬垚鍙婃灇涓劇瓑瀹屾暣淇℃伅. 榪欐槸涓縐嶈嚜鎴戞弿榪扮殑鏂規硶.
鍦ㄦ壘鍒拌繖鏍蜂竴涓枃浠?/p>
protobuf-2.5.0\src\google\protobuf\compiler\plugin.proto
榪欐牱涓涓枃浠舵弿榪? 鎻掍歡濡備綍涓巔rotoc榪涜浜や簰鐨勫崗璁?/p>
protoc緙栬瘧鍣ㄥ湪緇欏畾鎸囧畾proto鏂囦歡鍙婃悳绱㈣礬寰勫悗, 灝嗗悇縐嶄俊鎭~鍏呬負descriptor.proto鎻忚堪鐨勭粨鏋勫悗閫氳繃CodeGeneratorRequest娑堟伅緋誨垪鍖栦負浜岃繘鍒舵祦鍚庤緭鍑哄埌鍛戒護琛? 鎻掍歡鍙敤鎹曡幏protoc鍛戒護琛岃緭鍑虹殑浜岃繘鍒舵祦, 搴忓垪鍖栧寲鍥濩odeGeneratorRequest鍗沖彲鑾峰緱瑙f瀽鍚庣殑proto鏂囦歡鍐呭
榪欓噷闇瑕佹敞鎰忕殑鏄? 鎻掍歡鍙墽琛屾枃浠跺緢鏈夎絀? 蹇呴』涓簆rotoc-gen-$NAME, 鑰屼笖杈撳嚭鏂囦歡鍚嶅弬鏁板繀欏諱負--${NAME}_out
鐪嬩竴涓牀瀛?
protoc.exe foo.proto --plugin=protoc-gen-go=..\tools\protoc-gen-go.exe --go_out foo.go --proto_path "."
榪欎釜鏍楀瓙閲? $NAME=go
protoc灝唂oo.proto鏂囦歡(鎼滅儲璺緞涓哄綋鍓嶈礬寰?鐨勫唴瀹歸氳繃鍛戒護琛岃緭鍑虹粰浣嶄簬..\tools\鐨勬彃浠秔rotoc-gen-go.exe, 杈撳嚭鏂囦歡鍚嶅瓧涓?foo.go
descriptor.proto淇℃伅鎸栨帢
鎴戜滑娉ㄦ剰鍒板湪descriptor.proto鏂囦歡涓寘鍚湁榪欐牱鐨勪竴涓猰essage: SourceCodeInfo, 榪欎釜娑堟伅浣撻噷鏈夊涓嬪瓧孌?/p>
optional string leading_comments = 3;
optional string trailing_comments = 4;
榪欎袱涓瓧孌靛浜庢垜浠幏鍙杙roto鏂囦歡鐨刴eta淇℃伅灝や負閲嶈, 鎵璋撶殑meta淇℃伅, 鐞嗚В鐞嗚В涓篊#璇█涓殑attribute
榪欎釜attribute鍔熻兘鍙互涓轟竴涓瓧孌? 涓涓秷鎭墿鍏呬竴浜涙弿榪? 姣斿: 褰撲竴涓瓧孌甸氳繃鍙嶅皠鏄劇ず鍦╣ui涓婃椂, gui闇瑕佽幏鍙栬繖涓瓧孌電殑涓枃鎻忚堪
閭d箞鍙渶瑕佸涓嬬紪鍐?
optional int32 somevalue = 1 //@ desc=鈥濅腑鏂囨弿榪扳?
浣嶄簬瀛楁灝鵑儴鐨勬弿榪? 浼氳濉厖鍒癝ourceCodeInfo鐨?trailing_comments涓? 鑰屼綅浜庡瓧孌典笂鏂圭殑瀛楁, 浼氳濉厖鍒發eading_comments涓?
SourceCodeInfo 騫舵病鏈夌洿鎺ユ寕杞藉湪message鎴栬呭瓧孌電殑闄勮繎, 鑰屾槸閫氳繃鍏朵笅鐨刾ath瀛楁鏉ユ弿榪頒笌瀛楁鐨勫叧緋? 榪欐槸涓瀬涓洪夯鐑︾殑璁捐.
鍏跺師鐞嗗涓?
鍋囪鎴戞湁濡備笅涓涓猰essage
message foo
{
optional int32 v = 1; // comments
}
瑕佽幏鍙杤鍚庣殑娉ㄩ噴, 瀵瑰簲鐨刾ath涓?4, 0, 2, 0
4 琛ㄧずdescriptor涓璵essage_type鎵鍦ㄧ殑搴忓彿,鐢變簬message_type瀵瑰簲鐨勭被鍨婦escriptorProto鏄竴涓暟緇? 鎵浠?琛ㄧずfoo鏄湪FileDescriptorProto鐨刴essage_type鏁扮粍綾誨瀷鐨勭儲寮曚負0;
濡傛綾繪帹: 2, 0 琛ㄧず v鍦―escriptorProto緇撴瀯浣撶殑field鎴愬憳搴忓彿涓?鐨勬暟緇勫厓绱犵殑绱㈠紩涓?
濡傛灉闇瑕佹洿澶氱殑鍙傝? 鍙互鑾峰彇https://github.com/golang/protobuf
github.com\golang\protobuf\protoc-gen-go宸ョ▼鍐呮湁璇︾粏浠g爜瑙f瀽
榪欐槸鐜頒粖鍦扮悆涓婅皟璇昹ua5.1鏈鏂逛究鐨勫伐鍏? 娌℃湁涔嬩竴. 寮哄ぇ鐨勬敞鍏ュ紡璋冭瘯, 鎬ц兘鏋侀珮.鏀寔 鎸傛帴榪涚▼, 鍙橀噺灞曞紑, 鏂偣絳夊悇縐嶆棩甯告墍闇.
鏃╂湡鐨凞ecoda鏄敹璐瑰伐鍏? 鍥犳璐ㄩ噺闈炲父楂?
Decoda鐜板湪宸茬粡鍋滄寮鍙戝茍寮婧愪簡, 璋冭瘯lua5.2浼歝rash. 婧愪唬鐮佸彲浠ヤ綔涓轟竴縐嶆妧鏈弬鑰? 寰堝dll娉ㄥ叆淇敼鎶鏈? 鐏板父鐗沊
姣旇緝浼樼鐨勮皟璇曞伐鍏?鍥犱負鏀惰垂), 鍙互璋冭瘯lua5.1/5.2, 鐣岄潰灞炰簬vs2008綾誨瀷, 鍦熻豹鍙互鑰冭檻涔板嚑濂楄瘯璇?/p>

瀵筶ua5.1鏀寔杈冨ソ, 5.2涔熻兘璋冧絾鍋跺皵榪樻槸浼歝rash, 鍩轟簬榪滅▼璋冭瘯鏂瑰紡, 鎵浠ユц兘鐣ヤ綆.
娌℃湁IDE, 綰懡浠よ鏂瑰紡璋冭瘯鍣? 浣嗗洜涓虹畝鍗? 鎵浠ュ彲浠ュ弬鑰冨悗鍐欎竴涓嚜宸辯殑紼嬪簭鍐呭緩璋冭瘯鍣?/p>
鎶婅繖璐ф斁鍦ㄦ渶鍚庢槸鏈夊師鍥犵殑, 榪樿寰楅偅鍙ヨ佽瘽: 鑰佸涓寮婧? 鎴戜滑灝辨湁鑷富鐮斿彂浜? 瀵圭殑, 榪欒揣涓瀹氭槸鍙傝冧簡Decoda鐨勪唬鐮佸悗鎼炲嚭涓獀s鐨勬彃浠舵潵, 铏界劧涓嶆敹璐? 浣嗘槸涓嶆彁涓嬪弬鑰冨璞$殑琛屼負榪樻槸鍊煎緱鎵規枟鐨? 榪欒揣鍦ㄤ腑鏂囧崥瀹笂璇? 涓嶆敮鎸佹寕鎺ュ埌榪涚▼(Decoda鏀寔), 涓嶆敮鎸?4浣嶈皟璇?LuaStudio鏀寔), 璋冭瘯30~50嬈″伓灝旀寕1鍒?嬈? 鍝? 姣曠珶鍙槸浠g爜鎼繍宸? 涓嶇敓浜т唬鐮?
榪欒揣瑁呬笂, 鑳界敤, 璋?.2鏄笉琛岀殑, 5.1姣擠ecoda鏂逛究鐐? 姣曠珶vs鏀寔鎮誕鏄劇ず鍙橀噺.
璇翠簡閭d箞澶? 鍏跺疄瀵逛簬lua5.2鐗堟湰鐨勮皟璇? 榪樻槸娌℃湁鍏嶈垂鐨勬瘮杈冨悎閫傜殑鏂規, 濡傛灉瀹炲湪鎯寵皟璇? 榪樻槸鍙互鍙傝冧笅RemDebug鐨勫師鐞嗗強lua瀹樻柟璋冭瘯鏂囨。, 鑷繁閫氳繃c api璋冪敤鍐欎竴濂楅傚悎鑷繁鐨勮繙紼嬭皟璇曞伐鍏? 鍏跺疄娌℃湁澶氬鏉? 浣嗘繪瘮涓嶈皟璇曠殑濂?img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="寰瑧" src="http://m.shnenglu.com/images/cppblog_com/sunicdavy/Windows-Live-Writer/lua_D2A5/wlEmoticon-smile_2.png">
鐢變簬瑕佷嬌鐢╬rotoc-gen-lua, 榪欎笢瑗跨敓鎴愬嚭鏉ョ殑lua渚濈劧浣跨敤瀹樻柟鐨刴odule/package鏈哄埗. 瀵逛簬娓告垙欏圭洰鏉ヨ, 鎯寵繘琛屼竴浜涜嚜瀹氫箟璇誨彇, 鍔犲瘑絳? 灝卞彉寰椾笉鍙兘. 騫稿ソ瀹樻柟鍦ㄦ墿灞曚笂鏀寔鐨勮繕鏄笉閿欑殑.
鍙傝僱ua5.2鐨勫畼鏂規枃妗?a title="http://www.lua.org/manual/5.2/manual.html#pdf-require" >http://www.lua.org/manual/5.2/manual.html#pdf-require
require鏃? lua浼氳嚜鍔ㄦ牴鎹竴瀹氱殑鎼滅儲瑙勫緥鎵懼埌鍔犺澆浠g爜鐨勬柟娉? 榪欎釜鏂規硶瀹氫箟鍦?a name="pdf-package.searchers">package.searchers榪欎釜鏁扮粍涓? 涓鍏辨湁4涓姞杞芥悳绱㈤『搴?/p>
1. preload, 瀵瑰凡鍔犺澆鐨刴odule榪涜鐩存帴榪斿洖, 瀵瑰簲package.preload[modname]
2. lualoader, 瀵筶ua鏂囦歡榪涜鍔犺澆, 鎼滅儲璺緞涓?a >package.path
3. cloader, 瀵筶ua鏍囧噯dll榪涜鍔犺澆, 鎼滅儲璺緞涓?a >package.cpath
4. croot, 瀹樻柟鏂囨。璇寸殑鏄痑ll-in-one鍔犺澆鍣? 鎰熻寰堢濂? 鎰熷叴瓚e彲浠ヨ嚜琛屽弬鑰冩簮鐮?/p>
閭d箞, 濡傛灉鍙渶瑕佽嚜宸辯殑鍔犺澆鍣? 鍙渶瑕佽繖鏍峰仛:
package.searchers[2] = function( name )
print("try to load", name )
end
package.searchers[3] = nil
package.searchers[4] = nil
require "libtest"
鍙繚鐣檖reload鍔熻兘, 鐒跺悗灝嗙浜屼釜鍔犺澆鍣ㄦ崲鎴愯嚜宸辯殑鍔犺澆鍑芥暟, 絎笁,絎洓鐩存帴灞忚斀1. 鍘繪帀浜嗗叏灞鎬ц川鐨剆etfenv/getfenv緋誨垪鍑芥暟, 璇█灞傞潰鎻愪緵_ENV璇硶緋? 榪欎笢瑗胯窡:鎿嶄綔絎︿竴鏍? 鍙瓨鍦ㄤ簬緙栬瘧鏈?
瀹樻柟寤鴻鑷繁瀹炵幇module/require/package鏈哄埗, 姣曠珶鍘熺敓榪欏鏈哄埗瀹炵幇澶急鏅轟簡..
2. 鎻愪緵浜嗘棤絎﹀彿璁塊棶鍑芥暟
3. 鏇村鐨刲ua api鍙樺寲. 濡傛灉鎯沖吋瀹筶ua5.1鐨勫啓娉? 鍙互鍙傝?a >luabridge鍐匧uaHelpers.h鐨勫疄鐜?/p>
浠ヤ笅鏄湰浜轟嬌鐢╨ua5.2瀹炵幇鐨勪竴濂梡ackage鏈哄埗, 渚涘ぇ瀹跺弬鑰?/p>
package = {}-- 璇誨彇鏍囪
package.loaded = {}-- 鎼滅儲璺緞鏁扮粍
package.path = {}package.access =
{["string"] = string,
["print"] = print, ["table"] = table, ["assert"] = assert, ["error"] = error, ["pairs"] = pairs, ["ipairs"] = ipairs, ["tonumber"] = tonumber, ["tostring"] = tostring, ["type"] = type, ["math"] = math,}
local function getreadablepath( name, pathlist )
for _, path in ipairs(pathlist) do
local fullpath = path .. "/" .. name .. ".lua"
local f = io.open( fullpath )
if f thenf:close()
return fullpathend
end
return nilend
function package.import( name )
-- 宸茬粡璇誨彇鐨勭洿鎺ヨ繑鍥?/pre>local existedenv = package.loaded[name]if existedenv thenreturn existedenvendlocal access = package.access-- 璁劇疆璁塊棶鎺у埗鏉冮檺local meta ={__index = function( tab, key )-- 浼樺厛鍙栧寘鐨勭┖闂?/pre>local v = rawget( tab, key )if v thenreturn vend-- 鎵句笉鍒版椂,浠庡彲璁塊棶鐨勬潈闄愯〃涓煡鎵?/pre>return access[key]end,}-- 鍒濆鍖栦竴涓寘鐨勫叏灞鐜, 騫惰緗闂柟娉?/pre>local env = setmetatable( {} , meta )--local readablepath = getreadablepath( name, package.path )if not readablepath thenerror(string.format("package '%s' not found \n%s", name, table.concat( package.path, "\n" ) ) )endlocal func = loadfile( readablepath, "bt", env )if type(func) ~= "function" thenreturn nilend-- 璁劇疆鏍囪package.loaded[name] = env-- 鎵ц鍏ㄥ眬絀洪棿func( )return envendpackage.path = {"E:/Download/t"}local m = package.import "m"m.foo()浠ヤ笅鏄痬妯″潡(m.lua)鐨勫唴瀹?/pre>function foo( )print("杞澆娉ㄦ槑: 鎴橀瓊灝忕瓚 http://m.shnenglu.com/sunicdavy", io )end
嫻嬭瘯緇撴灉涓? io鎵撳嵃鍑簄il, 鏄劇ず鏉冮檺宸茬粡琚帶鍒朵綇
鏈琾ackage璁捐姣斿師鐢焢ackage鏇寸伒媧? 鏇村己澶?/p>
鏈榪戝噯澶囧湪鎵嬫満欏圭洰瀹㈡埛绔腑浣跨敤lua, 浠ュ墠涓鐩村湪鏈嶅姟鍣ㄤ嬌鐢╨uabind. 鍙﹀, tolua++涔熶綋楠岃繃, LuaPlus涔熷湪鏃╁勾鐢ㄨ繃. 浠ヤ笅鏄湰浜哄榪欎簺緇戝畾搴撶殑涓漢鎰熻:
luabind
鍒╃敤boost鏈哄埗鎶婄粦瀹氬仛鍒版瀬鑷? 姣旇緝閫傚悎涓籧++, 寮眑ua鐨勮剼鏈鏋?
浣滆呭凡緇忓仠姝㈡洿鏂? 鍦╳indows/linux緙栬瘧娌¢棶棰? 浣嗘槸鍦╥os鐨凩LVM涓? 鏃犳硶緙栬瘧
tolua++
鍍廲ocos2dx浣跨敤tolua++涔熸槸鍙互鐞嗚В鐨? 閭d箞澶氬嚱鏁伴渶瑕佺粦瀹? tolua++鐨勫ご鏂囦歡parse鍙婅嚜鍔ㄤ唬鐮佺敓鎴愯妭綰︿簡寰堝鎵嬪姩緇戝畾鐨勬椂闂?
浣嗘槸鐪嬪埌浠g爜涓湁涓閮ㄥ垎bugfix灝卞績瀛樹笉瀹?綰釜浜烘劅瑙? 鏈漢浣跨敤涓嶅, 嬈㈣繋鐮栧ご浼哄?,鍙﹀, tolua++鍙兘鐢辮剼鏈眰椹卞姩C++, 鑰屾病鏈夊皢宸茬粡瀹炰緥鍖栫殑鍙ユ焺娉ㄥ唽鍒發ua鐨勫姛鑳戒篃鏄厼絎斿晩
LuaPlus
鎺ュ彛杈冧負綆鍗? 閫備簬鍒濆鑰呬笂鎵? 鏃犱換浣曠殑妯℃澘, 鎬ц兘涓嶉珮
luaBridge
欏圭洰鍦板潃: https://github.com/vinniefalco/LuaBridge
鎵嬪唽: http://vinniefalco.com/LuaBridge/Manual.html
綰ご鏂囦歡瀹炵幇, 鏃犻渶緙栬瘧, 鍖呭惈榪涘叆宸ョ▼鍗沖彲, 鎺ュ彛綆媧侀珮鏁?/p>
鐩告瘮luabind, 鍞竴涓嶈兘瀹炵幇鐨勫父鐢ㄥ姛鑳藉氨鏄灇涓? 浣嗘槸鍙互鏀寔綾繪垚鍛橀潤鎬佸彉閲忔敞鍐? 榪欎釜灝辨棤鎵璋撲簡, 鎵嬪啓涓涓灇涓炬敮鎸佷篃寰堢畝鍗?/p>
鐪嬩笅婕旂ず浠g爜:
class A { public: A( ) { } virtual void foo( int a ) { printf("foo base\n"); } std::string Member; }; class B : public A { public: virtual void foo( int a ) { printf("foo inherited\n"); } };
void foo( int b ) { }
luabridge::getGlobalNamespace(L)
.beginClass<A>("Sobj")
.addConstructor<void (*) (void)> ()
.addFunction("foo", &A::foo)
.addData("Member",&A::Member)
.endClass()
.deriveClass<B, A>("SSec")
.addFunction("foo",&B::foo )
.endClass();
luabridge::getGlobalNamespace(L).addFunction("foo", foo );
B ins;
ins.Member = "data";
luabridge::setGlobal(L, ins, "ins");
lua渚х殑浠g爜
local a = Sobj()
a:foo(2)
a.Member = "hello"
ins:foo(3)
鏂囨湰鏍煎紡鐨勮В鏋愰敊璇笉鑳戒嬌鐢ㄦ崟鑾烽敊璇潵鑾峰彇, 鍥犳,鎴戜滑闇瑕佷嬌鐢ㄨ嚜瀹氫箟鐨勯敊璇敹闆嗗櫒榪涜鏀墮泦, 鐪嬩唬鐮?
#include <google/protobuf/text_format.h>
#include <google/protobuf/io/zero_copy_stream_impl_lite.h>
#include <google/protobuf/io/tokenizer.h>
class PBTextErrorCollector : public google::protobuf::io::ErrorCollector
{public:PBTextErrorCollector( const std::string& FileName )
: mFileName( FileName )
{}
virtual void AddError(int line, int column, const string& message)
{ CCLog("%s(%d:%d) %s ", mFileName.c_str(), line, column, message.c_str() );}
virtual void AddWarning(int line, int column, const string& message)
{ CCLog("%s(%d:%d) %s ", mFileName.c_str(), line, column, message.c_str() );}
private: std::string mFileName;};
瑙f瀽浠g爜
google::protobuf::TextFormat::Parser P;
P.RecordErrorsTo( &PEC );
P.Parse( &AIS, &AF );
鍙﹀: 鏂囨湰鏍煎紡鐨勬敞閲婁嬌鐢╱nix shell椋庢牸: 浠?寮澶?/p>
涓嬮潰鏄垜鐨勬枃鏈牸寮忕殑閰嶇疆鏂囦歡
AnchorPointX: 0.5 AnchorPointY: 0 SpriteScale: 2 ComponentName: "ActorActionManager" ComponentName: "ActorFrameEventDispatcher" #ComponentName: "SoundFXController" ComponentName: "RoleDeltaMoveController" ComponentName: "RoleBehaviorDirector" InitAction: AA_Idle Animations { AnimationName: "mai_idle" AnimationInterval: 0.067 }
緙栬瘧python鐗堢殑protobuf妯″潡
鍦?a >https://code.google.com/p/protobuf/downloads/list 涓嬭澆瀹樻柟鐨勫師鐢熺増鏈琾rotobuf, 榪欓噷鍙戞枃鏃朵嬌鐢ㄧ殑鏄?.4.1鐗堟湰
緙栬瘧鍑簆rotoc鎵ц鏂囦歡, 鏀句竴浠藉湪protobuf-2.4.1\src\涓?/p>
涓嬭澆python2.7鐗堟湰, 鍦╬rotobuf-2.4.1\python涓嬭繍琛宲ython setup.py install(濡傛灉鎵句笉鍒皃ython璇風粰python緇濆璺緞)
榪欎竴姝? python浼氫笅涓涓泲( 鐪熺殑鏄竴涓猵ython鐨別gg鏂囦歡 ), 鐒跺悗緙栬瘧鍑簆ython鐗堟湰鐨刾rotobuf妯″潡鏀劇疆鍦╬ython涓?/p>
鍒朵綔protoc-gen-lua鐨勬壒澶勭悊
鏀句竴浠絧rotoc鍦╬rotoc-gen-lua鐨刾lugin鐩綍
緙栧啓鎵瑰鐞?protoc-gen-lua.bat
@python "%~dp0protoc-gen-lua"
鍗忚鐩綍鐢熸垚鑴氭湰
鍦ㄤ綘闇瑕佹斁緗崗璁殑鐩綍緙栧啓濡備笅鎵瑰鐞?/p>
buildproto.bat
rd /S /Q .\%1%
"..\..\src\protoc-gen-lua\plugin\protoc.exe" --plugin=protoc-gen-lua="..\..\src\protoc-gen-lua\plugin\protoc-gen-lua.bat" --lua_out=. %1%.proto
娉ㄦ剰protoc.exe鍙妏rotoc-gen-lua.bat鐨勮礬寰勭鍚堜綘鐨勮礬寰?/p>
鍐嶇紪鍐欒緙栬瘧鐨刾roto鍗忚鐨勬壒澶勭悊generate.bat
call buildproto.bat loginsvc
鎵цgenerate.bat鍚? 灝嗕細緙栬瘧鍚岀洰褰曚笅鐨刲oginsvc.proto,杈撳嚭loginsvc_pb.lua
緙栬瘧閾炬帴lua鐨刾b搴?/strong>
灝唒rotoc-gen-lua\protobuf\鐩綍鎷瘋礉鍒頒箣鍓嶇殑鍗忚鐩綍
灝嗗叾涓嬬殑pb.c閾懼叆浣犵殑宸ョ▼, 娉ㄦ剰VS2010鐨刅C涓嬮渶瑕佷慨鏀規簮鐮?/p>
1.灝?#include <endian.h>淇敼涓?/p>
#ifndef _WIN32
#include <endian.h>
#endif
閬垮厤鍦╳indows涓嬬己澶辨枃浠舵姤閿?
2. 璋冩暣struct_unpack鍑芥暟鍓嶅嚑琛屼負
static int struct_unpack(lua_State *L)
{
uint8_t format = luaL_checkinteger(L, 1);
size_t len;
const uint8_t* buffer = (uint8_t*)luaL_checklstring(L, 2, &len);
size_t pos = luaL_checkinteger(L, 3);
uint8_t out[8];
buffer += pos;
閬垮厤VS2010鐨刅C緙栬瘧鍣ㄨ繃浜庢爣鍑? 涓ユ牸瑕佹眰C椋庢牸鍑芥暟鍙橀噺鍓嶇疆澹版槑
鍦╨ua_State澹版槑鍚庢坊鍔犲涓嬩唬鐮?/p>
extern "C" { int luaopen_pb (lua_State *L);} // 娉ㄦ剰闃插湪鍛藉悕絀洪棿澶栫殑鍏ㄥ眬澹版槑
luaopen_pb( L ); // 鐩存帴娉ㄥ叆鍏ㄥ眬pb, 閬垮厤鍔ㄦ佸姞杞絧b.dll閫犳垚鐨勪竴緋誨垪璺ㄥ鉤鍙伴棶棰?/p>
lua涓嬌鐢╬b
local loginsvc_pb = require “loginsvc_pb”local REQ = loginsvc_pb.CheckVersionREQ()local Data = REQ:SerializeToString( )local ACK = loginsvc_pb.CheckVersionACK()ACK:ParseFromString( Data )
.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }
鎴戠殑宸ョ▼鐩綍
script\
protobuf\
buildproto.bat
generate.bat
loginsvc_pb.lua
loginsvc.proto
Main.lua
src\
protoc-gen-lua\
example\
plugin\
protobuf\
榪欓噷鎴戜滑璁ㄨ鐨勬槸lua鐨勪簨浠舵淳鍙戞満鍒? 鎴戝皢姝ゅ啓鎴恖ua妯″潡, 鏂逛究閰嶅悎cocos2dx榪涜閫昏緫澶勭悊
local Global = _Glocal package = _G.packagelocal setmetatable = _G.setmetatablelocal assert = _G.assertlocal table = _G.tablelocal pairs = _G.pairslocal ipairs = _G.ipairsmodule "Core.EventDispatcher"--[[
鏁版嵁灞傛
["EventName1"] ={ ["_StaticFunc"] = { Func1, Func2 }, [Object1] = { Func1, Func2 }, [Object2] = { Func1, Func2 },},
["EventName2"] ={...
}
]]
-- 榛樿璋冪敤鍑芥暟
local function PreInvoke( EventName, Func, Object, UserData, ... )
if Object thenFunc( Object, EventName, ... )
elseFunc( EventName, ... )
endendfunction New( ) local NewObj = setmetatable( {}, { __index = package.loaded["Core.EventDispatcher"] } )
-- 瀵硅薄鎴愬憳鍒濆鍖?/pre>NewObj.mPreInvokeFunc = PreInvokeNewObj.mEventTable = {}return NewObjend-- 娣誨姞function Add( Self, EventName, Func, Object, UserData )assert( Func )Self.mEventTable[ EventName ] = Self.mEventTable[ EventName ] or {}local Event = Self.mEventTable[ EventName ]if not Object thenObject = "_StaticFunc"endEvent[Object] = Event[Object] or {}local ObjectEvent = Event[Object]ObjectEvent[Func] = UserData or trueend-- 璁劇疆璋冪敤鍓嶅洖璋?/pre>function SetDispatchHook( Self, HookFunc )Self.mPreInvokeFunc = HookFuncend-- 媧懼彂function Dispatch( Self, EventName, ... )assert( EventName )local Event = Self.mEventTable[ EventName ]for Object,ObjectFunc in pairs( Event ) doif Object == "_StaticFunc" thenfor Func, UserData in pairs( ObjectFunc ) doSelf.mPreInvokeFunc( EventName, Func, nil, UserData, ... )endelsefor Func, UserData in pairs( ObjectFunc ) doSelf.mPreInvokeFunc( EventName, Func, Object, UserData, ... )endendendend-- 鍥炶皟鏄惁瀛樺湪function Exist( Self, EventName )assert( EventName )local Event = Self.mEventTable[ EventName ]if not Event thenreturn falseend-- 闇瑕侀亶鍘嗕笅map, 鍙兘鏈変簨浠跺悕瀛樺湪, 浣嗘槸娌℃湁浠諱綍鍥炶皟鐨?/pre>for Object,ObjectFunc in pairs( Event ) dofor Func, _ in pairs( ObjectFunc ) do-- 灞呯劧鏈変竴涓?/pre>return trueendendreturn falseend-- 娓呴櫎function Remove( Self, EventName, Func, Object )assert( Func )local Event = Self.mEventTable[ EventName ]if not Event thenreturnendif not Object thenObject = "_StaticFunc"endlocal ObjectEvent = Event[Object]if not ObjectEvent thenreturnendObjectEvent[Func] = nilend-- 娓呴櫎瀵硅薄鐨勬墍鏈夊洖璋?/pre>function RemoveObjectAllFunc( Self, EventName, Object )assert( Object )local Event = Self.mEventTable[ EventName ]if not Event thenreturnendEvent[Object] = nilend
榪欓噷娉ㄦ剰涓? 鎴戞槸灝咵ventDispatcher.lua鏀劇疆鍦–ore鐩綍涓? 鍥犳闇瑕佷嬌鐢╮equire 鈥淐ore.EventDispatcher鈥濊繘琛岃皟鐢?/p>
浣跨敤鐢ㄤ緥
local EventDispatcher = require 'Core.EventDispatcher'
local E = EventDispatcher.New()E:Add( "a", function( a, b ) print( a, b ) end )
local Func = function( a ) print( a ) end
E:Add( "a", Func ) E:Dispatch("a", 1, 2 )print( E:Exist("a"), E:Exist("b"))
E:Remove("a", Func ) E:Dispatch("a", 1, 2 )print( E:Exist("a"), E:Exist("b"))
Private Sub ConvFile(InputFile As String, OutputFile As String)
Dim ReadStream As Object
Set ReadStream = CreateObject("ADODB.Stream")
Dim FileContent As String
With ReadStream .Type = 2 'adTypeText .Charset = "UNICODE".Open
.LoadFromFile InputFile
FileContent = .ReadText
.Close
End With
Set ReadStream = Nothing
Dim WriteStream As Object
Set WriteStream = CreateObject("ADODB.Stream")
With WriteStream .Type = 2 'adTypeText .Charset = "UTF-8".Open
.WriteText FileContent
.SaveToFile OutputFile, 2 'adSaveCreateOverWrite.Flush
.Close
End With
Set WriteStream = Nothing
End Sub
涓婂崐鎴槸璇誨彇鏂囦歡, 涓嬪崐鎴槸鍐欏叆鏂囦歡, 闇瑕佽漿鎹笉鍚屾牸寮? 璇瘋嚜琛屾洿鎹?/p>
ServicePath=/usr/local/bin ServiceList=( "wkcenterd --toc /home/davy/dev/kaze/Config/CenterService.toc --logfile /tmp/centerd.log" "wkagentd --toc /home/davy/dev/kaze/Config/AgentService.toc --logfile /tmp/agentd.log" ) StartAll() { for((i = 0;i<${#ServiceList[*]};i=i+1)) do echo "start:" $ServicePath/${ServiceList[i]} $ServicePath/${ServiceList[i]} > /dev/null & done } StopAll() { for((i = 0;i<${#ServiceList[*]};i=i+1)) do echo "stop:" $ServicePath/${ServiceList[i]} svcname=`echo ${ServiceList[i]} | awk '{print $1}'` killall $svcname > /dev/null done } RestartAll() { StopAll StartAll } InstallService() { svcname=`basename $0` chmod +x $svcname cp $svcname /etc/init.d ln /etc/init.d/$svcname /etc/rc3.d/S03$svcname ln /etc/init.d/$svcname /etc/rc0.d/K03$svcname chkconfig --add $svcname chkconfig $svcname on chkconfig --list | grep $svcname } UninstallService() { svcname=`basename $0` chkconfig --del $svcname rm -f /etc/init.d/$svcname rm -f /etc/rc3.d/S03$svcname rm -f /etc/rc3.d/K03$svcname } case "$1" in start) StartAll ;; stop) StopAll ;; restart) RestartAll ;; install) InstallService ;; uninstall) UninstallService ;; *) echo "Usage: service $EXEC {install|start|stop|restart|uninst}" exit 1 esac exit $?
鍙﹀涓縐嶈幏鍙栨柟娉曟槸table.getn(obj), 浣嗘槸榪欎釜鏂規硶宸茬粡鏍囪涓哄簾闄や簡, 灝介噺浣跨敤閫氱敤涓旂畝媧佺殑#鎿嶄綔絎?/p>
浣跨敤lua api瀹炵幇姝ゅ姛鑳藉氨闇瑕佺敤鍒發ua_objlen( ),浣嗘槸榪欎釜鍔熻兘鏈湪luabind涓彁渚?鎵浠ユ垜浠『鎵嬫坊鍔犱竴涓?/p>
棣栧厛鎵懼埌luabind婧愮爜鐨刼bject.hpp涓彇瀵硅薄綾誨瀷鐨則ype鍑芥暟,鍦ㄥ叾涓嬫坊鍔犱互涓嬩唬鐮?/p>
閲嶆柊緙栬瘧浣犵殑浠g爜, 灝卞彲浠ヨ繖鏍蜂嬌鐢╨uabind::obj_size( obj ) 鑾峰彇瀵硅薄澶у皬浜?img src ="http://m.shnenglu.com/sunicdavy/aggbug/169178.html" width = "1" height = "1" />1: template<class ValueWrapper>2: inline int obj_size(ValueWrapper const& value)3: {4: lua_State* interpreter = value_wrapper_traits<ValueWrapper>::interpreter(5: value6: );7:8: value_wrapper_traits<ValueWrapper>::unwrap(interpreter, value);9: detail::stack_pop pop(interpreter, 1);10: return lua_objlen(interpreter, -1);11: }
1: void ScriptManagedChannel::OnServiceInitialize()
2: { 3: try
4: { 5: mThread = lua_newthread( GScriptScriptContext->GetVM() ); 6: 7: luabind::resume_function<void>( mThread, "ScriptMain", this );
8: 9: Resume(); 10: }11: catch (std::exception& e)
12: {13: const char* ErrorMsg = lua_tostring( GScriptScriptContext->GetVM(), -1 );
14: printf("%s\n", e.what() );
15: } 16: 17: 18: } 19: 20: void ScriptManagedChannel::Resume( )
21: {22: luabind::resume<void>( mThread );
23: } 24: 25: void ScriptManagedChannel::StopTest( )
26: { 27: lua_yield( mThread, 0 ); 28: } 29: 30: 浠g爜涓? mThread綾誨瀷涓簂ua_State*綾誨瀷
GScriptScriptContext->GetVM()鏄姞杞戒簡浠g爜鐨刲ua_State*
StopTest涓烘敞鍐屼負ScriptManagedChannel綾繪垚鍛樺嚱鏁板埌lua涓殑瀹氫箟
鎺ヤ笅鏉ョ湅lua绔殑嫻嬭瘯浠g爜:
1: function ScriptMain( Channel )
2: 3: 4: for i = 1, 5 do
5: 6: print("done", i)
7: 8: Channel:StopTest( ) 9: 10: 11: 12: end
13: end鍒氬紑濮?鍦ㄦ祴璇曚唬鐮佹椂, lua涓湁涓墜璇岄犳垚鐨勯敊璇? 瀵艱嚧C++浠g爜榪愯鍒扮7琛屾椂寮瑰嚭assert
浣嶄簬:luabind-0.9.1\luabind\detail\call_function.hpp 絎?64琛?瀵瑰簲浠ヤ笅浠g爜絎?3琛?/p>
1: ~proxy_function_void_caller() 2: {3: if (m_called) return;
4: 5: m_called = true; 6: lua_State* L = m_state; 7: 8: int top = lua_gettop(L);
9: 10: push_args_from_tuple<1>::apply(L, m_args);11: if (m_fun(L, boost::tuples::length<Tuple>::value, 0))
12: { 13: assert(lua_gettop(L) == top - m_params + 1); 14: 15: NO_EXCEPTIONS16: throw luabind::error(L);
17: #else
18: error_callback_fun e = get_error_callback();19: if (e) e(L);
20: 21: assert(0 && "the lua function threw an error and exceptions are disabled."
22: " If you want to handle the error you can use luabind::set_error_callback()");
23: std::terminate();24: #endif
25: }26: // pops the return values from the function call
27: stack_pop pop(L, lua_gettop(L) - top + m_params); 28: }11琛屼唬鐮佷腑璋冪敤鐨勬槸lua_resume, 榪斿洖鐨勬槸榪愯閿欒, 浣嗘槸琚?3琛岀殑assert鎸′綇浜? 鏃犳硶閫氳繃絎?6琛屾姏鍑哄紓甯歌澶栭潰鎹曡幏.
鍥犳,灝濊瘯娉ㄩ噴絎?3琛?/strong>, 鍐嶆祴璇? 鍙互鍦╨ua鎶涘嚭閿欒鍚? 鍦ㄦ爤欏舵崟鑾峰埌coroutine鍑芥暟resume鏃舵姤鍑虹殑閿欒淇℃伅.闂瑙e喅
瀵逛簬lua鐨刢oroutine, 緗戜笂璧勬枡涓嶅, 榪欓噷鏈変竴綃囨瘮杈冭緇嗙殑浠g爜
鎴戞瘮杈冪枒鎯戠殑鏄? 鏈夋病鏈夊繀瑕佸皢浠g爜鍦╠ofile鎴栬卍obuffer鏃? 蹇呴』浼犲叆newthread鍑虹殑state? 濡傛灉榪樻槸浼犲叆鍘熷鐨剆tate浼氭湁浠涔堝獎鍝?
嬈㈣繋鍚勪綅鏈夋緇忛獙鐨勮璁?/p>
搴熻瘽涓嶅璇? 鐪嬩唬鐮?/p>
1: -- 鍒涘緩娌欑洅2: function SpawnSandBox( )
3: 4: local SandBoxGlobals = {}
5: 6: -- 鍩虹鍑芥暟娣誨姞 7: SandBoxGlobals.print = print 8: SandBoxGlobals.table = table 9: SandBoxGlobals.string = string 10: SandBoxGlobals.math = math 11: SandBoxGlobals.assert = assert 12: SandBoxGlobals.getmetatable = getmetatable 13: SandBoxGlobals.ipairs = ipairs 14: SandBoxGlobals.pairs = pairs 15: SandBoxGlobals.pcall = pcall 16: SandBoxGlobals.setmetatable = setmetatable 17: SandBoxGlobals.tostring = tostring 18: SandBoxGlobals.tonumber = tonumber 19: SandBoxGlobals.type = type 20: SandBoxGlobals.unpack = unpack 21: SandBoxGlobals.collectgarbage = collectgarbage 22: SandBoxGlobals._G = SandBoxGlobals 23: 24: return SandBoxGlobals
25: end
26: 27: -- 鍦ㄦ矙鐩掑唴鎵ц鑴氭湰, 鍑洪敊鏃惰繑鍥為敊璇? nil琛ㄧず姝g‘28: function ExecuteInSandBox( SandBox, Script )
29: 30: local ScriptFunc, CompileError = loadstring( Script )
31: 32: if CompileError then
33: return CompileError
34: end
35: 36: setfenv( ScriptFunc, SandBox ) 37: 38: local Result, RuntimeError = pcall( ScriptFunc )
39: if RuntimeError then
40: return RuntimeError
41: end
42: 43: return nil
44: end
45: 46: function ProtectedFunction( )
47: print("protected func")
48: end
49: 50: 51: local SandBox = SpawnSandBox( )
52: 53: 54: print ( "Response=", ExecuteInSandBox( SandBox, "table.foreach( _G, print )" ) )
55: 56: print ( "Response=", ExecuteInSandBox( SandBox, "ProtectedFunction()" ) )
57: 58: SandBox.ProtectedFunction = ProtectedFunction 59: 60: print ( "Response=", ExecuteInSandBox( SandBox, "ProtectedFunction()" ) )
54琛屾墽琛岀粨鏋滄槸
1: _G table: 00421258 2: string table: 004210503: pairs function: 00567F58
4: collectgarbage function: 005675F0
5: unpack function: 004217E8
6: assert function: 005675B0
7: print function: 00567830
8: ipairs function: 00567F28
9: type function: 004217A8
10: tonumber function: 00421768
11: tostring function: 00421788
12: table table: 00420DA8 13: math table: 004210C814: setmetatable function: 00421748
15: getmetatable function: 00567710
16: pcall function: 005677F0
17: Response= nil榪欓噷鏄竴涓猄hell鍙互灝嗕緷璧栧垪琛ㄤ腑鐨勬枃浠舵嫹璐濆埌鎸囧畾鐩綍
deplist=$( ldd $1 | awk '{if (match($3,"/")){ print $3}}' )
cp $deplist $2浠g爜瑙i噴: ldd瀵煎嚭鍒楄〃, 榪欎釜鍒楄〃鎵撳嵃鍑烘潵寰堜笐
linux-gate.so.1 => (0x00ed2000)
liblog4cpp.so.4 => /usr/local/lib/liblog4cpp.so.4 (0x00657000)
libprotobuf.so.7 => /usr/local/lib/libprotobuf.so.7 (0x00360000)
libboost_filesystem.so.1.48.0 => /usr/local/lib/libboost_filesystem.so.1.48.0 (0x00a9a000)
libboost_program_options.so.1.48.0 => /usr/local/lib/libboost_program_options.so.1.48.0 (0x00110000)
libboost_system.so.1.48.0 => /usr/local/lib/libboost_system.so.1.48.0 (0x00a85000)
libboost_thread.so.1.48.0 => /usr/local/lib/libboost_thread.so.1.48.0 (0x00179000)
libunwind-x86.so.7 => /usr/lib/libunwind-x86.so.7 (0x00821000)
libluabindd.so.0.9.0 => /usr/local/lib/libluabindd.so.0.9.0 (0x00bb3000)
libmysqlpp.so.3 => /usr/local/lib/libmysqlpp.so.3 (0x00de5000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0x001a9000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0x00782000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0x00aea000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0x00447000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0x00abd000)
librt.so.1 => /lib/i386-linux-gnu/librt.so.1 (0x00193000)
libnsl.so.1 => /lib/i386-linux-gnu/libnsl.so.1 (0x00294000)
libunwind.so.7 => /usr/lib/libunwind.so.7 (0x002ab000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0x00e8a000)
libmysqlclient_r.so.16 => /usr/lib/libmysqlclient_r.so.16 (0x0083b000)
/lib/ld-linux.so.2 (0x00608000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0x002c0000)
鎴戜滑鍙戠幇絎竴琛岀殑so娌℃湁瀵瑰簲鐨勫簱鍦板潃, 鍥犳鎴戜滑浣跨敤awk鐨勮剼鏈姛鑳?鍒ゆ柇絎笁涓弬鏁?涔熷氨鏄?>涔嬪悗鐨勮礬寰勫繀欏誨寘鍚?
涔嬪悗灝嗙涓琛岀殑杈撳嚭閲嶅畾鍚戝埌鍙橀噺涓? 鍐嶄嬌鐢╟p鎸囦護浠庡垪琛ㄦ嫹璐濆埌鎸囧畾鐩綍
BuildProtoCC.bat
@echo off
set protofile=%1%.proto
set output_cc=%1%.pb.cc
"protoc.exe" %protofile% --cpp_out .
@echo 浣跨敤%protofile%鐢熸垚%output_cc%
if exist "pchheader.txt" goto 鍚堝茍棰勭紪璇戝ご else echo pchheader.txt NOT EXIST
:鍚堝茍棰勭紪璇戝ご
@echo 灝濊瘯鍒犻櫎浠ュ墠鐨勪腑闂存枃浠?br>del *.pched
@echo 鍚堝茍緙栬瘧澶存枃浠秔chheader.txt鍒扮敓鎴?output_cc%
copy pchheader.txt+"%output_cc%" "%output_cc%.pched" /y
@echo 絳夊緟protoc.exe緇撴潫
@ping -n 2 127.1>nul
echo 娓呯悊鏂囦歡
del "%output_cc%"
ren "%output_cc%.pched" "%output_cc%"
榪欐鎵瑰鐞嗚繖鏍蜂嬌鐢?
鍋囪浣犳湁涓涓彨login.proto鏂囦歡鍜屾壒澶勭悊鏀懼湪涓璧?
鍦ㄥ悓涓鐩綍鍐嶆斁緗竴涓猵chheader.txt鏂囦歡,騫跺湪閲岄潰鍐欏叆#include "stdafx.h鈥?
璋冪敤涓涓嬫壒澶勭悊
call BuildProtoCC.bat login
娉ㄦ剰login涓嶈兘甯﹀悗緙
灝嗕嬌鐢╬rotoc.exe鐢熸垚login.pb.cc鍜宭ogin.pb.h 鐒跺悗浣跨敤鎵瑰鐞嗗悎騫舵枃浠跺姛鑳借嚜鍔ㄥ悎騫墮緙栬瘧澶?
涓嶈繃瀹樼綉涔熸彁鍒拌繃ActionScript3鐨勬敮鎸?鐐瑰嚮鐪?a >榪欓噷
protobuf-actionscript3鍖呮嫭ActionScript3鐨勫簭鍒楀彿鍙婂弽搴忓垪鍖栫殑as婧愮爜.浠ュ強protoc鐨刟s3浠g爜鐢熸垚鍣ㄧ殑C++浠g爜
鍙﹀, protobuf-actionscript3榪橀渶瑕佷竴涓姞瀵嗗簱as3crypto鏀寔,闇瑕佷竴騫朵笅杞?/p>
褰撶劧, protobuf 搴撲篃鏄渶閲嶈鐨?
涓嬮潰璇存槑濡備綍緙栬瘧鍑烘敮鎸乤s3鐨刾rotoc浠g爜鐢熸垚鍣?
1. 灝唒rotobuf-actionscript3搴撲腑compiler\as3鐩綍鎷瘋礉鍒皃rotobuf搴撶殑src\google\protobuf\compiler涓?鐩綍緇撴瀯濡備笅:
as3\
cpp\
java\
python\
code_generator.cc
command_line_interface.cc
...
2.鎵撳紑protobuf宸ョ▼涓殑sln, 鍦╨ibprotoc娣誨姞鍒氭墠娣誨姞鐨刟s3鐩綍涓嬬殑鎵鏈夋枃浠?/p>
3. 鍦╬rotoc宸ョ▼鐨刴ain.cc涓坊鍔?/p>
google::protobuf::compiler::as3::As3Generator as3_generator; cli.RegisterGenerator("--as3_out", &as3_generator, "Generate ActionScript source file.");
4. 鎵撳紑as3_file.h
娉ㄩ噴鎺変互涓嬩唬鐮?/p>
namespace protobuf { class FileDescriptor; // descriptor.h namespace io { class Printer; // printer.h } namespace compiler { class OutputDirectory; // code_generator.h } }
鍖呭惈鍐呮坊鍔?/p>
#include <google/protobuf/stubs/common.h> #include <google/protobuf/compiler/code_generator.h> #include <google/protobuf/io/printer.h>
5. 緙栬瘧鍑簆rotoc.exe
6. 鍑嗗proto鏂囦歡, 浣跨敤protoc.exe浣跨敤綾諱技CPP鐢熸垚鐨勬柟寮忚繘琛岀敓鎴?/pre>7. 灝唒rotobuf-actionscript閲岀殑as3-lib鍙婁笅杞藉ソ鐨勫姞瀵嗙殑swc鏁村悎鍒拌嚜宸辯殑flash宸ョ▼鍗沖彲寮濮嬩嬌鐢?/pre>
]]>
鏉鵑紶鑴氭湰鍙互璇存槸Lua鐨勮秴綰у寮虹増,浣滆呭湪Crysis欏圭洰浣跨敤Lua澶氬勾,娣辯煡Lua鐨勪紭緙虹偣.涔嬪悗鑷繁緙栧啓浜嗘澗榧犺剼鏈潵瑙e喅璇稿class,attribute,delegation,鏇村己澶х殑thread,exception絳夌瓑鍔熻兘.
鏉鵑紶鑴氭湰鏈韓瀵筗indows寮鍙戜漢鍛樻瀬涓虹収欏?絎笁鏂瑰簱鍙皳涓板瘜,榪滅▼璋冭瘯,浠g爜鍔犺壊鍙婅娉曟鏌ラ兘鍙互鐩存帴鍦╒S2008鐨処DE涓繘琛?
綆鍗曠殑榪滅▼璋冭瘯鍔熻兘闇瑕佷互涓嬫楠?
1. 涓嬭澆鏉鵑紶鑴氭湰3.0鐗堟湰
2. 鍦?a >鏉鵑紶鑴氭湰Wiki涓笅杞?a >SQDBG榪滅▼璋冭瘯搴?/a>
3. 灝唖qdbg宸ョ▼鏀懼埌SQUIRREL3涔嬩笅,鎵撳紑SQUIRREL3\squirrel.sln,灝唖qdbg娣誨姞鍒板伐紼?緙栬瘧鎵鏈?/p>
4. 鍦ㄨ繖涓猄olution涓?鍒涘緩涓涓猄quirrel鏉鵑紶宸ョ▼
5. 鍦ㄦ柊鍒涘緩鐨勬澗榧犲伐紼嬪睘鎬т腑濡備笅鍥捐緗?/p>
Interpreter鍏跺疄灝辨槸鍚姩璋冭瘯鍣?涓嶆槸sq.exe)
WorkingDirectory 灝辨槸main.nut鎵鍦ㄧ殑鐩綍(瀹樼綉鐨勮礬寰勮緗湁鐐硅瀵?
Command Line Options 灝辨槸浼犲叆sqdbg.exe鐨勫懡浠よ鍙傛暟
淇敼涓媘ain.nut鏂囦歡,渚嬪:
for(local i = 1;i<10;i++)
{
print( i );
}
鍦╬rint璇彞鍓嶆墦涓婃柇鐐?璋冭瘯鏉鵑紶宸ョ▼,鍗沖彲鐪嬪埌璋冭瘯緇撴灉
鏈夊叧浜嶴QDBG澶氭枃浠惰皟璇?
SQDBG榛樿鍙兘璋冭瘯1涓枃浠?鏄劇劧鏄釜鐜╁叿,涓嶈兘搴斿娓告垙鍜屽叾浠栭鍩熺殑澶氭枃浠惰皟璇? 鍒嗘瀽浜嗕笅SQDBG鐨勪唬鐮?/p>
1: int main(int argc, char *argv[])
2: {3: if(argc < 2){
4: scprintf(_SC("SQDBG error : no file specified"));
5: return -1;
6: } 7: 8: HSQUIRRELVM v = sq_open(1024); 9: sqstd_seterrorhandlers(v); 10: 11: //!! INITIALIZES THE DEBUGGER ON THE TCP PORT 1234
12: //!! ENABLES AUTOUPDATE
13: HSQREMOTEDBG rdbg = sq_rdbg_init(v,1234,SQTrue);14: if(rdbg) {
15: 16: //!! ENABLES DEBUG INFO GENERATION(for the compiler)
17: sq_enabledebuginfo(v,SQTrue); 18: 19: sq_setprintfunc(v,printfunc,errorfunc); 20: 21: //!! SUSPENDS THE APP UNTIL THE DEBUGGER CLIENT CONNECTS
22: if(SQ_SUCCEEDED(sq_rdbg_waitforconnections(rdbg))) {
23: scprintf(_SC("connected\n"));
24: 25: const SQChar *fname=NULL;
26: #ifdef _UNICODE 27: SQChar sTemp[256];28: mbstowcs(sTemp,argv[1],(int)strlen(argv[1])+1);
29: fname=sTemp;30: #else
31: fname=argv[1];32: #endif
33: //!!REGISTERS STANDARDS LIBS
34: sq_pushroottable(v); 35: sqstd_register_bloblib(v); 36: sqstd_register_iolib(v);37: //!!EXECUTE A SCTIPT
38: if(SQ_FAILED(sqstd_dofile(v,fname,SQFalse,SQTrue))) {
39: PrintError(v); 40: _getch(); 41: } 42: }43: //!! CLEANUP
44: sq_rdbg_shutdown(rdbg); 45: }46: else {
47: PrintError(v); 48: } 49: sq_close(v);鍙戠幇鍐欒繖涓簱鐨勮佸榪樻槸寰堣鐪熺殑,浣跨敤浜唖q_rdbg浣滀負debugger鐨刟pi鍓嶇紑,鎰忓懗鐫榪欎釜搴撲唬鐮佹槸鍙互澶嶇敤鐨?
sqstd_dofile(v,fname,SQFalse,SQTrue)
榪欏氨鏄疭QDBG鍙兘debug 1涓枃浠剁殑鍘熷洜.
濡傛灉闇瑕佸湪欏圭洰涓仛榪滅▼璋冭瘯,鍙渶瑕佸皢榪欏彞浠g爜鎹負宸ョ▼涓姞杞芥墍鏈夎剼鏈殑浠g爜鍜屾敞鍐岀郴緇烝PI浠g爜鍗沖彲
褰撶劧,鏈綆鍗曠殑鏂規硶,鐩存帴鍦ㄤ唬鐮侀《绔坊鍔燿ofile寮曠敤鍙﹀鐨勪唬鐮佸嵆鍙?/p>
1. Lua
Lua鐢ㄤ簡5,6騫寸殑鏍峰瓙,浠嶭uaPlus鍒發ua-tinker鍐嶅埌lua_bind. 铏界劧lua鏈韓寰堝皬宸ф柟渚?浣嗘槸鍏朵笉鏀寔闈㈠悜瀵硅薄鐗規?璁╁緢澶氫漢鍦ㄤ嬌鐢ㄦ椂妯℃嫙浜嗗緢澶氶潰鍚戝璞$殑鐗規?浣嗘槸榪欑鍋氭硶鍦ㄨ皟璇曟椂綆鐩存槸鍣╂ⅵ.
鎴戣寰楁父鎴忚剼鏈渶濂芥槸鑳介緙栬瘧鎴恇yte code,璁╃紪璇戝櫒鍦ㄧ紪璇戞湡灝嗗緢澶氱殑bug鏆撮湶鍑烘潵,鑰屼笉鏄儚lua閭f牱.寰堝絀鴻闂敊璇繀欏昏絳夊埌runtime鎵嶈兘鏆撮湶.璁╄皟璇曟晥鐜囧ぇ澶ч檷浣?榪欑偣,mono C#灝辨槸鏋佸ソ鐨勯夋嫨.
2. Mono
鐢變簬Unity鐨勬祦琛?Mono琚甫鍏ユ父鎴忓紑鍙戣呯殑瑙嗙嚎鍐?鍏跺唴緗殑寰堝緋葷粺鑴氭湰閮芥槸鐢–#鍐欐垚,鑰屼笖閫昏緫鑴氭湰鐢–#緙栧啓涔熸槸闈炲父娓呮櫚涓ヨ皚鐨?
鎹Mono鍦╓indows涓嬬紪璇戝紓甯擱夯鐑?鑰屼笖宓屽叆鏂瑰紡涔熸病鏈夊お澶氫緥瀛?鐜板湪榪欏潡涓ラ噸緙轟箯璧勬枡.
3. V8
Google V8姝f槸鐢變簬Chrome鑰岄闈¤搗鏉?鐩存帴JIT鏂瑰紡灝辨槸Chrome閫熷害椋炲揩鐨勫師鍥?
鏈榪慸own浜嗕竴涓笅鏉ヨ瘯浜嗕笅,鏋滅劧鍚嶄笉铏氫紶,API涔熼潪甯哥殑鏄撶敤.涓嶈繃鐢變簬涓嶆槸寰堢啛鎮塉avaScript鐨勫師鍥? 鑷繁鐢╯cons緙栬瘧鍑轟竴涓獀8鐨剆hell,璺戜簡涓涓甫綾葷戶鎵跨殑渚嬪瓙,灞呯劧涓嶈瘑鍒玞lass鍏抽敭瀛?榪欐墠鎰熷徆榪樹笉濡傜敤灝忓閥鐨刲ua鍛?鍦ㄦ垜鐪嬫潵,JavaScript涓嶭ua姣旇緝,涔熷氨鏄釜鑳絥ew,浣嗘槸娌lass鐨勮璦.涔熻鍒漢縐頒負鍗婂悐瀛愰潰鍚戝璞?閮芥槸浣跨敤prototype鏂瑰紡鏉ュ疄鐜扮被鍔熻兘.
4. JavaScriptCore
鍦℅oogle V8鐨勭被嫻嬭瘯紕板鍚?椹笂鐮旂┒浜嗕笅Unity涓嬬殑JavaScript鍒板簳鐢ㄤ簡浠涔堝簱,娌¢敊灝辨槸Apple Safari閲岀殑JavaScriptCore. 榪欎笢瑗胯祫鏂欐瘮Mono榪樺皯,閮芥槸楂橀緞搴撲簡.鎯沖繀鏁村悎涓嶆槸涓鑸殑楹葷儲.浣嗘槸榪樻槸涓嶇‘瀹氳繖涓剼鏈紩鎿庢槸鍚﹀師鐢熸敮鎸佺被
5. Python
Python? 娌℃兂榪囪繖縐嶆牸寮忚寮傜殑璇█,姝eUnity閲屾敮鎸丅oo(涓縐嶅緢綾諱技Python鐨勮璦)寰堝皯鏈変漢鐢ㄤ竴鏍? 涓婃鐢ㄨ繃Python鏄湪涓涓猙uild緋葷粺閲? 娓告垙閲屾槸涓嶄細鑰冭檻榪欑鑴氭湰緋葷粺鐨?鏁堢巼涔熸槸寰堝ぇ鐨勫師鍥?
6. AngleScript, GameMonkey
榪欎袱縐嶈璦閮芥槸寰堣佺殑娓告垙鑴氭湰璇█,涓嶈繃閮芥槸綾籧++鏂瑰紡鐨?涓嶈繃鐢變簬欏圭洰浣跨敤涓嶅,鎴栬鏄湁涓瀹氱殑bug,璧勬枡涔熺浉瀵硅緝灝?鎵浠ュ彲鑳芥渶鍚庤冭檻
鏇存柊浜嗘枃妗o紙榪欐槸蹇呴』鐨勶級
鏂扮殑鏃犵鍙鋒暣鏁癈 API
浣嶅鐞嗗嚱鏁伴噸鍛藉悕
鏇村ソ鍙婃洿蹇殑鏀寔鍙岀簿搴︽誕鐐規暟杞崲涓烘暣鍨?/strong>
鍘熸枃鍦ㄦ
鍙互鐪嬪埌錛屾垜鍦ㄥ勾鍒濆彂鏂囨寚鍑虹殑lua鏁板瓧澶勭悊鏂歸潰鐨刡ug宸茬粡寰楀埌寰堝ソ鐨勮В鍐籌紝涓嶈繃榪欑瑙e喅鏂規硶鍙槸娣誨姞浜哸pi鑰屽凡錛岀湅鏉ヨ繕鏄病鏈夋澗榧犺剼鏈鐞嗙殑褰誨簳錛屽師鏂?a href="http://m.shnenglu.com/sunicdavy/archive/2010/02/04/107161.html">鍦ㄦ
1. 鍘繪帀Effect緋葷粺錛屾敼鐢℉LSL + 娓叉煋鑴氭湰
2. 浼樺寲娓叉煋鎺ュ彛錛屼嬌鐢ㄦ潗璐ㄧ粺涓shader鍜屾覆鏌撶姸鎬?/p>
闅忓嵆鍙傝冧簡DirectX SDK鐨凣raphics閮ㄥ垎鏂囨。錛欴irectX9 鏃朵唬鐨凟ffect緋葷粺綰補鍙槸涓涓狧LSL鐨勭畝鍗曟覆鏌撹剼鏈疄鐜幫紝闄や簡DXUT錛孎XComposer絳夋瀬灝戠▼搴忎嬌鐢ㄨ繖濂椾笢瑗垮錛屽ぇ鍨嬬殑寮曟搸寰堝皯浣跨敤榪欑鍗婃垚鍝佺郴緇熴傚埌浜咲irectX10鐢氳嚦11錛屽洜涓烘灦鏋勬洿鏀癸紝鍘繪帀鍥哄畾綆$嚎錛屽洜姝ffect鎴愪負杈冧負楂樻晥鍜屼究鎹風殑娓叉煋鑴氭湰錛屽鏋滀笉鏄姹傝緝楂樼殑3d寮曟搸錛屼竴鑸殑娓告垙浣跨敤DirectX10鐨凟ffect娓叉煋鑴氭湰榪樻槸寰堜笉閿欑殑銆?/p>
DX10鐨刦x鑴氭湰涓嶥X9鐨勫樊寮傚湪浜?/p>
娓叉煋鐘舵侊紝閲囨牱鍣ㄧ姸鎬佺瓑閮藉彉涓哄璞★紝騫朵笌API楂樺害緇熶竴
鍦ㄨ剼鏈笌API涓潎鍙互璁劇疆
DepthStencilState EnableDepth
{
DepthEnable = TRUE;
DepthWriteMask = ALL;
DepthFunc = LESS_EQUAL;
};
BlendState NoBlending
{
AlphaToCoverageEnable = FALSE;
BlendEnable[0] = FALSE;
};
technique10 Render
{
pass P0
{
SetDepthStencilState( EnableDepth, 0 );
SetBlendState( NoBlending, float4( 0.0f, 0.0f, 0.0f, 0.0f ), 0xFFFFFFFF );
}
}
鏈漢瑙夊緱錛岃繖鏍風殑璁捐璁╁浘褰PI鏇翠負鏁忔嵎涓庡綊綾誨寲錛屽彟澶栵紝涔熶究浜嶴tateManager鎴栬呰嚜宸卞仛娓叉煋鐘舵佽漿縐誨強宸紓姣旇緝鏃舵洿涓洪珮鏁?
Vista鎿嶄綔緋葷粺鎺ㄥ嚭寰堜箙鍚庯紝DX10鐨勬樉鍗′篃鍗犳湁浜嗗ぇ閲忕殑甯傚満浠介銆備絾鏄敱浜嶥X10浠嶇劧鏄竴涓繃娓PI錛堢被浼間簬DX8)錛屽洜姝わ紝寰堝3D娓告垙瑕佷箞浠嶇劧鏀寔DX9錛岃涓嶇劧鍗蟲敮鎸丏X9涔熸敮鎸丏X10錛岀敋鑷矰X11.
鐪嬪崥瀹笂鏈夎揪浜虹粍鍥㈢紪鍐欑被浼糄X10鎺ュ彛鍜岀郴緇熺殑杞覆鏌擄紝DX10鐨勮璁℃槸浼樼鐨勩傚洜姝わ紝鍦―X9 HLSL鍩虹涓婏紝緇撳悎鑷繁緙栧啓鐨勬覆鏌撹剼鏈細鏄潪甯稿ソ鐨勯夋嫨銆?
娓叉煋鑴氭湰鎴戠殑璁捐鎬濊礬鏄繖鏍風殑錛?
1. 鍙槸涓縐嶉澶勭悊鑴氭湰錛屽茍闈炲疄鏃惰繍琛岃剼鏈?
緙栬瘧鍣ㄥ皢鏂囨湰瑙f瀽鍚庯紝杞寲涓轟竴浜涜繍琛屾寚浠わ紝姣斿錛氭湰pass浣跨敤涓鍧楀皬綰圭悊錛屼笅涓pass鐨則arget鏄繖涓汗鐞嗭紝騫朵笖寮鍚摢浜涙覆鏌撶姸鎬併?
2. 鑷畾涔夋牸寮忕殑瑙f瀽鑴氭湰銆?
浣跨敤lua錛宲ython絳夎剼鏈叾瀹炰篃鏄彲浠ョ殑銆備絾鏄湪鍑虹幇閿欒鏃訛紝鎶ュ嚭鐨勯敊鍙兘浼氳涓嶇啛鎮夎繖涓剼鏈璦鐨勪漢鑾悕鍏跺銆?
浣跨敤鏉鵑紶sq鑴氭湰璇█錛熷彲鎯滃叾鍦╨ua鍩虹涓婏紝瀵箃able鐨剆lot鍒濇璧嬪兼椂蹇呴』浣跨敤<-鑰屼笉鏄粺涓浣跨敤=錛屽洜姝や細璁╀綘鐨勮剼鏈█濂囧彜鎬?
XML鑴氭湰錛?XML鍙互閬垮厤澶嶆潅鐨勮娉曟鏌ワ紝鍐欏畬灝辨槸褰掓暣鐨勶紝浣嗕篃鏄綏鍡︾殑錛屾湰鏉exture[2]鍙互琛ㄨ揪瀹屾瘯鐨勶紝闈炶<Texture index = 2/>鏉ョ綏鍡︿笅銆?
OGRE鐨刢ompositor鑴氭湰鍜屾潗璐ㄨ剼鏈氨鏄嚜宸辮В鏋愮殑錛屼笉榪囧嚭涔庨鏂欑殑浣跨敤浜咮NF鑼冨紡榪欑被杈冧負姝h鐨勬柟娉曘傝繖灝辨槸璇達紝闇瑕佸厛瑙f瀽BNF琛ㄨ揪寮忥紝鐒跺悗鍐嶈緭鍏ヨ剼鏈В鏋愶紝緙栧啓榪囩▼鍜岀郴緇熷鏉傚害浼氬彉寰楀紓甯稿鏉傘?
鏈緇堥夋嫨榪樻槸浣跨敤鑷繁瑙f瀽鐨勮剼鏈紝浣跨敤涓浜涘叿浣撲唬鐮佺粨鏋勬潵鏇夸唬BNF榪欑被楂樻繁鐨勪笢瑗?
鍐沖畾浠ュ悗錛屼笅涓姝ラ渶瑕佸埗瀹氭覆鏌撹剼鏈叿浣撳悇閮ㄥ垎鍙婂埗浣滆繃紼?
1. 鍩烘湰lexer
浠庢枃鏈緱鍒板悇縐峵oken
1. 娓叉煋鐘舵佸璞?
鐓х潃DX10鎶勫氨濂?
2. Shader瀵煎叆鍙?
shader鏂囦歡鏉ヨ嚜浜庝綍澶勶紝鍏ュ彛鎬庢牱瀹氫箟
3. 娓叉煋鑴氭湰VM鍙婃寚浠?
鍐沖畾涓涓汗鐞嗘庢牱璁劇疆錛孯enderTarget鎬庢牱浣跨敤絳夌殑鎸囦護
Lemon緋葷粺鐗規э細
1. 鏀寔 Canvas,Sprite,ImageSet錛堝浘鐗囧撫瀛樺偍浜庝竴寮犲浘鐗囷紝絳夊ぇ灝忥級
2. ImageSetEx錛堣嚜鐢辨憜鏀劇殑鍥劇墖甯т簬涓寮犲浘鐗囷級*
3. 鏀寔瀵硅薄鏃犲叧閿撫鏃朵嬌鐢ㄩ潤鎬佸睘鎬ц繘琛岃緗紝綾諱技浜嶩GE閲岀殑綺劇伒
4. 姣忎釜瀵硅薄鍧囧彲鎴愪負Container錛屽茍鎷ユ湁Child Node
5. 鍔ㄧ敾鍏抽敭甯х被鍨嬫敮鎸侊細緙╂斁錛屾棆杞紝浣嶇Щ錛岄鑹詫紝鍔ㄧ敾甯э紝閿氱偣錛岄煶鏁?
6. 鏀寔鎷懼彇
7. 鍩轟簬XML瀛樺偍鐨勬枃浠舵牸寮?/p>
8. 鍩轟簬Squirrel鏉鵑紶鑴氭湰鐨勯珮閫熼潰鍚戝璞¤剼鏈?
9. 鍥懼艦緋葷粺Graphics鎶借薄錛岄傜敤浜庝換浣曟覆鏌撹澶?/p>
10. 鎺т歡緋葷粺*
11. 瑙嗛鍥炴斁*
鎵鏈夊璞″潎鐢盧TTI鍒涘緩錛屾灇涓懼潎鏈塏amePool+Hash錛屽茍鐢變簬PropertySet鐨勫弽灝勭郴緇?/p>
LemonComposer緙栬緫鍣ㄧ壒鎬?/p>
鐣岄潰鍩轟簬鎴戝幓騫村紑鍙戠殑MotionUI錛宭ua
8+1鎺у埗鐐圭偣瀵硅薄璋冭妭灞炴?/p>
綾籄dobe Flash鐨勫撫緙栬緫銆?/p>
綾?DS Max鐨勫垎杞ㄩ亾鍏抽敭甯х紪杈戯紝鏈夊姪浜庝紭鍖朼rt assert
鑷敱璋冭妭瀵硅薄灞傜駭鍙婄埗瀛愬叧緋?/p>
鍏ㄥ姛鑳芥棤闄愬埗鑷敱Redo,Undo
*灝嗗湪鏈潵鐗堟湰鏀寔
2D娓告垙鏄嫭绔嬫父鎴忕殑涓繪祦錛屼篃鏄垱鎰忥紝鎶曞叆姣旀渶灝忕殑涓涓淮搴︺備絾鏄熀浜?D鐨勫ぇ澶氭槸涓浜涚被浼間簬HGE錛孖ndieLib絳夊紑婧愬厤璐?D寮曟搸銆備絾鏄潰瀵規父鎴忎腑澶ч噺鐨勫姩鐢昏岃█錛屽紑鍙戣呭ぇ澶氭槸浣跨敤鍥劇墖甯ф潵鍒朵綔錛岃櫧鐒舵晥鏋滃緢濂斤紝浣嗘槸璁懼璧勬簮濂界敤鍜屽埗浣滈毦搴︿篃鏄緢闅炬帶鍒剁殑銆?/p>
嫻佽浜庡幓騫寸殑妞嶇墿瀵瑰兊灝稿拰2004騫村彂琛岀殑RO Offline緇忚繃璧勬簮鍒嗘瀽錛屽氨鏄嬌鐢ㄧ被浼間簬Lemon緋葷粺錛屾垨鑰呰Flash鐨勭郴緇熷埗浣滆屾垚錛屽洜姝ゆ晥鏋滃拰鎵╁睍鎬ч潪甯稿ソ銆?/p>
榪欏氨鏄疞emon瀛樺湪鐨勭悊鐢便?/p>
Flash闈㈠悜鐨勬槸GDI+Web錛岄偅涔圠emon灝辨槸閽堝娓告垙涓撴湁鐨勶紝鍩轟簬紜歡鍔犻熺殑娓告垙妗嗘灦
Flash Action Script 瀵瑰簲鐨勫氨鏄疞emon鐨?a >Squirrel鑴氭湰
FlashIDE 瀵瑰簲鐨勫氨鏄疞emon Composer
Lemon鐨勭洰鏍囧氨鏄2D娓告垙寮鍙戞洿綆鍗曪紝璁╂父鎴忎腑鍏呮弧鏇村鐨勫姩鐢? 璁╂父鎴忓紑鍙戦毦搴﹂檷浣?/p>
渚嬪瓙錛?/p>
for /r publish\ui\ %%i in (*.lua) do luac -o %%i %%i
lua涓紝鏁板間嬌鐢╠ouble鏉ュ瓨鍌紝鍖呭惈鏁村艦鍜宒ouble銆傝岃В鏋愬嚭鏉ョ殑鏁村艦涔熸槸琚己杞負double榪涜瀛樺偍錛岃繖鏍峰氨浼氬嚭闂銆?/p>
涓句竴涓畝鍗曠殑渚嬪瓙錛?/p>
double f = (double)0xffffffff;
int a = int(f);
榪欓噷鐨勬枃绔犺鏄庤繖涓被鍨嬭漿鎹㈤棶棰樼殑緙樼敱銆?/p>
鍦?a >Squirrel鑴氭湰涓氨涓嶄細鏈夎繖涓棶棰?/p>
local a = 0xffffffff
print( a )
緇撴灉涓?1
鏌ョ湅鍏舵簮浠g爜錛?/p>
typedef union tagSQObjectValue
{
struct SQTable *pTable;
struct SQArray *pArray;
struct SQClosure *pClosure;
struct SQGenerator *pGenerator;
struct SQNativeClosure *pNativeClosure;
struct SQString *pString;
struct SQUserData *pUserData;
SQInteger nInteger;
SQFloat fFloat;
SQUserPointer pUserPointer;
struct SQFunctionProto *pFunctionProto;
struct SQRefCounted *pRefCounted;
struct SQDelegable *pDelegable;
struct SQVM *pThread;
struct SQClass *pClass;
struct SQInstance *pInstance;
struct SQWeakRef *pWeakRef;
SQRawObjectVal raw;
}SQObjectValue;
鍙互鐪嬪埌
SQInteger nInteger;
SQFloat fFloat;
鏄垎寮瀛樺偍鐨勶紝鍥犳灝變笉浼氭湁榪欎釜闂
lua瑙e喅鏂規硶錛?/p>
1. 灝嗗崄鍏繘鍒舵崲涓?0榪涘埗瀛樺偍
2. 絳夊緟澶т緺鎴栬呭畼鏂逛慨鏀逛唬鐮侊紝鍋氬嚭patch
lua浠g爜錛?/p>
t = {}
t.FillColor = 0xFFFFFFFF
foo( t )
鍦–++涓敞鍐屼竴涓猣oo鍑芥暟錛岀劧鍚庤幏鍙杢able t涓殑FillColor鎴愬憳
鍙戠幇鍙栧緱鐨勫煎眳鐒朵負0x80000000
浣跨敤lua c api嫻嬭瘯浠g爜
lua_newtable( L );
lua_setglobal( L, "t");
lua_getglobal( L, "t");
lua_pushstring(L,"FillColor");
lua_pushinteger( L, 0xffffffff );
lua_pushinteger( L, -1 );
lua_settable( L, -3 );
lua_getglobal( L, "t");
lua_pushstring( L, "FillColor");
lua_gettable( L, -2 );
int t = lua_tointeger( L, -1 );
緇撴灉t涔熸槸0x80000000
鐒跺悗灝嗗崄鍏繘鍒剁殑0xFFFFFFFF鎹㈡垚鍗佽繘鍒剁殑4294967295錛屾祴璇曠粨鏋滄紜樉紺?1
鍐嶄嬌鐢ㄥ嚑涓牱鏈祴璇?
0xFF5F5F5F = 4284440415 浼氳鏀規垚0xFF5F5F00
榪欎釜bug鍊掓槸寰堝ソ瑙e喅錛屽皢浠g爜涓殑鍗佸叚榪涘埗鏁板叏鎹負10榪涘埗鍗沖彲銆備絾鏄負浠涔堝彧鍦≧elease鐗堟湰鍙戠敓鍛紵
鏈漢浣跨敤鐨勬槸lua 5.1.4 鍘熺敓
1. 綰疌 API鏂瑰紡瀵煎嚭錛岀被浼間簬Windows API鏂瑰紡
浼樼偣錛氱畝媧侊紝鍙互渚汣/C#涔冭嚦鍏朵粬鍙互瀵煎叆C DLL鐨勮璦浣跨敤
緙虹偣錛欳++鐨勭郴緇熻漿鍖栦負C浼氶亣鍒板緢澶氭ц兘浠ュ強鏋舵瀯鐨勬姌鎹燂紝瀵逛簬瀵硅薄鎺у埗綾誨姛鑳藉鍑烘瘮杈冨鐨勭郴緇燂紝榪欑鏂瑰紡綆鐩存槸鍣╂ⅵ
2. C++鏂瑰紡瀵煎嚭錛屽畯鏂瑰紡瀹炵幇RTTI浠ュ強C++鍙嶅皠緋葷粺
浼樼偣錛氬己澶э紝鏄撶敤銆?/p>
緙虹偣錛氬璞$敓鍛藉懆鏈熶笉瀹規槗鎺у埗錛屽弽灝勭郴緇熻璁℃瘮杈冭垂鏃訛紝鍙兘鏆撮湶寰堝綾葷殑緇嗚妭錛屽彧鑳界粰C++浣跨敤
3. COM鏂瑰紡錛岀被DirectX鐨勬帴鍙f柟寮?/p>
浼樼偣錛氬晢涓氶」鐩凡緇忚瘉鏄庤繖縐嶆帴鍙f柟寮忕殑寮哄ぇ鍦版柟銆傛棤璁烘槸澶氫釜瀵硅薄鐨勭被鍔熻兘瀵煎嚭錛岃繕鏄疌OM鎺ュ彛閲嶈澆閮介潪甯告柟渚褲傝屼笖錛屽彲浠ユ瀬涓哄鏄撶殑璁?NET璁塊棶銆俋BOX SDK閲岀殑XUI灝辨槸閲囩敤榪欑鏂瑰紡錛岃屼笖榪樿璁′簡涓濂桟 API鎼厤鐨勫己澶++鍙嶅皠緋葷粺錛屾敮鎸佸姩鎬佺被鍒涘緩錛孯TTI錛屽姩鎬佺被鍨嬭漿鎹㈢瓑絳夈?/p>
緙虹偣錛氶渶瑕佺郴緇熸敞鍐岋紝涓嶈兘璺ㄥ鉤鍙般侰OM鏍囧噯瀛︿範璧鋒潵闇瑕佹椂闂?/p>
4. 鑴氭湰緇戝畾
浼樼偣錛氫繚鎸佷綘鐨勭郴緇熷澶朇/C++鎺ュ彛鐨勫共鍑錛岀畝媧併傞氳繃鑴氭湰綾葷粦瀹氾紝鍙互寰堝揩鐨勫皢C++鍔熻兘娉ㄥ唽鍒拌剼鏈腑銆?/p>
緙虹偣錛氳剼鏈鏋滄病鏈夎皟璇曞櫒錛屽皢浼氳寮鍙戜腑紕板埌鐨勬鎵嬮棶棰橈紝鐢氳嚦浜庡湪鍚庢湡緇存姢緋葷粺浠ュ強緋葷粺鏋舵瀯澶у彉鍔ㄥ彉寰楀紓甯稿鏉傘傝剼鏈殑鎬ц兘鍐沖畾浜嗕笉鑳借鍏跺仛瀹炴椂澶勭悊錛屼緥濡傦細娓叉煋
鏈緇堥夋嫨涓嬫潵錛岀敱浜庢湁鑷繁鐨勭晫闈㈢郴緇烳otion浣跨敤lua鐨勫嚱鏁扮粦瀹氱殑鍓嶄緥錛屽洜姝よ繕鏄喅瀹氶夋嫨涓嬈捐剼鏈璦鏉ュ仛緋葷粺鐨勫澶栨帴鍙o紝榪欓噷鏈夊嚑涓夋嫨錛?/p>
1. Lua
鍙互璇存渶濂界殑娓告垙緋葷粺鑴氭湰璇█銆傜ǔ瀹氾紝楂樻晥錛宐ug鍑犱箮娌℃湁錛堝嵆渚挎湁錛屾櫘閫氬紑鍙戣呬篃鏄緢闅懼療瑙夌殑錛夈傞厤涓奓uaPlus鐨勫己澶++緇戝畾緋葷粺錛屼綘鐨勭郴緇熷紑鍙戞晥鐜囧彲浠ユ彁楂樺緢澶氥傝繖閲屾帹鑽恘otepad++鏉ュ仛lua寮鍙戯紝紼嶅井閰嶇疆涓嬶紝寮瑰嚭鎻愮ず緇欎綘鎰熻鍦ㄤ嬌鐢╒isual Studio錛岋細錛?/p>
鍚屾椂闇瑕佹寚鍑虹殑鏄紝lua鐨勭被鍔熻兘紜疄姣旇緝寮便傝櫧鐒跺彲浠ョ敤metatable鏂瑰紡鏉ユā鎷熴備絾閫艱繎璺焠ative class鏀寔榪樺樊寰堣繙錛屽疄闄呭紑鍙戜腑錛屼綘鑳戒綋浼氬嚭class涓殑鏉冮檺鎺у埗錛坧rivate錛宲rotected錛夋湁澶氫箞閲嶈銆?/p>
2. Python
璇氱劧錛岃繖鏄釜鏈OO鐨勮剼鏈備絾鏄浜庢父鎴忥紝瀹冨お鎱簡銆傝櫧鐒舵湰浜哄彧鏄敤python鍐欒繃涓浜沚uild緋葷粺錛屼絾浠庡緢澶氭湅鍙嬪弽搴旂殑鎯呭喌鏉ョ湅錛孭ython宓屽叆娓告垙緋葷粺錛岀‘瀹炲お鎱€傜敤Stackless Python錛?鐢ㄧ涓夋柟寮婧愪駭鍝侊紝榪樻槸璁ゅ噯鍝佺墝錛屽懙鍛碉紝榪欓噷濡傛灉鏈夌敤榪囩殑鍚屽錛屾榪庢彁渚涙劅鍙椼?/p>
3. C#
璇█鍜岀郴緇熼兘寰堢編錛屼絾鏄兂宓屽叆娓告垙錛岃繕鏄緢鐥涚殑銆?net騫沖彴鍙儨灝卞湪浜庯紝鍒扮幇鍦ㄤ負姝紝鍙兘榪樹笉鏄墍鏈夋満鍣ㄩ粯璁ゅ畨瑁呮湁.net騫沖彴銆傚鏋滀綘鐨勬父鎴忔槸C++鍐欐垚錛屼絾鍗磋瀹夎.net浠ヤ究浣犵殑鑴氭湰鑳借繍琛岋紝榪欏緢濂囨惂錛熸墍浠ワ紝濡傛灉瑕佺敤C#錛岃繕涓嶅涓嶇敤鑴氭湰錛屽叏鐩?net灝卞ソ浜嗐侻anaged DX錛?閭d笢瑗垮嚑騫村墠灝辮MS鎵撳叆鍐峰浜嗐俋NA錛?閭d笢瑗垮彧鏄竴涓帺鍏鳳紝鍒懜銆?/p>
4.Squirrel鏉鵑紶鑴氭湰
榪欐槸涓ソ涓滆タ銆傜被lua鐨勮娉曪紝C/C++/Java鐨勮璦緇撴瀯錛岀函姝g殑native class澶栧姞OO鏀寔銆傛嫢鏈夊紑婧愮殑C++綾葷粦瀹氱郴緇熴傛渶鐖界殑鏄紝SQDEV鏀寔鏃ラ錛圗clipse錛変笅鐨勮繙紼嬭皟璇曪紝寮鍙戠幆澧冭繕鏀寔鍔ㄦ佽娉曟鏌ャ俹h,my god銆傝繕璇翠笉瀹氬摢澶╄繖鑴氭湰琚玀S鎷涘畨錛岃窡IronPython涓鏍峰紕涓?net緇戝畾銆?/p>

榪欐槸涓涓畝鍗曠殑鏁欏錛屽憡璇変綘Kismet鏄庝箞榪愯鐨?/p>
http://udn.epicgames.com/Three/KismetUserGuide.html
榪欐槸Kismet鐨勮祫鏂?/p>
http://udn.epicgames.com/Three/KismetReference.html
璁╂垜浠潵鐔熸倝涓?/p>
榪欐槸涓涓狤vent鑺傜偣錛屼竴鑸敤浜庡垱寤鴻緭鍏ユ祦錛屼簨浠跺彲浠ヤ粠Actor鎴栬呭叾浠栧湴鏂硅繘鍏?/p>
榪欐槸涓涓狝ction鑺傜偣錛屽姩鎬佺殑鎼帴杈撳叆鏉′歡錛屽彲浠ュ揩閫熺殑杈撳嚭浣犻渶瑕佺殑緇撴灉
榪欐槸涓涓狢ondition鑺傜偣錛岀敤浜庢牴鎹緭鍏ワ紝杈撳嚭緇撴灉
榪欐槸涓涓櫘閫氱殑鍙橀噺錛屽瓨鍌ㄤ換浣曞彲浠ュ瓨鍌ㄧ殑瀵硅薄
絎竴涓緥瀛愶細

榪欎釜渚嬪瓙瑕佸疄鐜扮殑鏄紝鐜╁鐐瑰嚮鍚庯紝鎵撳紑涓鐩忕伅
鐜╁閫氳繃Event鑺傜偣錛屼駭鐢熶竴涓緭鍏ユ祦錛岃繖涓祦琚繛鎺ュ埌Togger錛圓ction錛夌殑Turn On鑺傜偣錛屾敞鎰忥紝榛戣壊鐨勮繛鎺ョ嚎琛ㄧず鈥滄搷浣滄祦鈥濓紝鑰孴ogger鐨勬墽琛岀洰鏍囪鎺ュ埌浜嗙伅涓婏紝榪欐牱涓涓畝鍗曠殑閫昏緫灝辨墽琛屽嚭鏉ヤ簡
鍔ㄦ佺粦瀹氫簨浠?/p>

鏈夋椂浣犻渶瑕佺粦瀹氱殑瀵硅薄鏄笉鍦ㄧ紪杈戝櫒閲岀殑錛岃繖涓緥瀛愬氨鏄湪娓告垙涓姩鎬佸垱寤轟竴涓狝ctor錛岃瑙e喅榪欎釜闂錛屽氨蹇呴』灝嗙墿浣撹繛鎺ュ埌涓涓彉閲忋?/p>
褰揂ctor Factory鎵ц鍚庯紝鍏剁敓鎴愪竴涓柊鐨凙ctor錛屽茍灝嗗叾鏀劇疆鍦ㄤ竴涓璞℃暟緇勪腑錛堝浘涓殑闂彿錛夛紝鐒跺悗錛屼粬浼氳皟鐢ˋttachToEvent action錛屽皢姝諱骸浜嬩歡榪炴帴鍒拌繖涓彉閲忋?閭d箞褰撹繖涓狝ctor姝諱骸鏃訛紝浜嬩歡灝變細琚Е鍙戙?/p>
鍏堣榪欎簺錛屽懙鍛碉紝鍚冮キ鍚冮キ