精華區beta GameDesign 關於我們 聯絡資訊
如先前所言,我希望螢幕上出現的子彈是由不同武器所發射出來 即是說子彈彼此雖然各自獨立,但卻可以對玩家產生混合的影響 (就像開頭所說的DDT+彈弓) 好比圖層一般,層層獨立,組合後變成最後的結果。 依照這個構想,我們可以把不同的武器所發射出來的子彈想像成獨立的"彈幕" 彼此獨立處理自己的移動,刪除,碰撞等運算。而每種武器則各自掌管自己生成的彈幕。 至於武器與子彈的建構,就跟前篇建構STATE一樣,先設計一個武器的原形class與 子彈的原形class,之後每把武器再各自繼承之,並改寫其中的Move(), isHit, Shoot() 等函式即可。 底下我們來看武器與子彈的prototype class: class weapon{ poulic: /*開火速率;發射前準備時間;彈藥;跑位次數等*/ int fireRate; int preapreTime; int ammo; int changePosition; /*彈幕容納*/ MovieClip mc; /*要傳達給子彈的資訊*/ float speed; float damage; /*有的沒的Function*/ void init(); void shoot(); void move(); void isHit(); }; class bullet: public MovieClip{ public: float radius; //子彈方向 float speed; //子彈目前速度 float damage; //子彈殺傷力 }; 這就是所有的武器的原形,同時也是第一把武器的宣告式 第一把武器(彈弓)的行為模式最簡單也最直接: 發射->移動->消失or命中 在shoot() 函式中,武器"Create"一顆子彈,然後在彈幕中登記,告訴彈幕 "我發射了一顆子彈,等會記得幫我處理他的移動以及碰撞嘿~" 於是,彈幕庫每次都會列出所有登記的子彈,然後處理他們的移動(move)及碰撞(isHit) 子彈的座標空間設定,我用的是極座標。藉由角度(radius)以及長度(speed) 來計算出每顆子彈接下來的所在(在frame與frame之間)。 而所謂的移動(protoType),不過就是每1/30秒用radius & speed計算出子彈的位移, 然後累加之,透過每1/30秒一次次的重複計算,就能達到子彈移動的效果。 碰撞(protoType)部分,則是每1/30秒簡單比較每顆子彈的與PLAYER的bounding box 有無相交即可(雷射與黑洞的部分比較麻煩,容後再敘) 至此,前置程式已經接近完成。 把Player的部分補上,就差不多了。 PLAYER,負責接收玩家端的資訊。 可以想見其中必定有一個專門處理鍵盤傳入資訊的Listener,負責把從鍵盤接收到的 資訊傳達給程式處理。 先簡單講一下一開始的Player設計。 class player{ public: MovieClip mc; //實體影片片段 float speed; //移動速度 int turbo; //空白加速度 bool control; //操縱可否 enum ill; //不良狀態 int illCount; //狀態影響計數器 float attractRadius; //引力角度 int attractForce; //引力強度 void moving(); }; 其中基本的如移動速度等不贅述,turbo用來製造"按下空白鍵的突然加速"效果 每按一下空白鍵,turbo會變成10,然後每1/30遞減。這個turbo最後會與 位移相加,假設原本的位移是一次+4; 一下turbo突然變成 +14, 再來是+10, +6... 就能製作出"渦輪加速"的突加/減速度運動。 "ill&illCount"則是用來登記幾種負面狀態的影響。 至於attractXXXX這兩個,用來處理被彈時的後退方向,以及後退的力道。與turbo相同 這個參數也會在最後與位移相加。 其他大多是一些比較繁雜的程式如接收、對應的處理等,這部分我就略過了。 計算一下目前做了些什麼: Seeker具備基本的狀態函式,武器庫也有了一把武器,Player也能移動,攻擊。 簡單的遊戲原形已經完成了(茶) 計算一下目前做了些什麼: Seeker具備基本的狀態函式,武器庫也有了一把武器,Player也能移動,攻擊。 簡單的遊戲原形已經完成了(茶) 於是,最早的版本長的就像底下(大約500行左右): http://studentweb.ncnu.edu.tw/93321523/hb2006/teach/proto.swf (續) 文章轉自暨大霞蔚山城 ★ HenryBBS (henry.twbbs.org) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 163.22.18.97