上一篇主題 :: 下一篇主題 |
發表人 |
內容 |
fire231 散播福音的祭司
註冊時間: 2007-09-15 文章: 152
322.55 果凍幣
|
發表於: 2007-10-16, PM 3:46 星期二 文章主題: 有關遊戲階段的問題 |
|
|
問了yag後還是不太懂到底要怎麼使用
假設這個遊戲有不同的階段
開始選單 遊戲進行 結束選單
這3個階段的訊息回圈要使用不同的
那要怎麼設定?
yag說要用類別~但我還是不太知道要放在哪邊 |
|
回頂端 |
|
|
babu61509 散播福音的祭司
註冊時間: 2007-08-26 文章: 142
681.01 果凍幣
|
發表於: 2007-10-16, PM 6:56 星期二 文章主題: |
|
|
轉成C++的語法好麻煩...
我用C# 寫 XNA 的方法跟你說一下...
在XNA專案裡面,只要程式不被結束掉,程式初始化完以後會自動呼叫 Update 函數 和 Draw 函數.
假設遊戲有5個狀態 : (假設每個狀態要執行的程式碼都寫好了)
就用 enum 去建立一個存遊戲狀態的格式,裡面有
代碼: |
enum GameStatus
{
Init, // 初始化
MainMenu, // 主選單
GamePlay, // 開始遊戲
GameMenu, // 遊戲選單
GameOver // 遊戲結束
}
|
宣告一個 GameStatus 類型的 mGameStatus 變數拿來放遊戲狀態
然後在Update裡面 加一個switch去判斷現在狀態,並根據狀態執行class...
代碼: |
switch (mGameStatus)
{
case GameStatus.Init: // 初始化
mGameInit.Update(GameTime); // 執行mGameInit 的 Update 方法
break;
case GameStatus.MainMenu: // 主選單
mMainMenu.Update(GameTime); // 執行mMainMenu 的 Update 方法
break;
case GameStatus.GamePlay: // 遊戲開始
mGamePlay.Update(gameTime); // 執行mGamePlay 的 Update 方法
break;
case GameStatus.GameMenu:
mGameMenu.Update(gameTime); // 執行mGameMenu 的 Update 方法
break;
case GameStatus.GameOver:
mGameOver.Update(gameTime); // 執行mGameOver 的 Update 方法
break;
}
|
完整一點的程式碼就是 (不能跑 但是變數該宣告的都宣告) :
當然 GameInit、MainMenu、GamePlay、GameMenu、 GameOver 的類別要寫好...
代碼: |
enum GameStatus
{
Init, // 初始化
MainMenu, // 主選單
GamePlay, // 開始遊戲
GameMenu, // 遊戲選單
GameOver // 遊戲結束
}
public GameStatus mGameStatus; // 宣告 GameStatus 型 mGameStatus
private GameInit mGameInit; // 宣告 GameInit 型 mGameInit
private MainMenu mMainMenu; // 宣告 MainMenu 型 mMainMenu
private GamePlay mGamePlay; // 宣告 GamePlay 型 mGamePlay
private GameMenu mGameMenu; // 宣告 GameMenu 型 mGameMenu
private GameOver mGameOver; // 宣告 GameOver 型 mGameOver
protected override void Initialize() // 初始化 (程式開始執行會跑,但只會跑一次)
{
mGameStatus = GameStatus.Init; // 設定 mGameStatus 為初始化
mGameInit = new GameInit(this, graphics, content); // 建立mGameInit並初始化
mMainMenu = new MainMenu(this, graphics, content); // 建立mMainMenu並初始化
mGamePlay = new GamePlay(this, graphics, content); // 建立mGamePlay並初始化
mGameMenu = new GameMenu(this, graphics, content); // 建立mGameMenu並初始化
mGameOver= new GameOver(this, graphics, content); // 建立mGameOver並初始化
base.Initialize();
}
protected override void Update(GameTime gameTime)
{
switch (mGameStatus)
{
case GameStatus.Init: // 初始化
mGameInit.Update(GameTime); // 執行mGameInit 的 Update 方法
break;
case GameStatus.MainMenu: // 主選單
mMainMenu.Update(GameTime); // 執行mMainMenu 的 Update 方法
break;
case GameStatus.GamePlay: // 遊戲開始
mGamePlay.Update(gameTime); // 執行mGamePlay 的 Update 方法
break;
case GameStatus.GameMenu:
mGameMenu.Update(gameTime); // 執行mGameMenu 的 Update 方法
break;
case GameStatus.GameOver:
mGameOver.Update(gameTime); // 執行mGameOver 的 Update 方法
break;
}
}
|
_________________ 已經畢業了!! |
|
回頂端 |
|
|
fire231 散播福音的祭司
註冊時間: 2007-09-15 文章: 152
322.55 果凍幣
|
發表於: 2007-10-16, PM 9:47 星期二 文章主題: |
|
|
可以用C++講解嗎= =
我看不懂XNA... |
|
回頂端 |
|
|
vamper 對這略感興趣的新人
註冊時間: 2007-06-23 文章: 29 來自: 台灣 18.82 果凍幣
|
發表於: 2007-10-16, PM 9:56 星期二 文章主題: 不能吃主題呀! |
|
|
用State Pattern就能解決了!
就是二樓PO的文章。
我找找以前的資料,這個滿不錯的。
這是台科大的某位老師建立的SDK,自己看看吧~
其中有個「Game framework introduction 」的連結點,
裡面有介紹到State Pattern。
http://www.cc.ntut.edu.tw/~wkchen/game/index.htm
/////////// 底下是歲歲念 ///////////
沒想到這麼快就想學遊戲的流程架構,
嘛....自己能站穩腳步就行了。 |
|
回頂端 |
|
|
lsk 喜歡上這裡的冒險者
註冊時間: 2007-06-20 文章: 93
20.59 果凍幣
|
發表於: 2007-10-17, AM 1:26 星期三 文章主題: |
|
|
fire231 寫到: | 可以用C++講解嗎= =
我看不懂XNA... |
其實上面大大波的跟c++的code沒有什麼差別喔!! state pattern在遊戲的主程式上很重要,簡單來說,就是讓你在大迴圈裡可以跑不同的小迴圈,一旦這個... 一號小迴圈(可能是你的第一層選單)跑完了,就可以切換state,換跑二號小迴圈(可能是你的第二層選單)。
Fire你很幸福,一有問題就那麼多人回答你,即始你會覺得很硬,也是比一般的人自己去翻書、查網頁要快得多多了 : ) 加油~ |
|
回頂端 |
|
|
fire231 散播福音的祭司
註冊時間: 2007-09-15 文章: 152
322.55 果凍幣
|
發表於: 2007-10-17, PM 5:57 星期三 文章主題: |
|
|
也要感謝大家阿
幫助我解決問題
再研究1下
目前有個人也在跟我討論
我們兩個目前都在摸索視窗的寫法以及用法= =
因為2樓大大用的方法我沒看過(函數)
又不是WIN32API的方法~所以看不太懂= =
不過目前似乎有種靈感= =.. |
|
回頂端 |
|
|
vamper 對這略感興趣的新人
註冊時間: 2007-06-23 文章: 29 來自: 台灣 18.82 果凍幣
|
發表於: 2007-10-17, PM 6:32 星期三 文章主題: |
|
|
fire231 寫到: | 也要感謝大家阿
因為2樓大大用的方法我沒看過(函數)
又不是WIN32API的方法~所以看不太懂= =
不過目前似乎有種靈感= =.. |
嘛...這也不能怪你,因為只有接觸過的人(物件導向模組)才知道的,
一看就知道那是什麼。
其實...到了一定的功力之後,只要知道演算法,一點就通了。
雖然我不會C# or XNA,我也大約看出來,因為語法和架構都差不多。
至於要搭配到視窗的Game Loop的話,一定要對視窗整個流程有一定的概念,
才能去增加一些程序,所以我才擔心你的腳會站不穩。
不過多一個人討論比一個人討論出來還快,還滿不錯的。
///////////////// 題外話 /////////////////////
今天遇到一件滿高興的事情,話比較多點。 |
|
回頂端 |
|
|
babu61509 散播福音的祭司
註冊時間: 2007-08-26 文章: 142
681.01 果凍幣
|
發表於: 2007-10-17, PM 6:53 星期三 文章主題: |
|
|
如果你是問 protected 和 override 沒看過的話...
建議你去找有談到 繼承類別 的書來看看 - _-
那個是 物件導向 的東東...
------------------------------------------------
阿,還有上面那個程式碼是用C#寫的...
XNA 是函式庫, DirectX 簡化後的函式庫...
------------------------------------------------
http://nknucc.nknu.edu.tw/~jwu/c/cpg.htm
奇摩找到的 C/C++ 教學網頁 XD _________________ 已經畢業了!! |
|
回頂端 |
|
|
fire231 散播福音的祭司
註冊時間: 2007-09-15 文章: 152
322.55 果凍幣
|
發表於: 2007-10-17, PM 7:34 星期三 文章主題: |
|
|
QQ
稍微成功了(目前只有1個階段~使用類別成功)
我是設定1個類別(假設A)
裡面有第1個階段要用的變數以及LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);函數
(開始的選單)
然後用
LRESULT CALLBACK A::LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
..敘述
}
來寫入這階段的訊息回圈
之後再使用A gamestage;來創個A類別的階段
然後訊息回圈目前只有指定
LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
gamestage.WndProc(hwnd,msg,wParam,lParam)
}
這樣可以執行~
不知這樣使用對不對 |
|
回頂端 |
|
|
fire231 散播福音的祭司
註冊時間: 2007-09-15 文章: 152
322.55 果凍幣
|
發表於: 2007-10-17, PM 7:58 星期三 文章主題: |
|
|
話說
我成功了= =
但是..
在編輯的時候用測試~跟直接按生產出來的EXE檔
兩種產生的效果不同耶= =
我有個選單 然後到下階段會清空產生1個暫時用來判斷的圖片
但是我直接按執行檔會自動播放到第2階段= = |
|
回頂端 |
|
|
zwshen 對這略感興趣的新人
註冊時間: 2008-03-11 文章: 22 來自: Taiwan 0.00 果凍幣
|
|
回頂端 |
|
|
fire231 散播福音的祭司
註冊時間: 2007-09-15 文章: 152
322.55 果凍幣
|
發表於: 2010-11-1, AM 12:44 星期一 文章主題: |
|
|
看到以前發的文章
有點感慨阿!!!!
現在我也是北科大的學生
可是卻不是資工系 |
|
回頂端 |
|
|
yag Site Admin
註冊時間: 2007-05-02 文章: 689
2704.11 果凍幣
|
發表於: 2010-11-1, AM 9:30 星期一 文章主題: |
|
|
fire231 寫到: | 看到以前發的文章
有點感慨阿!!!!
現在我也是北科大的學生
可是卻不是資工系 |
沒關係,你是X工系,只差一個字 |
|
回頂端 |
|
|
fire231 散播福音的祭司
註冊時間: 2007-09-15 文章: 152
322.55 果凍幣
|
發表於: 2010-11-1, PM 4:47 星期一 文章主題: |
|
|
yag 寫到: | fire231 寫到: | 看到以前發的文章
有點感慨阿!!!!
現在我也是北科大的學生
可是卻不是資工系 |
沒關係,你是X工系,只差一個字 |
天才跟蠢才也是一字之差阿~哀... |
|
回頂端 |
|
|
|