四聖龍神錄的程式設計教室 第24章 來製作boss吧

2021-07-10 06:14:34 字數 4663 閱讀 4298

那麼接下來、終於要進入彈幕的製作了。

首先,要製作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 二 描述和解釋的細節 ...