遊戲編程

出自維基百科,自由嘅百科全書
(由電子遊戲編程跳轉過來)
Jump to navigation Jump to search
一隻製作早期嘅遊戲;喺整遊戲嗰陣,製作組通常會用低質圖像頂住檔先,試行吓個遊戲嘅程式-遊戲程式喺呢度應該經已處於行得到嘅狀態。

遊戲編程粵拼jau4 hei3 pin1 cing4英文game programming)係電子遊戲製作嘅一部份,指為電子遊戲軟件工程嘅工作:通常一隻遊戲嘅製作組喺做完設計-度好嗮隻遊戲嘅規則應該係點-之後,就要開始做程式編寫,編制隻遊戲嘅程式,途中用到電腦模擬電腦圖像、同人工智能等嘅技術,而大型多人網上遊戲(MMOG)等嘅編程仲會考製作組對網絡編程數據庫等技術嘅認識[1]。雖然遊戲編程噉專業,但都有啲人為興趣而做遊戲編程,而且仲有成功案例[2][3]

一個電子遊戲程式嘅根基係遊戲迴圈(game loop):隻遊戲嘅程式係一個迴圈(loop),要係噉重複做同一樣嘅工作(而唔係將個程式啲逐句逐句行一次就算)-呢樣工作就係攞「玩家透過手掣等架生俾嘅輸入」以及「隻遊戲喺上一刻嘅狀態」等嘅資訊,再按呢啲資訊同隻遊戲嘅法則,計遊戲世界下一刻嘅狀態應該係點。即係話一隻電子遊戲大致上可以想像成噉樣(用咗 while 迴圈)嘅虛擬碼[4][5]

 while game is running
   process inputs
   update game world
   generate outputs
 loop

以上呢段碼就噉睇落好簡單,但查實佢包含多個複雜嘅子系統(subsystem):輸入可以包括鍵盤滑鼠、同手掣等,而控制系統嘅設計可以高深得好交關(例:「要用邊啲掣做輸入先可以令玩家覺得舒服就手?」);更新個遊戲世界即係要攞玩家嘅輸入加埋個世界前一刻嘅狀態,用一大堆(表示個遊戲世界運作法則嘅)碼計出下一刻嘅狀態應該係點,例如如果玩家撳咗「向前」,玩家控制嘅角色位置就要向住佢面向嘅方向改變,而改變幅度由個角色嘅移動速度決定;跟手個程式仲要有計,將個新狀態顯示俾喺個熒光幕上面,等個用家有得睇(涉及大量電腦圖像技術)。喺現實應用裏面,上述嘅程式閒閒地可以有幾萬行碼[4][6]

程式結構[編輯]

1982 年嘅食鬼遊戲
睇埋:控制流程

一個遊戲程式結構大致如下:喺一隻遊戲嘅程式啟動嗰陣,個程式要初始化(initialize)-設定好嗮隻遊戲嘅參數嘅數值、講好嗮要用乜資源等等。初始化咗之後,個程式就要進入遊戲迴圈(game loop)-喺程式編寫上,迴圈(loop)係一類控制流程機制,能夠令一段程式碼衹要某啲條件唔達到,就會一路係噉重複行,而相對喺冇迴圈嗰陣,段碼會逐句逐句行,行一次就算[7]。好似係以下呢段食鬼虛擬碼噉,就用咗個 while 迴圈[4][8]

 move_speed = ...
 number_of_ghost = ...
 ... 用若干行 declaration 設定遊戲柞參數嘅數值
 
 while player.lives > 0 當玩家有多過 0 條命嗰陣一路做...(「玩家命變咗 0」就係 GAME OVER 條件)
    // Process Inputs;睇讀取輸入
    JoystickData j = grab raw data from joystick 由手掣嗰度探測玩家撳咗乜掣
    
    // Update Game World;睇遊戲邏輯人工智能
    update player.position based on j 基於玩家撳嘅掣,更新玩家角色嘅位置
    foreach Ghost g in world for 每一隻鬼
       if player collides with g 如果玩家撞到嗰隻鬼
          kill either player or g 玩家就死
       else
          update AI for g based on player.position 基於隻鬼嘅人工智能,更新佢嘅位置
       end
    loop
    // 喺現實應用上,以上嘅各個動作通常會每個做一個子程式
    
    ...
    
    // Generate outputs;睇遊戲外觀
    draw graphics 喺熒光幕上面畫相應嘅影像
    update audio ... 同埋整聲效
 loop

