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

李錦俊(mybios)的blog

游戲開發 C++ Cocos2d-x OpenGL DirectX 數學 計算機圖形學 SQL Server

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

公告

QQ:30743734
EMain:mybios@qq.com

常用鏈接

留言簿(16)

我參與的團隊

最新隨筆

搜索

  •  

積分與排名

  • 積分 - 373332
  • 排名 - 67

最新評論

閱讀排行榜

評論排行榜

注意:本文純屬是本人從研究魔獸爭霸III地圖編輯器的過程中的一種猜想,所以,不當之處,還請高手指出。謝謝!

  魔獸爭霸III我以前玩得比較多,也聽說他的地圖編輯器非常牛X,以前也曾經想編輯個地圖出來。但是,限于當時得水平問題,沒有成功。直到最近在研究如何制作游戲的時候,打開魔獸爭霸III的地圖編輯器來看,突然有一種擴然開朗的感覺!哦!原來地圖編輯器是這樣出來的!閑話不多說!馬上進入正題!

  魔獸爭霸III的地圖編輯器使用了一個文件來代表一個地圖,地圖里包含了什么東西?我無從得知,但是,從他的編輯器上看,看到編輯器能對地圖修改的東西,就可以大概猜想到有哪些東西。仔細看地圖編輯器,看到有那么幾個模塊:地形編輯器、開關編輯器、聲音編輯器、物體編輯器、戰役編輯器、AI編輯器、物體管理器、輸入管理器。我把我的理解逐一說來。

  1.地形編輯器
    主要用來編輯地形,例如某個地方擺放什么地形,什么地方擺放什么物體、英雄、燈光等等東西。那么,這些東西在地圖文件中我想是以數據的形式來存放的,而不是腳本!因為,我測試過,放了一個英雄到地圖中,然后導出腳本,但是腳本里沒有任何關于這個英雄的資料!那就證明了是用某種格式保存在地圖文件中。整個地形都是這么存放。

  2.開關編輯器
    開關編輯器,也就是觸發事件編輯器。這個東西在地圖編輯器中比較的高級,人們都說魔獸爭霸III的地圖編輯器是萬能編輯器,很大的原因就是因為有了這個東西!這個東西是如何實現的呢?說起來很簡單!就是腳本實現!我分析了一下,一個觸發器,分成三個部分:發生事件、觸發條件、執行動作。那么三個東西在腳本中和程序中是如何實現?
    讓我在編輯器中新建一個觸發器解釋一下。新建一個觸發器,叫做TestTrigger,在這個觸發器下新建一個事件“玩家 - 玩家1 (紅色) leaves the game”,新建一個條件“TRUE 等于TRUE”,新建一個動作“Do nothing”。然后導出腳本,看看腳本如何:
//===========================================================================
// 
// 只是另外一張魔獸爭霸III的地圖
// 
//   Warcraft III map script
//   Generated by the Warcraft III World Editor
//   Date: Sat Nov 18 23:35:12 2006
//   Map Author: 李錦俊
// 
//===========================================================================

//***************************************************************************
//*
//*  Global Variables
//*  全局變量
//***************************************************************************

globals
    
// Generated
    
//  我們的觸發器保存成一個全局變量了!!
    trigger                 gg_trg_TestTrigger         = null
endglobals

function InitGlobals takes nothing returns nothing
endfunction

//***************************************************************************
//*
//*  Triggers
//*  觸發器!
//***************************************************************************

//===========================================================================
// Trigger: TestTrigger 我們的觸發器的觸發條件
//===========================================================================
function Trig_TestTrigger_Conditions takes nothing returns boolean
    
// 如果true == true ?? 不正是我們設置的“TRUE等于TRUE”嗎
    if ( not ( true == true ) ) then
        
return false
    endif
    
return true
endfunction

// 我們的觸發器的執行動作!!
function Trig_TestTrigger_Actions takes nothing returns nothing
    
// DoNothing ?? 不正是我們設置的“Do nothing”嗎?
    call DoNothing(  )
endfunction

//===========================================================================
// 初始化我們的觸發器
function InitTrig_TestTrigger takes nothing returns nothing
    
