投稿

1月, 2025の投稿を表示しています

回復システムの導入

イメージ
ゲーム内に回復システムを導入しました。マップ上に存在する回復アイテムを広い、それを使用することで体力が回復します。 ~今回の内容~  プレイヤーの隣にリンゴが落ちています。取ってみましょう。  リンゴの上に重なって...  spaceキーを押すことでリンゴをとることができます。  ゲームを進めていくうちに体力とおなかの値が少なくなってきました。このタイミングでリンゴを使ってみます。zボタンを押します。  リンゴを使用し、体力とおなかの値を回復することができました。体力値がまだ心もとないのでバナナを使います。xボタンを押します。  バナナを使用し、体力を回復することができました。  今回はこの一連の流れをプログラミングでどのように作成したのかを解説します。 ~プログラムの解説~  playerオブジェクトのmoveメソッドの一部です。moveメソッドではプレイヤーの操作に関するプログラムが書かれています。  上記プログラムはその中でプレイヤーがリンゴとバナナの上に重なった時の動きを記述しています。  566行目の条件式は「プレイヤーがリンゴの上にいるとき」を表しています。  567,568行目ではプレイヤーの移動先が壁でない場合にプレイヤーを移動させるようにします。  569~573行目はリンゴを取得するためのプログラムです。keycode32とはspaceキーのことを指し、spaceキーを押したときに取得するための処理が行われます。  570行目でアイテムを取得したことを表す効果音を鳴らします。  571行目でプレイヤーがいるマップ上の値を1に書き換えています。マップ上の値は1であれば地面のことを指し、4であればリンゴのことを指しています。この場合、プレイヤーがリンゴと重なっていた時、プレイヤーはマップ上の4の値と重なっています。spaceキーを押してアイテムを取得したことで、アイテムはマップ上から消えるため、地面だけが描画されます。この時、プレイヤーはマップ上の1の値と重なっていることになります。  572行目では変数ringoの値を1にしています。これにより、プレイヤーがリンゴを持っていることをゲームが認識することができます。  以上がリンゴを取得するためのプログラムです。575~582行目はバナナを取得するためのプログラムですが、リンゴを取得するためのプログラ...

経験値システムの導入

イメージ
 今回は経験値をためてキャラクターを強くしていくプログラムの解説です。 ~今回の内容~ 右下にいる犬を倒します。 すると、右下の経験値欄に36が加算されます。次に、右上のありを倒してみましょう。 アリを倒すとレベルアップすることができました。下のステータス欄のLv、体力の最大値、攻撃力、防御力の値が上がっていることが確認できます。また、経験値が0になり、次のレベルまでに必要な経験値の量も上がっています。 ~プログラムの解説~ このゲームシステムはプレイヤーのexp値がレベルアップ条件を満たした場合にレベルを上げ、ステータスを強化するという一連の流れを作ることにより実現することができました。 そのため、まずプレイヤーのステータスにexpとnextexpの初期値を設定する必要があります。 プレイヤーオブジェクトとプロパティです。 451行目のプレイヤーオブジェクトの第10、11引数にexp、nextexp、を加えました。 467、468行目には新しくexpプロパティ、nextexpプロパティを作成しました。モンスターを倒すたびにexpプロパティの値が加算されていき、nextexpプロパティの値にまで達したらレベルアップすることができます。 次にattackcheck関数を見ていきます。ここはプレイヤーがモンスターに対して攻撃を行った際に処理を行う関数です。主に956行目に変更を加えました。 956行目はモンスターを倒した際の処理です。今までは倒した時に効果音を鳴らすだけでしたが、新しくモンスターの経験値量をプレイヤーの経験値に加えるプログラムを追加しました。 プレイヤーオブジェクト内にexpcheckメソッドを追加しました。このプログラムが常に経験値を監視しており、次のレベルに必要な経験値にまで届いた場合にレベルアップの処理を行うことになっています。 515行目の条件分岐により、this.exp(現在の経験値)がthis.nextexp(次のレベルアップに必要な経験値)を超えた場合に一連のレベルアップ処理を行います。 516行目ではthis.Lvの値をインクリメントしています。これにより、ゲーム上に表示されるプレイヤーのレベルの値が1増えます。 517行目ではthis.expの値を0にしています。これにより、経験値の蓄積をリセットします。 518行目ではthis...

