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

2021-06-19 18:15:55 字數 2736 閱讀 1946

我寫部落格喜歡做完乙個東西,一口氣寫很多章。。。貌似這樣不太好啊~

到這裡,我們似乎該讓主角上場了,好就讓我們來顯示一顆子彈吧~

慢著,顯示子彈之前,我們需要小小的抽象一下,把遊戲中所有能顯示的物體抽象成gameobject,好處是什麼?好處是看起來很帥。。

當然不是,好處簡單來說,整合公共部分、利於管理~~好吧我也不知道好處。。。。

/// /// description of gameobject.

///

public class gameobject

public virtual void update(float elapsedtime)

public virtual void render(graphics g)

}

封裝了一些基礎屬性和方法~~特別說明下:halfwidth和halfheight只是用於計算的時候少乙個除法,可以不需要的,後面的**會看到

對了,特別說明下:一般的座標系是以左上角為(0,0)點,向右為x正方向,向下為y正方向。

而這個遊戲是以螢幕的中間為遠點,繪製的時候也是,以的中間為繪製點。。。至於為什麼這樣。。我當時腦抽了,忘了為什麼了

接下來就是主角

/// /// description of gamebullet.

///

public class gamebullet : gameobject

public override void update(float elaspedtime)

if (activedelay > 0)

speed += (accel * elaspedtime);

position += (speed * elaspedtime);

boxcollider.x = (int)position.x;

boxcollider.y = (int)position.y;

if ( position.x < 0 || position.y < 0 || position.x > config.screenwidth || position.y > config.screenheight )

}public override void render(graphics g)

g.drawimage(data.bulletssource[this.type],

new rectangle((int)position.x - halfwidth, (int)position.y - halfheight, width, height),

new rectangle(this.color * width, 0, width, height),

graphicsunit.pixel);

if ( config.isdebug && config.isshowbox )

}}

唯一要說明的是update方法的這兩句

speed += (accel * elaspedtime);

position += (speed * elaspedtime);

通過速度和加速度來更新子彈的位置,並且在後面同步更新碰撞盒的位置

這裡用簡單的物理知識來模擬了一下粒子的執行~其實可以做的更複雜一點,比如線速度角速度。

我們這裡學習用,就簡單一點。東方系列就比較複雜了

子彈肯定不止乙個,而且有自己的和敵人的

所以需要乙個管理類,用於管理一堆子彈

public class gamebulletmanager			

public void addbullet(gamebullet bullet)

public void update(float elapsedtime)

if ( mbullets[i].isown == false ) // 不是自己的子彈

}else

if ( mscene.bossmanager.collide(mbullets[i].boxcollider, 1) == true )}}

} public void render(graphics g)

if ( config.isdebug )

}}

這裡面沒有遇到的類暫且不管。

大體上就是用乙個list來儲存所有gamebullet~~更新和繪製也是乙個迴圈

唯一要做的就是檢測子彈和其餘單位是否碰撞了,碰撞的話要新增**效果,然後移除這個子彈

好,現在你可以新增幾個子彈來玩玩了。

比如,建立乙個直線上公升的子彈

addbullet(new bullet(false, new vector2(0, 0), new vector2(0, -300), vector2.zero, 0, 0, 0);

建立乙個斜著飛的子彈

addbullet(new bullet(false, new vector2(0, 0), new vector2(300, -300), vector2.zero, 0, 0, 0);

建立乙個越飛越快的子彈

addbullet(new bullet(false, new vector2(0, 0), new vector2(0, -300), new vector2(0, -100), 0, 0, 0);

大概就是這樣

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

如果只有這些子彈,那看起來必然是很一般的,想想看,只有幾顆子彈,孤零零的從下面跑到上面。gamebarrage彈幕類,用於建立一些酷炫叼的彈幕 其實核心也就是通過一些數學公式,然後批量addbullet而已 先來看看型別的定義 public enum barragetype 初步就這四種,其餘的彈幕...

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

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

基於C語言實現三子棋遊戲

說到三子棋,我想大家一定不陌生吧,它也是我童年中的一部分,今天我們用c語言來實現一下簡易版的三子棋。首先,介紹一下遊戲規則 1.在乙個九程式設計客棧宮格上進行下棋 2.玩家兩名,雙方先後落子 3.若在一條直線上有三顆同一玩家的棋子,則該玩家贏,若棋盤下滿也沒有出現三顆棋子在一條直線上,則為平局。1....