// 創建一個觸發器,保存在一個全局變量里
    set gg_trg_TestTrigger = CreateTrigger(  )
    
    
// 看這個英文的函數名。。我翻譯一下應該是“觸發器:注冊玩家單位簡單事件”
    
// 再看看參數
    
// 第一個參數是我們的觸發器的全局變量
    
// 第二個參數是Player(0)啊,不就是我們設置的“玩家1”嗎?(語言上從0開始,顯示上從1開始,習慣了)。
    
// 第三個參數EVENT_PLAYER_UNIT_DEATH,翻譯一下應該是“玩家單位死亡事件”,哈哈!很明顯又是我們設置的
    call TriggerRegisterPlayerUnitEventSimple( gg_trg_TestTrigger, Player(0), EVENT_PLAYER_UNIT_DEATH )

    
// 翻譯:“觸發器:添加觸發條件”,然后參數就是上面那個觸發條件的函數,函數里就是我們設置的條件
    call TriggerAddCondition( gg_trg_TestTrigger, Condition( function Trig_TestTrigger_Conditions ) )

    
// 翻譯:“觸發器:添加執行動作”,然后參數就是上面那個執行動作的函數,函數里就是我們設置的動作!
    call TriggerAddAction( gg_trg_TestTrigger, function Trig_TestTrigger_Actions )
endfunction

//===========================================================================
// 地圖初始化的時候都會調用這個函數初始化所有自定義的觸發器,當然也有我們的觸發器了。InitTrig_TestTrigger不就是剛才那個函數了嗎
function InitCustomTriggers takes nothing returns nothing
    call InitTrig_TestTrigger(  )
endfunction

//***************************************************************************
//*
//*  Main Initialization
//*  main啊!這么熟悉!一定是此腳本文件的入口函數了!在C++主程序中調用的!(我暫且認為WarCraftIII是用C++寫的了)
//***************************************************************************

//===========================================================================
function main takes nothing returns nothing
    call SetCameraBounds( 
-3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), -3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), -3328.0 + GetCameraMargin(CAMERA_MARGIN_LEFT), 3072.0 - GetCameraMargin(CAMERA_MARGIN_TOP), 3328.0 - GetCameraMargin(CAMERA_MARGIN_RIGHT), -3584.0 + GetCameraMargin(CAMERA_MARGIN_BOTTOM) )
    call SetDayNightModels( 
"Environment\\DNC\\DNCLordaeron\\DNCLordaeronTerrain\\DNCLordaeronTerrain.mdl""Environment\\DNC\\DNCLordaeron\\DNCLordaeronUnit\\DNCLordaeronUnit.mdl" )
    call NewSoundEnvironment( 
"Default" )
    call SetAmbientDaySound( 
"LordaeronSummerDay" )
    call SetAmbientNightSound( 
"LordaeronSummerNight" )
    call SetMapMusic( 
"Music"true0 )
    call InitBlizzard(  )
    call InitGlobals(  )
    
// 上面執行的這幾個函數主要是設置一些環境變量,什么攝像頭、日晝幾何模型、背景音樂等等
    
// 這個函數就是初始化我們的觸發器啊!
    call InitCustomTriggers(  )
endfunction

//***************************************************************************
//*
//*  Map Configuration
//*  地圖配置,估計也是在C++主程序中調用的!
//***************************************************************************

function config takes nothing returns nothing
    call SetMapName( 
"只是另外一張魔獸爭霸III的地圖" )
    call SetMapDescription( 
"沒有描述" )
    call SetPlayers( 
1 )
    call SetTeams( 
1 )
    call SetGamePlacement( MAP_PLACEMENT_USE_MAP_SETTINGS )

    call DefineStartLocation( 
0-1409.3219.2 )

    
// Player setup
    call InitCustomPlayerSlots(  )
    call SetPlayerSlotAvailable( Player(
0), MAP_CONTROL_USER )
    call InitGenericPlayerSlots(  )