モンスターがプレイヤーに対して攻撃できるようにする

イメージ
 今回はモンスターがプレイヤーに対して攻撃できるようにするプログラムの解説です。 ~今回の内容~ 右上の蟻に対して攻撃します。スペースキーを押してみましょう。 攻撃が終わりました。蟻にダメージが入りました。それと同時にプレイヤーにもダメージが入っていることが左下の体力ゲージが減っていることがわかると思います。 今回はこのプログラムを解説します。 ~プログラムの説明~ 参考にしたゲームではモンスターがプレイヤーと隣同士の位置関係になった時、ターン性のバトルが発生するゲームシステムになっています。本来はそのようなシステムを再現したかったのですが、技術的に難しく、簡易的なバトルシステムに変更しました。 当ゲームのバトルシステムは「モンスターがプレイヤーの隣にいる時、プレイヤーに対して攻撃を行う」というシステムにしました。 このシステムをプログラムでどう表したのかを説明していきたいと思います。 モンスターオブジェクトのmoveメソッドの一部です。835行目のif分はモンスターがプレイヤーに対して隣同士であるときに実行されます。 836行目でモンスターの距離を計算しています。 837行目でattackプロパティの値をtrueにしています。この時、モンスターがプレイヤーの隣にいることをコンピュータが認識したことで、モンスターが攻撃を行えるようにしています。 840行目はモンスターが隣にいないときのプログラムです。this.attackをfalseとし、モンスターがプレイヤーに対して攻撃できないようにしています。 monsterturn関数です。978~981行目にmonsterattackを実行する条件式を追加しました。978行目の条件は「ボスが出現しているかつ、ボスがプレイヤーの隣におり、攻撃できるとき」です。下3つも同じものになっています。この時、monsterattack関数が実行されます。この時実行しているmonsterattack関数は第一引数で指定されたモンスターが第二引数で指定されたプレイヤーと隣同士の位置関係であるか否かをチェックしています。monsterattack関数を見ていきましょう。 985行目からmonsteraatack関数です。モンスターがプレイヤーに対して隣にいるかどうかをチェックし、隣にいるならばプレイヤーに対して攻撃を行うよう処理を行...

ゲームシステムの調整

イメージ
 おひさしぶりです。ひらひさです。現在プレイヤーと敵モンスターのターン性バトルを実現するためにプログラムを考えています。いまだ程遠い段階なのですが、考えている途中で新しい要素を加えたり、細かいゲームシステムを調整しました。今回はそれらの動作とプログラムの解説を行いたいと思います。 今回解説するプログラム目次 連続で同じマップを表示させないようにする ゲームクリアの条件を設定する ゲームクリア、ゲームオーバー画面の作成 連続で同じマップを表示させないようにする  現在制作しているゲームはランダムでマップを表示させてマップをクリアしていくというコンセプトで作成しております。しかし、開発段階でゲームを進めていると同じマップが選ばれてしまう現象が多々発生しています。現在用意しているマップが少ないことも原因であると考えられますが、マップが多くなっても同様の事例が発生することを考えますと、前回表示したマップを表示させないようなゲームシステムにするのが良いと考えました。  上はマップをランダムに選ぶ際に該当条件に当たった場合に再度マップをランダムに選ぶという条件文です。この中に Stage == behindstage1 という条件を追加しました。behindstage1にはひとつ前に表示されたマップの値が格納されています。つまり、現在選んだステージがひとつ前に表示されたマップの値と同じ場合、再度マップを選択しなおすようにしています。stage == behindstage2 は二つ前に表示されたマップの値を格納しています。  上はマップ移動時に動作させるプログラムです。 469行目では変数behindstage1にstageの値を代入しています。これにより、一つ前のマップの値をbehindstage1に代入することができます。 470行目では変数behindstage2にbehindstage1の値を代入しています。これにより、二つ前のマップの値をbehindstage2に代入しています。  このようにして以前表示されたマップの値を記憶し、連続で表示されないようにしています。 ゲームクリアの条件を設定する  このゲームはランダムに表示されるマップを攻略するコンセプトになっています。これでは無限にゲームが続いてしまい、終わりが見えなくなってしまいます。そのため、ゲームクリアの条件...