投稿

回復システムの導入

イメージ
ゲーム内に回復システムを導入しました。マップ上に存在する回復アイテムを広い、それを使用することで体力が回復します。 ~今回の内容~  プレイヤーの隣にリンゴが落ちています。取ってみましょう。  リンゴの上に重なって...  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に代入しています。  このようにして以前表示されたマップの値を記憶し、連続で表示されないようにしています。 ゲームクリアの条件を設定する  このゲームはランダムに表示されるマップを攻略するコンセプトになっています。これでは無限にゲームが続いてしまい、終わりが見えなくなってしまいます。そのため、ゲームクリアの条件...

モンスターをプレイヤーに近づけるようにする

イメージ
  今回はモンスターがプレイヤーに近づいていくようにするプログラムを作成しました。 ~今回の内容~ 左側の蟻にご注目ください。この画面から下方向へボタンを押します。 プレイヤーは下に移動し、蟻は上に移動したのがわかります。またこの状態から下にプレイヤーを動かします。 プレイヤーが下に移動しました。そして蟻は右に移動していることがわかります。この状態から今度は右に何マスか移動させましょう。 プレイヤーが右に移動しています。ついでに蟻もプレイヤーに追随するように移動しているのがわかりますでしょうか。この状態からまた右に移動してみます。 今度はありだけではなく左下にいる犬もプレイヤーに近づいています。 今回はこのような動作をどのようにプログラムしたのか解説します。 ~プログラムの説明~ モンスターとプレイヤーの距離を把握する  今回の動作を実現するにあたり、モンスターがプレイヤーの座標を把握する必要があります。そのため、モンスターオブジェクトに新しくプロパティとメソッドを追加しています。下が追加したプログラムになります。 583行目にthis.dis、584行目にthis.xdis、585行目にthis.ydisを追加しました。  607~612行目にかけてthis.discalcメソッドを追加しています。  608行目ではthis.xdisにモンスターのx座標とプレイヤーのx座標の差を代入しています。  609行目ではthis.ydisにモンスターのy座標とプレイヤーのy座標の差を代入しています。  610行目でモンスターとプレイヤーがどのくらい離れているかを計算しています。この計算には2点間の距離を求める公式を使っています。  これらの処理を画像を使って解説します。 プレイヤーとモンスターが上記の位置関係にあるとします。この位置関係を三角形で表すと画像のように、底辺がxdis、高さがydis、斜辺がdisといったように表せます。2点間の距離を求める公式は √(x2-x1)^2+(y2-y2)^2となります。この式に上記の情報を当てはめることでモンスターとプレイヤーの距離を導くことができます。  まず、608行目のthis.xdis = (this.px - playerpx)はxdis = (3 - 1)がとなります。答えはxdis = 2になります。  60...

モンスターに攻撃できるようにする、ターン制度の作成

イメージ
 今回はモンスターに攻撃を行い、倒すプログラムを作成しました。また、今後のプログラムで敵も攻撃を仕掛けてくるようにしたいと考えているので、ターン数カウントの作成も行いました。 ~今回の内容~  横に黒玉ねぎがいます。弱そうなので倒しちゃいましょう。スペースボタンで攻撃です。    黒玉ねぎを倒しました。  画像のように敵に攻撃できるようになっています。攻撃が当たったら音が流れるようになっています。また、敵にはそれぞれ体力が設定してあって、敵の体力を0にすると画面上から消えて敵を倒したことになります。 ~プログラムの説明~ タイトルのプログラムを解説する前に追加した要素の説明を行いたいと思います。少しだけ関係はありますが、タイトルの部分だけ知りたいという方は飛ばしていただいてもかまいません。 追加要素の説明 まず、細々と追加した要素の説明をします。 グローバル変数に turn、turncount、Ecount、chp、cstmを追加しました。      turnは経過ターン数を数える変数、      turncountはターンが経過したことを判定するために使用する変数、      Ecountはマップ上に存在するモンスターの数を認識するための変数、      chpは主人公の体力の値を、cstmは主人公のおなかの値を格納します。 関数mapselectの中です。  198行目にEcountの値をリセットするプログラムを記述しています。このゲームではプレイヤーが正常な位置に配置されるようにマップをロードする際に何度も何度もマップを作成します。モンスターが出現するたびにEcountを増やすことによってマップ上のモンスターの数を認識しようとしています。そのため、何度もマップをロードする過程でモンスターも生まれるので、Ecountがたくさん増えてしまいます。このプログラムは適切なモンスター数を把握するために記述しています。  205行目ではchara変数にplayerオブジェクトのインスタンスを格納しています。インスタンスにchp(体力)、cstm(おなか)、10(攻撃力)、10(防御力)を追加しました。 見にくくてすみません... Enemy変数とそのインス...