endfunction

  我加的注釋里已經寫得很清楚了,很明顯我們在地圖編輯器里面設置的所有觸發器的東西,都會以一種腳本的形式生成,然后程序在根據地圖數據初始化地圖之后調用這個腳本的main函數和config函數。在游戲進行過程中,TriggerRegister開頭的函數注冊了一些事件開端,簡單的實現就是維護一個列表而已。然后游戲進行到這個事件的時候(例如剛才的例子里是TriggerRegisterPlayerUnitEventSimple,則玩家單位發生一些簡單事件的時候就會執行),就遍歷這個列表的每一個元素調用他們用TriggerAddCondition注冊的條件,如果為true,則執行TriggerAddAction函數的內容!觸發器的實現原理基本上就是這樣了!當然,真正實現起來還是有很多東西要做的,例如要有很多很多的函數要綁定到腳本引擎中!

  3.聲音編輯器
    這個我沒研究過啊,待續....

  4.物體編輯器
    里面就是所有單位、建筑物、物品(簡稱Items吧,中文翻譯過來就變味了,呵呵!)的一些屬性設置,這些屬性都是以數據的形式保存在地圖中的,程序運行的時候就以這些數據來基礎運行起來,例如某某英雄聲明值是多少云云....

  5.戰役編輯器
    沒搞過,不多作評論

  6.AI編輯器
    我只知道AI不是腳本引擎實現的!他只是一些數據,至于為何不用腳本來實現?我想應該還是執行效率問題吧!(猜想而已...)

  7.物體管理器
    用來管理場景上出現的物體,也是數據保存。

  8.輸入管理器
    實現一個簡單的單文件系統,就是說在一個地圖文件里包含多個附件進去,例如:模型、貼圖等等。那么就可以實現一個自定義的東西了(例如自定義一個以我的形象做出來的英雄!哈哈!)。然后程序可以直接調用這個模型。

  另外,說說C++程序中應該如何導入綁定函數到腳本中,綁定的方法很多文章都有說,我的BLOG上LUA那部分也有幾篇這樣的文章。我現在要說的是應該綁定什么函數進去腳本引擎中。我覺得,腳本引擎主要是實現一些速度要求不高,但是邏輯性又極強的代碼。那么,相反,對速度要求高,邏輯性比較固定的,就不應該寫到腳本引擎中。
  舉幾個應該在腳本中實現的例子:注冊觸發器、觸發器的執行條件、觸發器執行的事件、地圖初始化之后應該設置的信息(例如攝像機的位置,Load一些東西),這些東西都是邏輯性比較強,也就是說變化是比較大的,如果用數據來驅動,估計很難驅動得了(就好像,N個條件組合,還有邏輯判斷的東西,如何能用數據來表示?例如:3D中的可編程流水線(Shader腳本驅動)就有很多固定流水線(渲染狀態數據驅動)無法實現的)。
  舉幾個不應該在腳本中實現的例子:尋路算法、讀取文件等等需要比較多系統資源的操作。AI,是一個特例,他執行速度要求比較高,但是他的邏輯性又比較強。暴雪公司的選擇是速度,那么他們就需要作一個比較龐大的數據來驅動這些AI(這里編程估計比較復雜了)。我還沒學過AI的算法呢,只知道復雜。不多作評論了,還請高手們給指點指點。
  舉了幾個比較有代表意義的例子。簡單的說,就是應該把一些固定功能的函數盡量用C++來實現,然后綁定到腳本引擎中,然后由腳本引擎來實現相應的邏輯。

  好了,大的東西基本上都說完了。好像也沒說什么,主要就是分析了腳本的實現了。可能說得不明白啊,大家回帖討論一下。

  PS:第一次寫這種文章,寫得不好請見諒!

如果本文對你的開發有所幫助,并且你手頭恰好有零錢。

不如打賞我一杯咖啡,鼓勵我繼續分享優秀的文章。




posted on 2006-11-19 00:20 李錦俊(mybios) 閱讀(9041) 評論(9)  編輯 收藏 引用 所屬分類: C++LUA

Feedback

# re: 【原創】魔獸爭霸III 地圖編輯器原理(關鍵是腳本) 2006-11-28 16:16 沒仔細看
摟主繼續努力  回復  更多評論
  

