遊戲 編 程
![](https://upload.wikimedia.org/wikipedia/commons/thumb/8/88/Battle_for_Mandicor_0.0.5.png/300px-Battle_for_Mandicor_0.0.5.png)
一個遊戲程式嘅根基係
while隻 gem1行 緊 睇吓 input係 乜 噏哋遊戲 世界 產 生 output loop
雖然
基本 結構
[一個遊戲程式結構大致如下:一隻遊戲嘅程式啟動嗰陣,
設 move_speed數 值做...設 number_of_ghost數 值做... ...用 若干 行 碼設定 遊戲 柞 參 數 嘅數值 while player.lives > 0當 玩家有 多 過 0條 命 嗰陣一路 做...(「玩家命 變 咗 0」就係 GAME OVER條件 ) //讀取 input JoystickData j =由 手 掣嗰度 探測 玩家撳咗乜掣 // Update遊戲 世界 ;睇遊戲 邏輯同 人工 智能 基 於玩家 撳嘅掣,更新 玩家角 色 嘅位置 for每 一 隻 鬼 (foreach鬼 ) if 玩家撞到嗰隻鬼 玩家就死 else基 於隻鬼 嘅人工 智能 ,更新 佢嘅位置 end loop // 喺現實 應用 上 ,以上 嘅各個 動作 通常 會 每 個 做一 個 子 程 式 。 ... //產 生 output;睇遊戲 外觀 喺熒光 幕 上面 畫 相應 嘅影像 ...同 埋 整 聲 效 loop
如果
讀取 輸入
[![](https://upload.wikimedia.org/wikipedia/commons/thumb/d/d5/Nintendo-Switch-Pro-Controller-FL.jpg/270px-Nintendo-Switch-Pro-Controller-FL.jpg)
一個遊戲程式首要任務係要曉讀取玩家俾嘅
喺軟件
const int UpButton = 12; /* 用 一 個 變數 代表 個 [上 ] 掣有冇俾人 撳 */
const int DownButton = 11; /* 另一 個 變數 代表 個 [下 ] 掣有冇俾人 撳 */
void setup(){
...
}
void loop(){ /* 程 式 迴圈 */
if(digitalRead(UpButton) == HIGH){ /* 如果個 [上 ] 掣有訊號... */
Serial.println("Up:");
delay(100);
}
if(digitalRead(DownButton) == HIGH){ /* 如果個 [下 ] 掣有訊號... */
Serial.println("Down:");
delay(100);
}
}
指令 詮 釋
[喺
遊戲 收 到 嘅輸入 同 世界 噏哋
void InputHandler::handleInput()
{
if (isPressed(BUTTON_X)) jump(); // 如果撳咗 X 掣,角 色 要 跳 。
else if (isPressed(BUTTON_Y)) fireGun(); // 如果撳咗 Y 掣,角 色 會 開 槍 。
else if (isPressed(BUTTON_A)) swapWeapon(); // ...
else if (isPressed(BUTTON_B)) lurchIneffectively();
}
而如
void InputHandler::handleInput()
{
if (isPressed(BUTTON_X)) buttonX_->execute(); // 如果撳咗 X 掣,做 X 掣相應 嘅功能 ;
else if (isPressed(BUTTON_Y)) buttonY_->execute(); // 如果撳咗 Y 掣,做 Y 掣相應 嘅功能 ;
else if (isPressed(BUTTON_A)) buttonA_->execute();
else if (isPressed(BUTTON_B)) buttonB_->execute();
}
而呢
class Command // 定義 一 個 class,代表 指令
{
public:
virtual ~Command() {}
virtual void execute() = 0;
};
class JumpCommand : public Command // 定義 「跳 」嘅指令
{
public:
virtual void execute() { jump(); }
};
class FireCommand : public Command // 定義 「開 槍 」嘅指令
{
public:
virtual void execute() { fireGun(); }
};
... 如此類推 ...
class InputHandler // 定義 一 個 class
{
public:
void handleInput();
private:
Command* buttonX_; // 每 個 掣都係 一 個 pointer,point 去 某 個 指令 。
Command* buttonY_;
Command* buttonA_;
Command* buttonB_;
};
遊戲 邏輯
[process input
update game world
數 據 結構 [歐 6]:一隻遊戲會包含大量嘅物件同相應變數,例 如一 隻 一 般嘅射擊 遊戲 會 有 若干 把 唔同嘅槍俾玩家 揀,每 把 係 一 件 物件 ,而佢哋分別 喺「彈 匣 大 細 」同 「每 槍 造成 幾多 傷害 」等 嘅變數 上 都 有 異 ;編 寫 一個遊戲程式需要思考數據結構要點處理-個 程 式 內部要用 乜方法 儲 起 各 變數 同 物件 嘅數據 [15]。基 於事件 架 構[歐 7]係 一 種 軟件畫 則 上 嘅範式 。喺遊戲 編 程 上 ,基 於事件 架 構將一隻遊戲軟件視為一柞事件 [歐 8]嘅集合體 。一件事件係指一次系統狀態嘅改變—例 如「架 車 開始 加速 ,加速度 提 升 若干 數 值」,而喺好 多 遊戲 嘅程式 當 中 都 有 事件 管理 系統 [歐 9]:事件 管理 系統 界 定 每 種 事件 係 乜同涉 及乜數 據 ;而喺做更新 遊戲 狀態 嗰時,遊戲 世界 入 面 每 件 物件 同 每 個 子 系統 (睇 foreach)會 睇吓發生 緊嘅事件 當 中 邊 啲係同 佢相關 嘅,再 按遊戲 法則 決定 要點 俾反應 [16]。
遊戲 物理
[double t = 0.0;
float dt = 1.0f;
float cuk_dou = 0.0f;
float wai_zi = 0.0f;
float lik = 10.0f;
float zat = 1.0f;
// 設 一 大 柞 變數 ,包括 咗時間 點 (t)、時間 間隔 (dt)、速度 (cuk_dou)、位置 (wai_zi)、件 物體 受嘅力 (lik)、同 件 物體 嘅質量 (zat)。
while ( t <= 10.0 ) // 重複 噉計若干 次 ,計 到 時間 點 係 10 為 止 。
{
wai_zi = wai_zi + cuk_dou * dt;
cuk_dou = cuk_dou + ( lik / zat ) * dt; // 用 牛 頓 第 二定律計吓件物體受嘅力同佢嘅質量會點影響佢嘅速度。
t += dt;
}
呢段嘢會俾嘅
t=0: wai_zi = 0 cuk_dou = 0
t=1: wai_zi = 0 cuk_dou = 10
t=2: wai_zi = 10 cuk_dou = 20
t=3: wai_zi = 30 cuk_dou = 30
t=4: wai_zi = 60 cuk_dou = 40
t=5: wai_zi = 100 cuk_dou = 50
t=6: wai_zi = 150 cuk_dou = 60
t=7: wai_zi = 210 cuk_dou = 70
t=8: wai_zi = 280 cuk_dou = 80
t=9: wai_zi = 360 cuk_dou = 90
t=10: wai_zi = 450 cuk_dou = 100
人工 智能
[刺激 詮 釋 器 [歐 11]:刺激 詮 釋 器 會話 俾一個人工智能程式知個遊戲狀態係點;一般 嚟講,每 個個 體 敵 人 都會 有 個 獨立 嘅人工 智能 (除 非 隻 遊戲 係 講 玩家角 色 打 緊一 班 具有 集合 心靈 嘅外星 人 ),每 個 智能 會 透過 刺激 詮 釋 器 得 到 佢哋應 該得到 嘅資訊,跟住個 程 式 要 有 方法 表示 「foreach敵 人 ,嗰個敵 人手 上 有 乜資訊」[19]。決 策 系統 [歐 12]:每 一個人工智能都要按手上嘅資訊同自己嘅目的,計 出 跟住要 採取 乜嘢行動 ;例 如一個敵人見到玩家,知道 玩家嘅位置 ,而佢目的 係 要 行 埋 玩家度 攻擊 佢,佢個人工 智能 程 式 就要有 個 方法 教 佢點樣 用 「玩家嘅位置 」同 「自己 嘅位置 」(個 決 策 系統 嘅輸入 )計 出 「自己 應 該向乜方向 移動 」(個 決 策 系統 嘅輸出 )[19]。
舉例seek
class KinematicSeek:
// Declare 個 演算 法 控 制 緊邊個 角 色 同 要 追 嘅目標
gok_sik, target
// Declare 個 角 色 嘅最大 速度
maxCuk
def getSteering():
// 整 個 output 嘅結構
steering = new KinematicSteeringOutput()
// 攞個 steering 嘅方向
steering.velocity = target.position - gok_sik.position // 如果將 呢個數 變成 隨 機 ,可 以用嚟教個 AI 隨 機 行 嚟行去 (wandering)。
if steering.velocity.length() < radius: // 如果同 目標 之 間 嘅距離 細 過 某 個 特定 數 值,就唔使 郁 。
return none
// 計 出 個 exact 嘅速度
steering.velocity.normalize()
steering.velocity *= maxCuk
// 轉向 要 郁 嘅方向
gok_sik.orientation = getNewOrientation(gok_sik.orientation,steering.velocity)
// 將 個 steering 俾做 output
steering.rotation = 0
return steering
target.position - gok_sik.position
gok_sik.position - target.position
就可以令
遊戲 外觀
[影像
[二 維圖像 會 用 精靈 圖 [歐 13]結合 埋 一齊 整 景 。舉個例 子 說明 ,喺一 隻 二 維嘅《超 級 瑪利奧 》遊戲 入 面 ,個 遊戲 程 式 會 記 住 主 角 嘅精靈 圖 同 埋 啲怪獸 嘅精靈 圖 ,而個主 角 瑪利奧 嘅精靈 圖 又 會 包含 咗(例 如)佢企喺度嗰陣嘅樣、佢行路 嗰陣嘅樣、同 埋 佢跳嗰陣嘅樣等 等 。喺每一 個 時間 點 ,個 程 式 都會 按「個 主 角 同 每 隻 怪獸 喺邊個 位置 ,喺度做緊乜」等 嘅資訊,揀應該用邊 幾 幅 精靈 圖 ,並 且按照 每 件 物件 嘅位置 ,將 呢啲精靈 圖 同 個 背景 合 拼埋一齊 ,最後 形成 一 個 畫面 ,最後 個 程 式 要 將 呢個畫面 傳 去 個 熒光幕 嗰度,等 個 熒光幕 將 個 畫面 顯示 出 嚟[23][24][25]。三 維圖像 會 用 到 三 維模型 [歐 14]。一 個 三 維模型 係 一 個 (對 於部電腦 嚟講)用 數字 呈 現 嘅三 維物體 ,而整一幅三維嘅電腦圖像過程要用彩 現 [歐 15]嘅方法 :想 做彩現 嘅人會 首 先 整 一 個 景 檔案[歐 16]出 嚟,呢個檔案會 包含 多種 資 訊,包括 「個 景 入 面 用 咗啲乜嘢立體 模型 」、「每 個 立體 模型 喺邊個 位置 」、「光源 喺邊」、「個 鏡 頭 擺喺邊 個 位置 」、同 埋 「幾何 變換 」(睇下面 )呀噉,描述個 景 係 點 嘅;然 後部 電腦 會 將 呢個檔案入 面 嘅數據 傳 去 一個彩現程式嗰度,等 個 程 式 做一大柞人手做唔嚟嘅運算,計 出 個 鏡 頭 會 睇到嘅(二 維)影像 應 該係點 樣 嘅,並 且將個 鏡 頭 所 睇到嘅影像 俾出嚟做輸出 [26][27]。無論 二維定三維圖像,一個電子遊戲程式會係噉做「基 於遊戲 狀態 更新 影像 」嘅工作 ,而且一秒內做閒閒地做幾廿次-由人 眼 嚟睇就好似 係 識郁嘅影像 噉[23][26]。
設定 背景 係 咩樣。 //將 背景 設 做應有 嘅色水 。 for each物件 // for each物件 ,用 精靈 圖 (2D 嘅話)或 者 三 維模型 (3D 嘅話)畫 佢出嚟。 攞件物件 嘅位置 攞作物件 嘅精靈 圖 或 者 三 維模型 畫 佢出嚟
聲音
[音樂 :個 遊戲 程 式 一 日 喺某個 狀態 (「喺標題畫 面 」、「喺第一關 」、「喺第二關 」...等 等 )就要一路 循環 播嘅聲 ,會 用 到 while 迴圈(while隻 遊戲 喺呢個 呢個狀態 ,播呢首 呢首音樂 )。音樂 對 於營造 一隻遊戲嘅氣氛嚟講不可或缺[30]。聲 效 [歐 17]:指 喺某啲事件 發生 嗰時一 次 性 嘅聲,例 如係一 隻 賽 車 遊戲 入 面 ,每 當 有 兩 架 車 相 撞,個 遊戲 程 式 要 叫 個 喇叭 播出相應 嗰個聲 檔案嘅內容 [29]。講 嘢:係 三種聲入面最難搞嗰種;因 為 喺多數 情況 下 ,個 遊戲 程 式 唔淨只 要 叫 喇叭 播出個 聲 檔案,仲 要 確保 啲聲同 講 緊嘢嗰個角 色 嘅三 維模型 嘅嘴 唇 嘅郁動 同 步 (而且喺製作 上 ,整 講 嘢聲要 特 登 請配音 員 返 嚟做)。有 啲遊戲 程 式 會 索 性 有 個數 據 庫 ,儲 住 「人類 嘴 唇 喺發每 種 聲 嗰時係 乜樣」嘅資訊,再 喺要播講嘢聲嗰陣,即 場 由 啲聲計 出 個 角 色 嘅三維模型嘅嘴唇要係乜樣[29]。
喺每
編 程 概念
[編 程 架 生
[組合 語 言 (多數 係 廿 世紀 嘅遊戲 先 會 用 嘅)[31]- C [32]、C++ [32]、C#
- Java [33]
- Lua [34]
- DirectX [15]
- Direct3D [15]
- OpenGL [15]
文獻
[- Lengyel, E. (2001). Mathematics for 3D game programming and computer graphics. Charles River Media, Inc..
- McShaffry, M. (2014). Game coding complete. Nelson Education.
睇埋
[引咗
[呢篇
- ↑ Sanchez-Crespo, D., & Dalmau, D. S. C. (2004). Core techniques and algorithms in game programming. New Riders.
- ↑ 2.0 2.1 2.2 Game Programming Algorithms and Techniques: Overview, p. 2. informIT.
- ↑ "Programming Linux Games, Chapter 1" (PDF). ISBN 1-886411-48-4.
- ↑ Valente, L., Conci, A., & Feijó, B. (2005). Real time game loop models for single-player computer games. In Proceedings of the IV Brazilian Symposium on Computer Games and Digital Entertainment (Vol. 89, p. 99).
- ↑ 7 Reasons Game Development Is the Perfect Side Hobby for Software Developers 互聯
網 檔案館 嘅歸 檔,歸 檔日期 2018年 10月 13號 ,.. Atomic Object. - ↑ Moore, Michael E.; Novak, Jeannie (2010). Game Industry Career Guide. Delmar: Cengage Learning.
- ↑ 7.0 7.1 McShaffry, M. (2014). Game coding complete. Nelson Education. p. 34 - 35.
- ↑ Valente, L., Conci, A., & Feijó, B. (2005). Real time game loop models for single-player computer games. In Proceedings of the IV Brazilian Symposium on Computer Games and Digital Entertainment (Vol. 89, p. 99).
- ↑ 9.0 9.1 Shelly, Gary; Vermaat, Misty (2008). Discovering Computers: Fundamentals. Boston, MA: Course Technology Cengage Learning. p. 172.
- ↑ Whitehead, A., Crampton, N., Fox, K., & Johnston, H. (2007, November). Sensor networks as video game input devices. In Proceedings of the 2007 conference on Future Play (pp. 38-45). ACM.
- ↑ Video Game Controller With Arduino 互聯
網 檔案館 嘅歸 檔,歸 檔日期 2019年 1月 13號 ,.. - ↑ 12.0 12.1 McShaffry, M. (2014). Game coding complete. Nelson Education. p. 40.
- ↑ Designing Game Controls 互聯
網 檔案館 嘅歸 檔,歸 檔日期 2019年 1月 12號 ,.. Gamasutra. - ↑ 14.0 14.1 14.2 Command. Game Programming.
- ↑ 15.0 15.1 15.2 15.3 15.4 15.5 McShaffry, M. (2014). Game coding complete. Nelson Education. Ch. 2.
- ↑ K. Mani Chandy. Event-Driven Applications: Costs, Benefits and Design Approaches, California Institute of Technology, 2006.
- ↑ 17.0 17.1 Integration Basics: How to integrate the equations of motion 互聯
網 檔案館 嘅歸 檔,歸 檔日期 2018年 10月 26號 ,.. Gaffer on Games. - ↑ Yannakakis, Geogios N (2012). "Game AI revisited" (PDF). Proceedings of the 9th Conference on Computing Frontiers: 285–292.
- ↑ 19.0 19.1 McShaffry, M. (2014). Game coding complete. Nelson Education. p. 45 - 46.
- ↑ 20.0 20.1 Millington, I. (2019). AI for Games. CRC Press. p. 52 - 53.
- ↑ Millington, I. (2019). AI for Games. CRC Press. p. 62 - 64.
- ↑ McShaffry, M. (2014). Game coding complete. Nelson Education. p. 41.
- ↑ 23.0 23.1 Hague, James. "Why Do Dedicated Game Consoles Exist? 互聯
網 檔案館 嘅歸 檔,歸 檔日期 2018年 4月 23號 ,.". dadgum.com. - ↑ Schaul, T. (2013, August). A video game description language for model-based or interactive learning. In 2013 IEEE Conference on Computational Inteligence in Games (CIG) (pp. 1-8). IEEE.
- ↑ Khalifa, A., Green, M. C., Perez-Liebana, D., & Togelius, J. (2017, August). General video game rule generation. In 2017 IEEE Conference on Computational Intelligence and Games (CIG) (pp. 170-177). IEEE.
- ↑ 26.0 26.1 Bouknight, W. J. (1970). "A procedure for generation of three-dimensional half-tone computer graphics presentations". Communications of the ACM. 13 (9): 527–536.
- ↑ Phong, B-T (1975). "Illumination for computer generated pictures". Communications of the ACM. 18 (6): 311–316.
- ↑ Ultimate Guide to the Processing Language Part II: Building a Simple Game. Developers.
- ↑ 29.0 29.1 29.2 29.3 McShaffry, M. (2014). Game coding complete. Nelson Education. p. 43 - 44.
- ↑ Collins, Karen (2008). Game sound: an introduction to the history, theory, and practice of video game music and sound design. MIT Press. pp. 112–118.
- ↑ Hyde, Randy (1985). Using 6502 Assembly Language.
- ↑ 32.0 32.1 Corlan, Alexandru-Dan (2011). "Game Programming in C and C++ 互聯
網 檔案館 嘅歸 檔,歸 檔日期 2019年 5月 13號 ,.". - ↑ Corlan, Alexandru-Dan. "LWJGL - Projects".
- ↑ Corlan, Alexandru-Dan (2015-03-24). "Lua: Uses 互聯
網 檔案館 嘅歸 檔,歸 檔日期 2019年 7月 24號 ,.".
拎
[- (
英文 )經典 遊戲 Pong用 Python 嘅 Pygame整 ,一 個 170行 碼咁短 嘅簡單 Python程 式 ,寫 緊《乓》呢隻經典 遊戲 。個 程 式 有 齊 晒 初 始 化 定義 好 啲變數 、遊戲 開始 嗰陣擺低個 波 、畫 個 遊戲 畫面 、以及係 探測 玩家嘅 input。 - (
英文 ) PyGame教學 ,教 人 用 pygame寫 遊戲 程 式 。 - (
英文 ) GameDev.net - (
英文 )國際 遊戲 開發 者 協會 (IGDA) - (
英文 ) One ex-game programmer's experience in the game development industry - (
英文 ) Game industry veteran Tom Sloper's advice on game programming - (
英文 ) 2D Game Development wiki - (
英文 ) Game Development Wiki -GDwiki