「ゴブリンでもわかるゲームプログラミング」第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にして、出力調整したにも関わらず、体感でも、冷感が増している感じがした。
〝見栄え〟がよくなったことによる成果であった。

 と……

 ユキは急に睡魔に襲われる。

(……流石にちょっと頑張りすぎたかな……でもまぁ、明日、休日でよかっ…………た…………)

 寝落ちした。

=======
【あとがき】
ここまでお読みいただき有難うございます。

ちょっと難しくなってきたでしょうか(大丈夫でしょうか。。。)

#IT
#テクノロジー
#プログラミング
#プログラミング初心者
#プログラミング教育
#小説

この記事が気に入ったらサポートをしてみませんか?