# re: 【原創】魔獸爭霸III 地圖編輯器原理(關鍵是腳本) 2006-11-28 22:28 李錦俊
謝謝支持  回復  更多評論
  

# 我最近也在研究魔獸地圖編輯器的腳本實現 2007-07-23 11:10 goodboy
受益匪淺,希望樓主多發布一些相關的文章。  回復  更多評論
  

# re: 【原創】魔獸爭霸III 地圖編輯器原理(關鍵是腳本)[未登錄] 2007-08-08 09:21 初學者
殺死敵人單位(非中立敵對)后怎樣能獲得金錢?(請各位幫忙)  回復  更多評論
  

# re: 【原創】魔獸爭霸III 地圖編輯器原理(關鍵是腳本) 2007-08-20 08:24 jj
不錯不錯!!o稀飯^_^  回復  更多評論
  

# re: 【原創】魔獸爭霸III 地圖編輯器原理(關鍵是腳本)[未登錄] 2008-02-10 17:10 QQ
怎樣用魔獸地圖編輯器把一個不是英雄的單位變成英雄 說說吧  回復  更多評論
  

# re: 【原創】魔獸爭霸III 地圖編輯器原理(關鍵是腳本) 2008-02-14 11:27 #
這個把單位變英雄我會,只要調模形,聲音,圖標和武器聲音。單位就能變英雄了。  回復  更多評論
  

# re: 【原創】魔獸爭霸III 地圖編輯器原理(關鍵是腳本) 2008-02-14 11:29 接上
補充下:改的單位要是英雄才行!  回復  更多評論
  