讀取輸入[編輯]

一個任天堂 Switch 嘅手掣;佢上面有好多個掣,俾玩家用手指活動嚟俾輸入。

一個遊戲程式嘅首要任務係要曉讀取玩家俾嘅輸入(input):一隻遊戲定義係一種能夠俾玩家有操控權嘅媒體-相對於或者文學等淨係向觀眾單向噉傳意念嘅媒體;所以隻遊戲要有某啲方法知玩家想做啲乜;喺傳統嘅家用遊戲機當中,玩家會有個手掣攞喺手,個手掣有若干個掣俾佢撳,每當佢撳一個掣嗰時,個掣就會有(好微弱、唔足以危害人類嘅)傳返去部機嗰度,於是喺是但一個時間點,部機都可以靠探測由手掣嚟嘅訊號,知玩家撳咗邊幾個掣[9][10]

軟件上,遊戲機內部對輸入嘅處理可以大致上想像成類似噉嘅 Arduino(一種用嚟為電子硬件做編程嘅程式語言[11]

const int UpButton = 12; /* 用一個變數代表個「上」掣有冇俾人撳 */
const int DownButton = 11; /* 另一個變數代表個「下」掣有冇俾人撳 */

void setup(){ 
   Serial.begin(9600);
   pinMode(UpButton, INPUT);
   pinMode(UpButton, INPUT);
} 

void loop(){ /* 程式迴圈 */
   if(digitalRead(UpButton) == HIGH){ /* 如果個「上」掣有訊號... */
	Serial.println("Up:");
	delay(100);
   }
   if(digitalRead(DownButton) == HIGH){ /* 如果個「下」掣有訊號... */
	Serial.println("Down:");
	delay(100);
   }
}

一個遊戲程式要編成(例如)當感應到「上」掣有訊號嗰時,將個角色向前移動,移動幅度取決於個角色嘅速度-於是玩家就可以透過撳手掣上嘅掣,控制遊戲世界入面嘅嘢。其他平台嘅遊戲通常唔會用手掣,不過原理基本上一樣:好似係電腦遊戲當中,玩家會用滑鼠鍵盤俾輸入;而呢啲輸入架生都係會傳電訊號俾部電腦嘅主機[9]

指令詮釋器[編輯]

喺現實世界,出得街賣嘅遊戲多數有指令詮釋器(command interpreter):指令詮釋器係喺遊戲收到嘅輸入同世界更新之間嘅詮釋機制;例如係一隻賽車遊戲當中,喺玩家撳咗個「X」掣嗰陣,個遊戲程式要將呢個指令翻譯成「個玩家想加速」,跟住再按呢份資訊將玩家架車嘅加速度作出相應嘅改變。呢個過程就噉睇好似冇必要,但查實相當有用:有咗呢種機制,遊戲製作組就可以整個模組出嚟,俾玩家設定(例如)「X」掣對應邊個指令、「Y」掣對應邊個指令... 呀噉-等玩家有得將個遊戲操作方案個人化[12][13]

例如喺冇指令詮釋器之下,一隻射擊遊戲嘅原始碼會有噉嘅嘢[14]

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();
}

而喺有指令詮釋器下,段碼會變成噉[14]

void InputHandler::handleInput()
{
  if (isPressed(BUTTON_X)) buttonX_->execute(); // 如果撳咗 X 掣,做 X 掣相應嘅功能;
  else if (isPressed(BUTTON_Y)) buttonY_->execute(); // 如此類推
  else if (isPressed(BUTTON_A)) buttonA_->execute();
  else if (isPressed(BUTTON_B)) buttonB_->execute();
}

呢段碼會配合好似噉嘅碼[14]

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_;
};

喺冇指令詮釋器嘅情況當中,如果(例如)有個玩家比較鍾意用 X 掣代表「開槍」,A 掣代表「跳」,而唔用隻遊戲預設嗰個控制方案,佢都冇方法改個控制方案(除非佢曉改隻遊戲嘅程式);但喺有指令詮釋器嘅情況下,製作組可以喺遊戲當中加個模組,俾玩家揀要唔要跟預設個控制方案,而如果佢唔要,佢想揀邊個掣代表邊個指令-指令詮釋器嘅存在令玩家有得將控制方案個人化[12]

遊戲邏輯[編輯]

