久久久久无码精品,四川省少妇一级毛片,老老熟妇xxxxhd,人妻无码少妇一区二区

游戲中實(shí)現(xiàn)腳本控制的干貨分享

時(shí)間:2024-07-24 20:03:45 游戲動(dòng)漫 我要投稿
  • 相關(guān)推薦

游戲中實(shí)現(xiàn)腳本控制的干貨分享

  一個(gè)游戲引擎做好了,最重要的是缺什么?腳本。打個(gè)比方,游戲引擎是一部電腦,則腳本就是電腦的軟件。既然腳本這么重要,那該怎樣實(shí)現(xiàn)呢?下面yjbys小編就來(lái)說(shuō)說(shuō)自己的做法。想了解更多相關(guān)資訊請(qǐng)持續(xù)關(guān)注我們應(yīng)屆畢業(yè)生培訓(xùn)網(wǎng)。

  首先理解一下消息循環(huán)

  一個(gè)好的游戲離不開好的消息循環(huán)。它是游戲?qū)崿F(xiàn)很重要的一部分。

  首先,我定義了一個(gè)全局變量extern int GameState;

  在游戲中定義了許多當(dāng)前的游戲狀態(tài)例如

  #define GAME_STATE_CUSTOM 0 //這代表在戰(zhàn)斗中玩家可以控制游戲

  #define GAME_STATE_TALKING 1

  等等。

  好了,下面在WinMain里面的while(1)循環(huán)中有個(gè)UpdateScreen()函數(shù)

  原型為

  void UpdateScreen()

  {

  延時(shí)

  switch(GameState)

  {

  case GAME_STATE_CUSTOM:

  畫出地圖

  畫出所有精靈

  畫出天氣(如果有的話)

  如果玩家選中了敵人的話(打個(gè)比方DrawFlag=DrawEnemyState)就顯示敵人的移動(dòng)范圍和敵人狀態(tài)

  break;

  case GAME_STATE_TALKING:

  GameDialogProc();

  break;

  case GAME_STATE_SCRIPTCONTROLLING:

  ScriptControlProc();

  break;

  ….//其他的消息在這里處理

  }

  將緩沖表面的圖象顯示到屏幕;

  }

  每個(gè)游戲狀態(tài)都需要一個(gè)獨(dú)立的函數(shù)來(lái)寫。這樣在每次切換游戲狀態(tài)時(shí)都不會(huì)出現(xiàn)無(wú)法處理的情況。在處理鍵盤消息的時(shí)候我也用一個(gè)個(gè)獨(dú)立的函數(shù)來(lái)寫,如處理回車鍵我用了 KeyReturnProc()來(lái)控制。在這個(gè)函數(shù)里同樣也少不了switch(GameState)這一句,為什么?答案很簡(jiǎn)單,比如說(shuō)在精靈行走時(shí)回車鍵就沒(méi)有用,這是我沒(méi)有處理精靈行走這個(gè)狀態(tài)的鍵盤消息。而在戰(zhàn)斗場(chǎng)景里按下回車鍵,如果有精靈在選擇框里的話,就會(huì)處理相應(yīng)的東西。

  例如選擇了敵人則使DrawFlag=DrawEnemyState;這樣在更新屏幕時(shí)就會(huì)畫出敵人的移動(dòng)范圍和狀態(tài)。

  明白了嗎?好了,如果你明白了消息循環(huán)的原理,下面的東西就很容易理解了。

  下面談?wù)勀_本控制

  要實(shí)現(xiàn)這個(gè),就必須在UpdataScreen()這個(gè)函數(shù)中攔截一個(gè)“腳本控制”的消息,并調(diào)用相應(yīng)的處理函數(shù):ScriptControlProc(); 那么怎樣得到“腳本控制”這個(gè)消息呢?我是這樣約定的:

  新游戲->調(diào)用腳本

  “戰(zhàn)斗結(jié)束”->調(diào)用腳本

  “前往下一個(gè)地點(diǎn)”->調(diào)用腳本

  好了,就只有這幾種情況下才調(diào)用,調(diào)用腳本的函數(shù)為BeginScriptControl();

  這個(gè)函數(shù)做了三個(gè)工作:

  1.首先讀取舞臺(tái)(場(chǎng)景)角色的數(shù)據(jù)(沒(méi)一關(guān)都是一個(gè)不同的舞臺(tái))

  2.打開腳本文件(注意要用全局的文件指針)(雖然我在源程序中沒(méi)直接打開,但是原理是一樣的)

  3.將游戲狀態(tài)設(shè)定為“腳本控制”以便在下一次UpdateScreen()中調(diào)用的是ScriptControlProc();(怎么樣?知道消息循環(huán)的作用了吧?)

  ScriptControlProc()這個(gè)函數(shù)其實(shí)也很簡(jiǎn)單:

  讀取腳本文件中的參數(shù)直到文件結(jié)束,讀取腳本文件需要一個(gè)解釋腳本的函數(shù)LoadParam(FILE*fp);這個(gè)函數(shù)負(fù)責(zé)解釋腳本中的東西:是函數(shù)調(diào)用還是函數(shù)參數(shù),然后找到相應(yīng)的函數(shù)執(zhí)行即可。

  比如說(shuō)腳本里有一段代碼MovePlayerTo(1,1,1);意思就是把第1個(gè)玩家移動(dòng)到1,1處。怎樣做呢?

  我是按照以下幾步做的

  1.保存當(dāng)前的游戲狀態(tài)

  2.把當(dāng)前游戲狀態(tài)設(shè)定為“移動(dòng)精靈”

  當(dāng)引擎得到“移動(dòng)精靈”這個(gè)函數(shù)后,在UpdataScreen()中調(diào)用的是MoveRoleProc()這個(gè)函數(shù)。

  當(dāng)移動(dòng)結(jié)束后,MoveRoleProc()調(diào)用EndMoveRole(),這個(gè)函數(shù)的作用就是讀取先前的游戲狀態(tài)

  怎么樣?又回到讀腳本了吧?記住在移動(dòng)角色的時(shí)候腳本文件的指針沒(méi)有改變,所以回到讀腳本的這個(gè)函數(shù)后不是重新讀取而是繼續(xù)讀取!同理其他的腳本指令如LoadDialog也是一樣的道理!

  當(dāng)文件要結(jié)束的時(shí)候,別忘了告訴引擎該停止了,這時(shí)候我們必須更新游戲狀態(tài)。腳本里的SetGameState就是負(fù)責(zé)這項(xiàng)工作的。

【游戲中實(shí)現(xiàn)腳本控制的干貨分享】相關(guān)文章:

總監(jiān)實(shí)現(xiàn)對(duì)施工進(jìn)度控制方法03-06

AutoCAD腳本制作03-20

雅思備考干貨03-04

PHP如何通過(guò)會(huì)話控制實(shí)現(xiàn)身份驗(yàn)證03-29

影視廣告的腳本創(chuàng)作03-20

ASP腳本循環(huán)語(yǔ)句詳細(xì)教學(xué)01-23

電影電視分鏡頭腳本格式03-16

淘寶問(wèn)答實(shí)戰(zhàn)運(yùn)營(yíng)干貨!03-20

盤點(diǎn)游戲中的活動(dòng)需求03-07