# re: 【原創】魔獸爭霸III 地圖編輯器原理(關鍵是腳本) 2009-03-03 10:21 peerincle
加油啊~~
期待著你的最新研究成果~  回復  更多評論
  

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            亚洲国产精品va在线观看黑人 | 久久资源在线| 日韩一级片网址| 亚洲国产精品成人一区二区| 在线观看视频欧美| 亚洲黄色影院| 99国产精品久久久久久久久久| 亚洲精品在线一区二区| 亚洲人成在线播放| 日韩午夜免费视频| 亚洲一级在线| 欧美在线啊v| 久久综合中文| 亚洲第一在线视频| 亚洲网站在线看| 欧美一级二区| 久久九九精品99国产精品| 欧美在线日韩| 亚洲二区免费| 亚洲欧美中日韩| 久久国产免费| 欧美日韩国产高清| 国产亚洲综合性久久久影院| 亚洲激情综合| 久久国产精品黑丝| 亚洲电影在线| 午夜精品国产更新| 欧美精品久久天天躁| 国产日韩一区欧美| 一本色道久久99精品综合 | 久久亚洲私人国产精品va| 麻豆av一区二区三区| 亚洲人成小说网站色在线| 亚洲欧美日韩成人高清在线一区| 久久在线视频在线| 欧美午夜激情小视频| 亚洲国产精品福利| 欧美中文在线视频| 亚洲精选一区二区| 久久久久久亚洲精品中文字幕| 欧美色精品天天在线观看视频| 国产亚洲日本欧美韩国| 日韩午夜在线视频| 欧美成人视屏| 久久精品国产精品亚洲| 国产精品久久久久aaaa| 最新亚洲一区| 免费观看30秒视频久久| 亚洲免费网址| 国产精品久久久久久久app| 亚洲精品乱码久久久久| 欧美v国产在线一区二区三区| 亚洲一区二区日本| 欧美日韩精品免费看| 在线观看视频一区| 老司机一区二区| 亚洲免费在线观看视频| 欧美色网在线| 亚洲私人影吧| 亚洲狠狠婷婷| 欧美黄色视屏| 日韩视频免费在线观看| 亚洲电影免费观看高清完整版| 久久久亚洲一区| 一区二区亚洲欧洲国产日韩| 久久视频国产精品免费视频在线| 在线中文字幕不卡| 欧美午夜精品理论片a级按摩| 亚洲日韩中文字幕在线播放| 男女精品视频| 欧美aⅴ一区二区三区视频| 亚洲经典一区| 欧美精品免费播放| 国产日韩欧美在线观看| 亚洲综合首页| 亚洲网站在线看| 国产欧美精品一区aⅴ影院| 午夜精品三级视频福利| 亚洲特黄一级片| 国产伦精品一区二区三区免费 | 欧美在线首页| 久久精品中文| 亚洲国产一区二区视频| 欧美激情偷拍| 欧美亚洲第一页| 久久国产精品久久久久久久久久| 欧美在线三区| 亚洲国产日韩欧美| 99re8这里有精品热视频免费| 国产精品入口66mio| 久久综合九色九九| 欧美日韩国产免费| 性欧美video另类hd性玩具| 欧美专区日韩视频| 日韩午夜电影| 欧美一区二视频在线免费观看| 黄色另类av| 日韩一级黄色大片| 激情综合久久| 99精品视频免费全部在线| 国产婷婷成人久久av免费高清| 欧美激情亚洲国产| 国产精品一区二区久久精品| 欧美成人免费网| 国产精品狼人久久影院观看方式| 久久久www成人免费精品| 欧美国产日韩一区二区在线观看| 午夜电影亚洲| 欧美精品亚洲一区二区在线播放| 小黄鸭精品aⅴ导航网站入口| 美女黄网久久| 久久不射网站| 欧美日韩国内| 美女久久一区| 国产精品一区二区欧美| 欧美激情免费观看| 国产专区欧美精品| 亚洲综合首页| 亚洲欧美日本国产专区一区| 牛牛影视久久网| 久久久久久久波多野高潮日日 | 亚洲国产精品第一区二区三区| 亚洲一区二区三区午夜| 亚洲日韩欧美一区二区在线| 欧美一区二区视频在线观看| 亚洲午夜久久久久久久久电影网| 麻豆成人小视频| 久久这里只有| 国产中文一区| 久久aⅴ乱码一区二区三区| 亚洲欧美日韩天堂一区二区| 久久久久综合网| 欧美大香线蕉线伊人久久国产精品| 久久精品99国产精品| 一区二区精品| 一区二区三区三区在线| 亚洲精品欧美日韩专区| 久久久一区二区| 久久亚洲精品视频| 国产午夜精品在线观看| 午夜精品成人在线视频| 亚洲午夜一级| 国产精品啊啊啊| 亚洲视频精选| 亚洲自拍电影| 国产精品一区二区久久久久| 亚洲性xxxx| 欧美一区二区三区视频在线 | 久久国产日韩| 久久美女艺术照精彩视频福利播放| 国产精品任我爽爆在线播放| 日韩手机在线导航| 亚洲女同性videos| 国产精品乱码一区二区三区| 日韩一区二区电影网| 亚洲综合欧美日韩| 国产午夜亚洲精品理论片色戒| 欧美影院成年免费版| 老司机成人在线视频| 亚洲高清影视| 欧美成人午夜视频| 一本色道久久综合狠狠躁篇的优点| 亚洲一二三区精品| 国内精品久久国产| 麻豆精品在线视频| 一区二区电影免费观看| 性做久久久久久久免费看| 国产美女在线精品免费观看| 欧美在线三级| 亚洲国产小视频在线观看| 99视频有精品| 国产伦精品一区二区三区免费| 久久国产精品久久久| 亚洲电影免费观看高清完整版在线观看 | 久热综合在线亚洲精品| 伊人一区二区三区久久精品| 免费成人av资源网| 亚洲午夜激情网页| 久色成人在线| 亚洲一区二区三区中文字幕在线 | 国产精品久久久久9999吃药| 久久精品亚洲一区二区三区浴池| 亚洲精品美女久久7777777| 欧美一区二区高清| 亚洲日本中文字幕| 国产三区精品| 欧美午夜精品伦理| 欧美成人首页| 欧美中文在线观看| 宅男噜噜噜66国产日韩在线观看| 亚洲视频在线观看三级| 欧美成人精品| 亚洲天堂久久| 亚洲电影欧美电影有声小说| 国产精品每日更新在线播放网址| 久久久久久久波多野高潮日日| 一本到12不卡视频在线dvd| 噜噜噜噜噜久久久久久91| 欧美日本国产一区| 久久久福利视频|