遊戲邏輯(game logic)指隻遊戲入面有乜物件、每件物件包含乜變數、以及物件同物件之間點互動,遊戲邏輯亦都界定咗個遊戲程式要點樣對玩家嘅輸入俾反應。用返上面嗰段食鬼碼為例,隻遊戲嘅遊戲邏輯包含咗初始化當中嗰柞定義咗嘅變數同物件,以及個遊戲迴圈入面嘅「process input」同「update game world」當中所包含嘅「隻遊戲點運作」嘅法則。遊戲邏輯係電子遊戲設計要度好嘅嘢[7]。為一隻遊戲編定遊戲邏輯嗰陣要考慮嘅嘢包括咗[15]

  • 數據結構(data structure):一隻遊戲會包含大量嘅物件同相應變數,例如一隻一般嘅射擊遊戲會有若干把唔同嘅槍俾玩家揀,每把係一件物件,而佢哋分別喺「彈匣大細」同「每槍造成幾多傷害」等嘅變數上都有異;編寫一個遊戲程式需要思考數據結構要點處理-個程式內部要用乜方法儲起各變數同物件嘅數據(睇埋初始化[15]
  • 基於事件架構(event-driven architecture,簡稱「EDA」)係一種軟件畫則上嘅範式。喺遊戲編程上,基於事件架構將一隻遊戲軟件視為一柞事件(event)嘅集合體。一件事件係指一次系統狀態嘅改變(例:「架車開始加速,加速度提升若干數值」),而喺好多遊戲嘅程式當中都有事件管理系統(event manager):事件管理系統界定每種事件係乜同涉及乜數據;而喺做更新遊戲狀態嗰時,遊戲世界入面每件物件同每個子系統(睇 foreach)會睇吓發生緊嘅事件當中邊啲係同佢相關嘅,再按遊戲法則決定要點俾反應[16]

遊戲物理[編輯]

內文: 遊戲物理

遊戲物理(game physics)指個遊戲世界嘅物理:除咗互動式小說等少數遊戲類型之外,電子遊戲多數都會有個空間俾玩家控制某啲嘢喺入面郁動,所以一隻遊戲嘅世界多數要有物理法則主宰啲嘢應該點郁(唔一定合乎現實世界嘅物理定律),而喺「更新遊戲世界狀態」嘅過程當中,個遊戲程式要按照遊戲嘅物理法則同玩家輸入計返個世界嘅狀態應該點變,例如一隻用牛頓力學(Newtonian mechanics)嘅賽車遊戲,喺玩家撳咗「踩油」嘅掣嗰陣,要改變架車嘅加速度數值,而架車相應嘅速度同位置等變數亦要跟牛頓力學裏面嘅法則作出相應嘅改變[15]

例如以下呢段用 C 寫嘅碼可以攞嚟模擬喺牛頓第二定律(Newton's second law)之下郁動嘅物體,喺動作遊戲當中基本上實會用到[17]

double t = 0.0;
float dt = 1.0f;

float velocity = 0.0f;
float position = 0.0f;
float force = 10.0f;
float mass = 1.0f;
// 設一大柞變數,包括咗時間點(t)、時間間隔(dt)、速度(velocity)、位置(position)、件物體受嘅力(force)、同件物體嘅質量(mass)。

while ( t <= 10.0 ) // 重複噉計若干次,計到時間點係 10 為止。
{
    position = position + velocity * dt;
    velocity = velocity + ( force / mass ) * dt; // 用牛頓第二定律計吓件物體受嘅力同佢嘅質量會點影響佢嘅速度。
    t += dt;
}

呢段嘢會俾嘅輸出如下,佢列嗮佢模擬嗰件物體喺每個時間點 位置速度出嚟[17]

t=0:    position = 0      velocity = 0
t=1:    position = 0      velocity = 10
t=2:    position = 10     velocity = 20
t=3:    position = 30     velocity = 30
t=4:    position = 60     velocity = 40
t=5:    position = 100    velocity = 50
t=6:    position = 150    velocity = 60
t=7:    position = 210    velocity = 70
t=8:    position = 280    velocity = 80
t=9:    position = 360    velocity = 90
t=10:   position = 450    velocity = 100

人工智能[編輯]

內文: 電子遊戲嘅人工智能

遊戲編程會用到人工智能(AI)嘅技術:好多遊戲嘅關卡入面都會有敵人俾玩家打,啲敵人要曉唔衹淨係企喺度,仲要識探測玩家嘅位置,並且攻擊玩家,以及對玩家嘅攻擊作出迴避等等-即係話要令遊戲角色作出有智能嘅行為,而「令機械展示智能」正正就係人工智能嘅定義[18]

一般嘅電子遊戲人工智能(video game AI)有以下嘅部份:

  • 刺激詮釋器(stimulus interpreter):刺激詮釋器會話俾一個人工智能程式知個遊戲狀態係點;一般嚟講,每個個體敵人都會有個獨立嘅人工智能(除非隻遊戲係講玩家角色打緊一班具有集合心靈嘅外星人),每個智能會透過刺激詮釋器得到佢哋應該得到嘅資訊,跟住個程式要有方法表示「foreach 敵人,嗰個敵人手上有乜資訊」[19]
  • 決策系統(decision system):每一個人工智能都要按手上嘅資訊同自己嘅目的,計出跟住要採取乜嘢行動;例如一個敵人見到玩家,知道玩家嘅位置,而佢目的係要行埋玩家度攻擊佢,佢個人工智能程式就要有個方法教佢點樣用「玩家嘅位置」同「自己嘅位置」(個決策系統嘅輸入)計出「自己應該向乜方向移動」(個決策系統嘅輸出)[19]

例子 AI 碼[編輯]

人工智能嘅部份位於「更新遊戲狀態」當中。例如以下呢段碼,定義咗兩個子程式,用嚟教人工智能避開障礙物[20]

private function collisionAvoidance() :Vector3D { // 計要點樣避,呢個子程式俾嘅結果會係一股力(睇返上面遊戲物理嗰度)。
    ahead = ...; // calculate the ahead vector
    ahead2 = ...; // calculate the ahead2 vector
 
    var mostThreatening :Obstacle = findMostThreateningObstacle(); // 用「findMostThreateningObstacle」呢個子程式搵出最有威脅性嘅障礙物。
    var avoidance :Vector3D = new Vector3D(0, 0, 0);
 
    if (mostThreatening != null) { // 如果有障礙物,計避開嗰股力要係幾多,用「最有威脅性嘅障礙物」嘅位置同個角色嘅速度計。
        avoidance.x = ahead.x - mostThreatening.center.x;
        avoidance.y = ahead.y - mostThreatening.center.y;
 
        avoidance.normalize();
        avoidance.scaleBy(MAX_AVOID_FORCE);
    } else {
        avoidance.scaleBy(0); // nullify the avoidance force // 如果冇,避開嗰股力變 0(唔使避)。
    }
 
    return avoidance;
}
 
private function findMostThreateningObstacle() :Obstacle { // 用嚟搵出環境入面邊件障礙物最危險嘅子程式
    var mostThreatening :Obstacle = null; // 首先將「最有威脅性嘅障礙物」設做「冇嘢」。
 
    for (var i:int = 0; i < Game.instance.obstacles.length; i++) { // 逐件逐件障礙物計一次
        var obstacle :Obstacle = Game.instance.obstacles[i];
        var collision :Boolean = lineIntersecsCircle(ahead, ahead2, obstacle); // 計吓個角色會唔會同件障礙物相撞
 
        // "position" 係個角色現時嘅位置
        if (collision && (mostThreatening == null || distance(position, obstacle) < distance(position, mostThreatening))) { 
        // 如果會相撞,而且件障礙物近過目前手上最近嗰件「最有威脅性嘅障礙物」嘅話,將件障礙物設做「最有威脅性嘅障礙物」。
            mostThreatening = obstacle;
        }
    }
    return mostThreatening; // 將最後「最有威脅性嘅障礙物」俾做輸出。
}

喺個遊戲程式「更新遊戲狀態」嘅部份入面會有「foreach 人工智能角色,幫佢做 collisionAvoidance()」噉嘅碼[20]

遊戲外觀[編輯]

一個電視液晶顯示器;一部家用遊戲機通常會用某啲方式傳訊號去個顯示器嗰度,話俾個顯示器聽要出乜畫面。
一部 PSP;PSP 係一部手提遊戲機,部機上面有熒幕用嚟顯示遊戲狀態。

遊戲外觀(game view)係一柞將遊戲邏輯向觀察者(通常指玩家)展現嘅子系統:一隻遊戲需要俾玩家決定要作出乜行動,而為咗俾玩家知要做決策,個程式實要以某啲方式,呈現遊戲世界嘅狀態俾玩家知;喺廿一世紀嘅應用當中,遊戲世界通常會用有吸引力嘅電腦圖像(CG)再加埋適當嘅聲音嚟呈現。喺攞咗玩家輸入,又計好遊戲世界嘅新狀態之後,個遊戲程式要做嘅嘢就係度好「個熒光幕要顯示乜圖像」以及「啲音響喇叭要出乜嘢聲」-負責做呢個工序嘅遊戲程式部份就係遊戲外觀系統[21]

影像[編輯]

睇埋:電腦圖像

顯示影像嘅方法要睇隻遊戲係用二維定三維影像嘅做法:

  • 二維圖像會用精靈圖(sprite)結合埋一齊整景。舉個例子說明,喺一隻二維嘅超級瑪利奧(Super Mario)遊戲入面,個遊戲程式會記住主角嘅精靈圖同埋啲怪獸嘅精靈圖,而個主角瑪利奧嘅精靈圖又會包含咗(例如)佢企喺度嗰陣嘅樣、佢行路嗰陣嘅樣、同埋佢跳嗰陣嘅樣等等。喺每一個時間點,個程式都會按「個主角同每隻怪獸喺邊個位置,喺度做緊乜」等嘅資訊,揀應該用邊幾幅精靈圖,並且按照每件物件嘅位置,將呢啲精靈圖同個背景合拼埋一齊,最後形成一個畫面,最後個程式要將呢個畫面傳去個熒光幕嗰度,等個熒光幕將個畫面顯示出嚟[22][23][24]
  • 三維圖像會用到三維模型(3D model)。一個三維模型係一個(對於部電腦嚟講)用數字呈現嘅三維物體,而整一幅三維嘅電腦圖像過程要用彩現(rendering)嘅方法:想做彩現嘅人會首先整一個景檔案(scene file)出嚟,呢個檔案會包含多種訊息,包括「個景入面用咗啲乜嘢立體模型」、「每個立體模型喺邊個位置」、「光源喺邊」、「個鏡頭擺喺邊個位置」、同埋「幾何變換」(睇下面)呀噉,描述個景係點嘅;然後部電腦會將呢個檔案入面嘅數據傳去一個彩現程式嗰度,等個程式做一大柞人手做唔嚟嘅運算,計出個鏡頭會睇到嘅(二維)影像應該係點樣嘅,並且將個鏡頭所睇到嘅影像俾出嚟做輸出[25][26]
  • 無論二維定三維圖像,一個電子遊戲程式會係噉做「基於遊戲狀態更新影像」嘅工作,而且一秒內做閒閒地做幾廿次-由人眼嚟睇就好似係識郁嘅影像噉[22][25]

用虛擬碼表達大致上會係噉[27]

 make the background the color it should be // 將背景設做應有嘅色水。
 
 for each object // for each 物件,用精靈圖(2D 嘅話)或者三維模型(3D 嘅話)畫佢出嚟。
     take that object's position
     take that object's sprite/3D model
     draw it

聲音[編輯]

睇埋:電腦音樂

電子遊戲程式會內有若干個聲檔案,喺某啲事件發生嗰陣,個程式要按「玩家角色離發聲物件幾遠」等嘅資訊,傳訊號去音響喇叭嗰度,教個喇叭出乜嘢聲。電子遊戲涉及三大種聲音[28]

  • 音樂(music):個遊戲程式一日喺某個狀態(「喺標題畫面」、「喺第一關」、「喺第二關」... 等等)就要一路循環播嘅聲,會用到 while 迴圈(「while 隻遊戲喺呢個呢個狀態,播呢首呢首音樂)。音樂對於營造一隻遊戲嘅氣氛嚟講不可或缺[29]
  • 聲效(sound effect):指喺某啲事件發生嗰時一次性嘅聲,例如係一隻賽車遊戲入面,每當有兩架車相撞,個遊戲程式要叫個喇叭播出相應嗰個聲檔案嘅內容[28]
  • 講嘢(speech):係三種聲入面最難搞嗰種;因為喺多數情況下,個遊戲程式唔淨衹要叫喇叭播出個聲檔案,仲要確保啲聲同講緊嘢嗰個角色嘅三維模型嘅嘴唇嘅郁動同步(而且喺製作上,整講嘢聲要特登請配音員返嚟做)。有啲遊戲程式會索性有個數據庫,儲住「人類嘴唇喺發每種聲嗰時係乜樣」嘅資訊,再喺要播講嘢聲嗰陣,即場由啲聲計出個角色嘅三維模型嘅嘴唇要係乜樣[28]

喺每一個時間點 ,個遊戲程式要考慮有邊幾個聲檔案喺度播緊,再(foreach 播緊嘅聲檔案)按「呢個聲檔案處於邊個時間點」以及「呢個聲源離玩家角色幾遠」等嘅資訊,計出佢喺嗰個時間點會造成乜嘢聲(一個聲有「幾高音」同「幾大聲」等都可以用數字表示),再將呢啲資訊傳去音響喇叭嗰度[28]

遊戲編程架生[編輯]

程式語言[編輯]

常用嚟做遊戲編程嘅程式語言有以下呢啲(要留意嘅係,遊戲好多時會用多過一款語言寫):

應用程式介面[編輯]

睇埋[編輯]

參考書[編輯]

  • Lengyel, E. (2001). Mathematics for 3D game programming and computer graphics. Charles River Media, Inc..
  • McShaffry, M. (2014). Game coding complete. Nelson Education.

[編輯]

  1. Sanchez-Crespo, D., & Dalmau, D. S. C. (2004). Core techniques and algorithms in game programming. New Riders.
  2. 7 Reasons Game Development Is the Perfect Side Hobby for Software Developers 互聯網檔案館歸檔,歸檔日期2018年10月13號,.. Atomic Object.
  3. Moore, Michael E.; Novak, Jeannie (2010). Game Industry Career Guide. Delmar: Cengage Learning.
  4. 4.0 4.1 4.2 Game Programming Algorithms and Techniques: Overview, p. 2. informIT.
  5. "Programming Linux Games, Chapter 1" (PDF). ISBN 1-886411-48-4.
  6. 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. 7.0 7.1 McShaffry, M. (2014). Game coding complete. Nelson Education. p. 34 - 35.
  8. 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. 9.0 9.1 Shelly, Gary; Vermaat, Misty (2008). Discovering Computers: Fundamentals. Boston, MA: Course Technology Cengage Learning. p. 172.
  10. 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.
  11. Video Game Controller With Arduino 互聯網檔案館歸檔,歸檔日期2019年1月13號,..
  12. 12.0 12.1 McShaffry, M. (2014). Game coding complete. Nelson Education. p. 40.
  13. Designing Game Controls 互聯網檔案館歸檔,歸檔日期2019年1月12號,.. Gamasutra.
  14. 14.0 14.1 14.2 Command. Game Programming.
  15. 15.0 15.1 15.2 15.3 15.4 15.5 McShaffry, M. (2014). Game coding complete. Nelson Education. Ch. 2.
  16. K. Mani Chandy. Event-Driven Applications: Costs, Benefits and Design Approaches, California Institute of Technology, 2006.
  17. 17.0 17.1 Integration Basics: How to integrate the equations of motion 互聯網檔案館歸檔,歸檔日期2018年10月26號,.. Gaffer on Games.
  18. Yannakakis, Geogios N (2012). "Game AI revisited" (PDF). Proceedings of the 9th Conference on Computing Frontiers: 285–292.
  19. 19.0 19.1 McShaffry, M. (2014). Game coding complete. Nelson Education. p. 45 - 46.
  20. 20.0 20.1 Understanding Steering Behaviors: Collision Avoidance.
  21. McShaffry, M. (2014). Game coding complete. Nelson Education. p. 41.
  22. 22.0 22.1 Hague, James. "Why Do Dedicated Game Consoles Exist? 互聯網檔案館歸檔,歸檔日期2018年4月23號,.". dadgum.com.
  23. 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.
  24. 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.
  25. 25.0 25.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.
  26. Phong, B-T (1975). "Illumination for computer generated pictures". Communications of the ACM. 18 (6): 311–316.
  27. Ultimate Guide to the Processing Language Part II: Building a Simple Game. Developers.
  28. 28.0 28.1 28.2 28.3 McShaffry, M. (2014). Game coding complete. Nelson Education. p. 43 - 44.
  29. 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.
  30. Hyde, Randy (1985). Using 6502 Assembly Language.
  31. 31.0 31.1 Corlan, Alexandru-Dan (2011). "Game Programming in C and C++ 互聯網檔案館歸檔,歸檔日期2019年5月13號,.".
  32. Corlan, Alexandru-Dan. "LWJGL - Projects".
  33. Corlan, Alexandru-Dan (2015-03-24). "Lua: Uses 互聯網檔案館歸檔,歸檔日期2019年7月24號,.".

[編輯]

維基[編輯]