那麼接下來、終於要進入彈幕的製作了。
首先,要製作boss的彈幕的話,就需要有個boss。
boss的身體的製作的,要注意很多地方,比較麻煩,大家努力學習下吧。
在這裡,稍微說點物理相關的話題吧。
龍神錄裡,boss看起來都是「咻」,「咻」的運動的。
雖然想按照「從這裡到那裡,移動這麼長的時間」這樣的指令來執行某個動作,但以速度勻速移動過去,到制定地點突然就停止了,這樣看起來感覺不大好。
如果沒有加速,減速,再停下來這樣的過程的話,運動看起來就不漂亮。
於是,以「在這麼長的距離,這麼長的時間內,漂亮的移動過去」作為我們動作指令的目標,我們來考慮下怎麼用算式來實現這個吧。
對數學學的不好的人可能會討厭看到計算公式,我們就用很簡單的計算來表示下看看吧。
物理的力學的勻加速運動中,有三個大公式。
就是下面3條公式。v是速度,a是加速度,y是距離,t是時間。
現在,我們考慮某個時間發射出去,在指定距離y裡,用了一定的時間ty,做減速運動正好停止的這樣乙個問題。v=
v0−a
t...
① y=
v0t−
12at
2...
② v2
−v20
=−2a
y...
③ 以
v0為初速度飛出去的物體,在時間ty
內前進了ym
ax的距離後停下來時,最後的速度是0。所以把v=
0 代入①, 得到 v0
=aty
a=v0t
y … ⑤ 把v
=0再代入③,得到 v2
0=2a
ymax
把⑤代入上面這個式子 v2
0=2v
0tyy
max …④
兩邊都約去v0
v0=2tyy
max … ⑥
把⑥代入⑤,得到 a=
2t2y
ymax
…⑦ 把⑥,⑦都代入② y=
2yma
xtyt
−yma
xt2y
t2…a
這樣,我們就推導出了式子a啦。 ty
是一段時間,ym
ax是移動距離。把計數器代入t的話,y就可以算出來了。
這個在水平方向,豎直方向的分量都計算了的話,就可以實現漂亮的移動啦。
以下是使用了那個計算公式的地方,
input_phy(登陸)
calc_phy(計算)
我們看一下注釋吧。
---- boss_shot.cpp 的改動 ----
#include "../include/gv.h"
#include "../include/func.h"
#define v0 10.0
int serch_boss_shot()
return -1;
}double bossatan2()
//進行物理運算的實現(在指定時間t內返回到指定位置)
void input_phy(int t)
//角色的物理移動計算
void calc_phy()
//計算boss的彈幕
void boss_shot_calc()}}
boss_shot.cnt++;
}//設定彈幕
void enter_boss_shot()
//設定boss
void enter_boss(int num)
boss.flag=1;
boss.hagoromo=0;//是否扇形散開的標誌
boss.endtime=99*60;//剩餘時間
boss.state=1;//設定為待機狀態
boss.cnt=0;
boss.graph_flag=0;//重設繪製的標誌開關
boss.knd++;
boss.wtime=0;//初始化待機的時間
memset(&boss_shot,0,sizeof(boss_shot_t));//初始化boss的彈幕情況
input_phy(60);//經過60個計數後,物理計算運動的位置
}//boss的待機處理
void waitandenter()
//boss的彈幕主方法
void boss_shot_main()
if(boss.state==1)
if(boss.state==2)
boss.cnt++;
}
這裡從最上面開始看具體實現。
這裡呼叫double bossatan2()
函式,可以很方便的返回自機和敵機所形成的角度。彈幕製作時一定要用到這個函式哦。
boss什麼時候出現,體力為多少,等這些資訊,都通過 ini函式設定預先設定好了適當的值。
---- ini.cpp ini()的改動 ----
//遊戲初始化
void ini()
變數和構造題的宣告,也準備一下。
---- struct.h に追加 ----
//boss彈幕相關的構造體
typedef
structboss_shot_t;
//物理計算要用到的構造體
typedef
structphy_t;
//boss的資訊
typedef
structboss_t;
---- define.h 裡新增 ----
//boss的指定位置
#define boss_pos_x (field_max_x/2)
#define boss_pos_y 100.0
//boss擁有的子彈最大數量
#define boss_bullet_max 3000
//彈幕的最大數量
#define danmaku_max 50
---- gv.h 裡新增 ----
global int img_dot_riria[8];//莉莉婭的點陣影象
global boss_shot_t boss_shot;//boss彈幕資訊
global boss_t boss; //boss資訊
---- main.cpp 的main函式的以下部分進行改動 ----
case
100://通常處理
calc_ch(); //角色計算
ch_move(); //角色的移動操作
cshot_main();//自機射擊主函式
enemy_main();//敵機處理主函式
shot_main(); //射擊主函式
boss_shot_main();
out_main(); //中彈檢測
effect_main();//特效主函式
graph_main();//繪製主函式
if(boss.flag==0)
stage_count++;
---- load.cpp load()函式裡新增 ----
loaddivgraph( "../dat/img/char/riria.png" , 8 , 8 , 1 , 100 , 100 , img_dot_riria ) ;
---- enemy.cpp enemy_enter()函式裡新增 ----
void enemy_enter()
//子彈的繪製
void graph_bullet()}}
}//boss
if(boss_shot.flag>0)}}
setdrawmode(dx_drawmode_nearest);//返回繪圖格式
}void graph_develop()
void graph_main()
---- function.h 裡新增 ----
//boss_shot.cpp
global void boss_shot_main();
彈幕函式是使用雜兵射擊時,同樣的函式指標。
這裡,include資料夾裡的fun.h檔案裡也要新增一下。
---- func.cpp 的改動 ----
extern
void boss_shot_bulleth000();
void (*boss_shot_bullet[danmaku_max])() =
;
我們準備乙個彈幕來試試看吧。
---- boss_shoth.cpp 的改動 ----
#include "../include/gv.h"
extern
int serch_boss_shot();
extern
double bossatan2();
void boss_shot_bulleth000()}}
for(i=0;iif(boss_shot.bullet[i].flag>0)
}}
雖然中彈檢測都還沒有,我們先讓彈幕執行起來吧。
執行結果
本人csdn部落格目錄:
本人github部落格:
怎樣教四歲的孩子學畫畫
要教好嬰幼兒學畫畫,首先家長要明確以下兩個問題 第一.要明確教子繪畫的指導思想。家長教嬰幼兒畫畫主要目的是為了啟蒙孩子的動手能力 想象能力和創造能力,培養專注安靜的性格和喜歡畫畫的興趣。而不能過早 過多地想到是為了把孩子培養成乙個小畫家 小美術家。這樣家長教孩子畫畫就會感到是一種有趣的繪畫活動,覺得...
100 1 99 程式設計者的啟示錄!!!
前兩天聽到公尺老師講到一件小事,是關於發郵件時附件名稱的事。本來都沒有意識到,可是當公尺老師講完之後,突然覺得自己做的差極了。這是乙個細節的問題,但是更是乙個關乎個人素質的問題。老子曰 千里之行,始於足下 講的就是細節,就是基礎,就是從小事做起的重要性。但是,為什麼我們現在很多事卻做不到呢?有句話很...
程式語言沉思錄 程式語言的體系結構
程式語言沉思錄 程式語言的體系結構 程式語言是一套描述和解釋系統 一 語言體系結構 客觀世界 人 描述和解釋為 自然語言 人 描述和解釋為 程式語言 編譯器 指令集 記憶體位址 記憶體資料 記憶體模型 呼叫指令 算術指令 邏輯指令 編譯器機器指令 計算機 cpu 記憶體 io 二 描述和解釋的細節 ...