基於C 彈幕類射擊遊戲的實現 (七)彈幕類實現

2021-06-19 18:18:03 字數 3901 閱讀 9640

如果只有這些子彈,那看起來必然是很一般的,想想看,只有幾顆子彈,孤零零的從下面跑到上面。。。。。

gamebarrage彈幕類,用於建立一些酷炫叼的彈幕~~其實核心也就是通過一些數學公式,然後批量addbullet而已~~

先來看看型別的定義

public enum barragetype

初步就這四種,其餘的彈幕型別都可以通過這幾種組合出來

然後就是彈幕的具體實現

public class gamebarrage

/// /// 圓形彈幕

///

/// 是否為玩家子彈

/// 子彈型別

/// 子彈顏色

/// 中心點位置

/// 子彈移動速度

/// 子彈移動加速度

/// 每顆子彈的角度間隔

/// 延遲發射時間

public void createcircle(bool isown, int type, int color, vector2 position, float speed, float accel, int interval, float delay)

}/// /// 扇形彈幕

///

/// 是否為玩家子彈

/// 子彈型別

/// 子彈顏色

/// 中心點的位置

/// 扇形的起始角度(向右為0°)

/// 扇形的結束角度(順時針)

/// 子彈移動速度

/// 子彈移動加速度

/// 每顆子彈的角度間隔

/// 發射持續時間(為0表示瞬間發射所有)

/// 延遲發射時間

public void createrotateandshoot(bool isown, int type, int color, vector2 position, int startangle, int endangle, float speed, float accel, int interval, float duration, float delay)

}else}}

/// /// 直線交叉彈幕

///

/// 是否為玩家子彈

/// 子彈型別

/// 子彈顏色

/// 子彈數量

/// 開始地點一

/// 開始地點二

/// 交叉點

/// 子彈移動速度

/// 子彈移動加速度

/// 發射持續時間(為0表示瞬間發射所有)

/// 延遲發射時間

public void createcrossline(bool isown, int type, int color, int spawncount, vector2 beginpos1, vector2 beginpos2, vector2 crosspos, float speed, float accel, float duration, float delay)

}/// /// 直線彈幕

///

/// 是否為玩家子彈

/// 子彈型別

/// 子彈顏色

/// 子彈數量

/// 開始地點

/// 目標地點(用於確定方向而已)

/// 子彈移動速度

/// 子彈移動加速度

/// 發射持續時間

/// 延遲發射時間

public void createline(bool isown, int type, int color, int spawncount, vector2 startpos, vector2 targetpos, float speed, float accel, float duration, float delay)

}/// /// 隨機彈幕

///

/// 是否為玩家子彈

/// 子彈型別

/// 子彈顏色

/// 子彈數量

/// 子彈範圍

/// 子彈速度(包括方向)

/// 子彈加速度(包括方向)

/// 發射持續時間(為0表示瞬間發射所有)

/// 延遲發射時間

public void createrandom(bool isown, int type, int color, int spawncount, rangebox boundary, rangevector speed, rangevector accel, float duration, float delay)

}}

就來圓形彈幕來講解吧。

首先大家可以看看前面gamebullet,有個字段是用於延遲顯示的(就是說子彈已經新增了,只是必須要等到規定時間過去才能顯示出來)

解析來看具體的實現

public void createcircle(bool isown, int type, int color, vector2 position, float speed, float accel, int interval, float delay)

}

核心思想就是通過「極座標公式」算出不同角度對應的座標,然後生成子彈

具體的計算就是helper.getspeedwithangle,這個忘記的可以看前面章節,有寫~

通過累加angle,迴圈360°,然後計算出不同角度的速度方向和延遲就能建立圓形彈幕了

再來乙個用的最多的扇形彈幕

public void createrotateandshoot(bool isown, int type, int color, vector2 position, int startangle, int endangle, float speed, float accel, int interval, float duration, float delay)

}else

}}

原理和上面類似,只是需要注意的是時間延遲傳遞的是  (startangle-count)*wait+delay

其實就是通過計算出需要產生的子彈數量已經總的延遲,然後算出每乙個子彈的延遲時間。

這樣的效果就是,瞬間產生了一堆子彈,但是看到的是乙個個顯示出來,有一種旋轉著發射子彈的感覺。。。表達不好。。

有了這個東西,就可以看看 boss彈幕的生成了,其實就是用了這些函式而已

public static class bossbarrage			

/// /// 直線型彈幕

///

///

/// 彈幕持續5秒

public static int line(gamebarrage barrage)

/// /// 連續兩撥錯開的扇形彈幕

///

///

///

/// 彈幕持續時間2秒

public static int twofans(gamebarrage barrage, vector2 position)

/// /// 左右兩邊出現相反的漩渦型彈幕

///

///

///

/// 彈幕持續時間4秒

public static int tworeverserotate(gamebarrage barrage, vector2 position)

/// /// 三個園型彈幕

///

///

///

/// 彈幕持續時間5秒

public static int threecircle(gamebarrage barrage, vector2 position)

}

**很多,只是通過一些數學計算,產生不同效果而已~~大家可以自由發揮~~

基於C 彈幕類射擊遊戲的實現 (五)主場景

這裡的的gamescene就是乙個用於管理所有物件的類。整個遊戲只有乙個scene 其實還有menuscene,loadscene之類的,但這裡沒有做,在下乙個遊戲 超級瑪麗 裡會有詳細的介紹 先來看看申明部分 public static gamescene mainscene null priva...

基於C 彈幕類射擊遊戲的實現 (三)子彈的實現

我寫部落格喜歡做完乙個東西,一口氣寫很多章。貌似這樣不太好啊 到這裡,我們似乎該讓主角上場了,好就讓我們來顯示一顆子彈吧 慢著,顯示子彈之前,我們需要小小的抽象一下,把遊戲中所有能顯示的物體抽象成gameobject,好處是什麼?好處是看起來很帥。當然不是,好處簡單來說,整合公共部分 利於管理 好吧...

基於C 實現的約瑟夫生者死者遊戲

約瑟夫生者死者遊戲的大意是 30個旅客同乘一條船,因為嚴重超載,加上風高浪大危險萬分 因此船長告訴乘客,只有將全船一半的旅客投入海中,其餘人才能倖免於難。無奈,大家只得統一這種方法,並議定30個人圍成一圈,由第乙個人開始,依次報數,數到第9人,便將他投入大海中,然後從他的下乙個人數起,數到第9人,再...