第31話 メソッドの修正★

////////////////////////////////////////////


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にして、出力調整したにも関わらず、体感でも、冷感が増している感じがした。

〝見栄え〟がよくなったことによる成果であった。


 と……


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


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


 寝落ちした。



=======

【あとがき】

ここまでお読みいただき有難うございます。


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

  • Xで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る