「ゴブリンでもわかるゲームプログラミング」第29話 ~読むだけでゲームプログラミングがなんとなくわかるようになる謎のファンタジー小説~
本作は連載作品です。第1話は下記です。
気に入っていただけたら↓に「スキ」いただけると嬉しいです。
////////////////////////////////////////////
class Shot{
// 要素の定義
count // カウンター
time // 射出時間
interval // 射出間隔
angle // 射出角度
position //射出位置
size // 大きさ
power // 威力
attribute // 属性
sub_attribute // 副属性
speed // 速度
acceleration // 加速度
bullets
・・・
// 処理《メソッド》の定義
set(){
// 弾の初期化処理
time = 1200 // 射出時間
interval = 60 // 射出間隔
angle = 360 / 10 * count / 60 // 射出角度
position = device.position //射出位置
size = 0.5 // 大きさ
power = 0.1 // 威力
if(count % 120 == 0){
attribute = ICE // 属性=氷
}
else{
attribute = WIND // 属性=風
}
speed = 0.1 // 速度
acceleration = 0 // 加速度
}
// ★以下が新たに解明された処理
create_bullets(){
// 弾の生成処理
if(count < time && count % interval == 0){
// カウンターが射出時間(time)より小さい かつ
// カウンターが射出間隔(interval)に達した 場合
set_bullets() // ↓の弾の設定処理を呼び出す
}
}
set_bullets(){
// 弾の設定処理
bullet = new Bullet() // 新しい弾を生成
bullet.angle = angle // 射出角度
bullet.position = position //射出位置
bullet.size = size // 大きさ
bullet.power = power // 威力
bullet.attribute = attribute // 属性
bullet.sub_attribute = sub_attribute // 副属性
bullet.speed = speed // 速度
bullet.acceleration = acceleration // 加速度
bullets.add(bullet) // 新しい弾を追加する
}
・・・
}
////////////////////////////////////////////
新たに見えてきた処理は
①弾の生成処理(create_bullets())
②弾の設定処理(set_bullets())
の二つだ。
どうやら
①弾の生成処理(create_bullets())は
射出時間(time)と射出間隔(interval)の確認を行い、
条件が揃えば、弾の設定処理(set_bullets())を呼び出すという処理のようだ。
②弾の設定処理(set_bullets())はひたすら弾の初期値を設定している処理のようだ。
この②弾の設定処理をすると、ユキは、まだ解析はできていない範囲であるが、更に上位の処理により、弾の発射処理などが行われると推測できた。
ということで、まずは、②弾の設定処理(set_bullets())を制御していると思われる①弾の生成処理(create_bullets())について、より深く解析することにする。
////////////////////////////////////////////
if(count < time && count % interval == 0){
// カウンターが射出時間(time)より小さい かつ
// カウンターが射出間隔(interval)に達した 場合
////////////////////////////////////////////
この条件について解析する。
ここで初めて出てくるのが〝&&〟という記号だ。
この記号は日本語で言うと〝かつ〟を表す。
////////////////////////////////////////////
if(条件A && 条件B)
////////////////////////////////////////////
のように使用し、AとBの両方の条件を満たした時のみ、
条件内の処理を実施するという意味となる。
今回の条件でいうと
条件A ⇒ count < time // カウンターが射出時間(time)より小さい
条件B ⇒ count % interval == 0 // カウンターが射出間隔(interval)に達した
ということになる。
射出時間(time)と射出間隔(interval)の具体的な値は弾の初期化処理(set())の中で定義している。
////////////////////////////////////////////
set(){
// 弾の初期化処理
time = 1200 // 射出時間
interval = 60 // 射出間隔
////////////////////////////////////////////
したがって、具体的な数値で表すと
条件A:count < 1200 // カウンターが射出時間(1200)より小さい
条件B:count % 60 == 0 // カウンターが射出間隔(60)に達した
ということになる。
この世界では、1秒が120カウントであることから、
1200とは約10秒、60とは約0.5秒のことである。
つまるところ、
////////////////////////////////////////////
if(count < time && count % interval == 0){
set_bullets() // ↓の弾の設定処理を呼び出す
}
////////////////////////////////////////////
が意味するのは
カウンターが10秒まで かつ 0.5秒ごとに
②弾の設定処理(set_bullets())
を呼び出すという意味になる。
(……ということは、ちょっと無理やりだけど、この①弾の生成処理(create_bullets())の中身をいじれば、目的としていた〝弾の同時発射〟も可能かもしれない……!)
ユキは①弾の生成処理(create_bullets())の改修に取り掛かる。
////////////////////////////////////////////
【変更前】
create_bullets(){
// 弾の生成処理
if(count < time && count % interval == 0){
// カウンターが射出時間(time)より小さい かつ
// カウンターが射出間隔(interval)に達した 場合
set_bullets() // ↓の弾の設定処理を呼び出す
}
}
↓↓↓
【変更後】
create_bullets(){
// 弾の生成処理
if(count < time && count % interval == 0){
// カウンターが射出時間(time)より小さい かつ
// カウンターが射出間隔(interval)に達した 場合
set_bullets() // ↓の弾の設定処理を呼び出す
// 以下に処理を追加
angle += 360 / 4 // 角度を90°足す
set_bullets() // ↓の弾の設定処理を呼び出す
angle += 360 / 4 // 角度を90°足す
set_bullets() // ↓の弾の設定処理を呼び出す
angle += 360 / 4 // 角度を90°足す
set_bullets() // ↓の弾の設定処理を呼び出す
angle += 360 / 4 // 角度を90°足す
}
}
////////////////////////////////////////////
〝THEごり押し〟であるが、ユキはこのように魔法論理を変更した。
元々の処理が弾の呼び出し処理が一つしかないから、たくさん呼び出せばいいじゃないかという単純な発想である。
今回は3つ弾の追加処理を追加し、合計4つの弾が同時に出るように変更した。
直前に90°ずつ角度を加算してやれば、ちょうど直角分ずつ弾の角度がずれるようになる。
(かなりごり押したけど、果たしてうまくいくか……)
微調整として、弾の数を4倍にしたため、大きさ(size)は0.5⇒0.125へ変更した。
全体の魔法論理は以下だ。
////////////////////////////////////////////
class Shot{
// 要素の定義
count // カウンター
time // 射出時間
interval // 射出間隔
angle // 射出角度
position //射出位置
size // 大きさ
power // 威力
attribute // 属性
sub_attribute // 副属性
speed // 速度
acceleration // 加速度
bullets
・・・
// 処理《メソッド》の定義
set(){
// 弾の初期化処理
time = 1200 // 射出時間
interval = 60 // 射出間隔
angle = 360 / 10 * count / 60 // 射出角度
position = device.position //射出位置
size = 0.125 // 大きさ
power = 0.1 // 威力
if(count % 120 == 0){
attribute = ICE // 属性=氷
}
else{
attribute = WIND // 属性=風
}
speed = 0.1 // 速度
acceleration = 0 // 加速度
}
create_bullets(){
// 弾の生成処理
if(count < time && count % interval == 0){
// カウンターが射出時間(time)より小さい かつ
// カウンターが射出間隔(interval)に達した 場合
set_bullets() // ↓の弾の設定処理を呼び出す
// 以下に処理を追加
angle += 360 / 4 // 角度を90°足す
set_bullets() // ↓の弾の設定処理を呼び出す
angle += 360 / 4 // 角度を90°足す
set_bullets() // ↓の弾の設定処理を呼び出す
angle += 360 / 4 // 角度を90°足す
set_bullets() // ↓の弾の設定処理を呼び出す
angle += 360 / 4 // 角度を90°足す
}
}
set_bullets(){
// 弾の設定処理
bullet = new Bullet() // 新しい弾を生成
bullet.angle = angle // 射出角度
bullet.position = position //射出位置
bullet.size = size // 大きさ
bullet.power = power // 威力
bullet.attribute = attribute // 属性
bullet.sub_attribute = sub_attribute // 副属性
bullet.speed = speed // 速度
bullet.acceleration = acceleration // 加速度
bullets.add(bullet) // 新しい弾を追加する
}
・・・
}
////////////////////////////////////////////
ユキは恐る恐る試してみる。
「おぉーー!」
ユキは思わず、一人歓声をあげる。
魔法補助具……改め、魔法具は、ほぼほぼ期待通りの動きをしてくれた。
4つの弾が十字のように、四方向に発射され、
それが0.5秒刻みで、少しずつ角度を変えながら回転することで散水機のような動きが再現できたのである。
(お? しかも、なんかひんやり感が増している気がする……!? ちゃんとした検証が必要だけど……)
大きさ(size)を1/4にして、出力調整したにも関わらず、体感でも、冷感が増している感じがした。
〝見栄え〟がよくなったことによる成果であった。
と……
ユキは急に睡魔に襲われる。
(……流石にちょっと頑張りすぎたかな……でもまぁ、明日、休日でよかっ…………た…………)
寝落ちした。
=======
【あとがき】
ここまでお読みいただき有難うございます。
ちょっと難しくなってきたでしょうか(大丈夫でしょうか。。。)
この記事が気に入ったらサポートをしてみませんか?