風の迷路

移転先:http://fermiumbay13.hatenablog.com/ ここはヤフーブログ終了に伴い12/15閉鎖します

│├アクションゲームの基礎

[ リスト | 詳細 ]

フィールド上の敵を、技を使って倒すゲームの基礎の作り方です。
こんなものに著作権など存在しません。作成された機能はご自由にお使い下さい。

全7回で基礎編が終了します。後は応用編がいくつかくっついてる感じです。
ただ、行き当たりばったりで書いているので良くない点もいくつかあります。
もしかしたら書き直すかもしれませんが、気が向いたらということにしときます。
第1回
要約
記事検索
検索

全4ページ

[1] [2] [3] [4]

[ 次のページ ]

(2019/8/2追記)
本記事の内容は新ブログに転載済みです:
https://fermiumbay13.hatenablog.com/entry/2019/03/31/171834

サンシャインペンギンさんからのご依頼です。
ゲージのイベントを利用して、ダッシュゲージのサンプルを作りました。
Escを押しっぱなしにするとダッシュし、離すとダッシュをやめます。
押しっぱなしにしているとゲージが減っていって、0になるとダッシュできなくなります。
その一例です。適宜改造しちゃってください^^

初期設定として、変数の操作でまず、
「ため量」を48(MAXの値)に設定するようにしてください。
コモンイベント「ゲージ移動」はこちらのものと同じです。

◆キー入力の処理:[0001:キー入力:値](入力許可はEscのみ、ウェイトなし)
◆条件分岐:変数[0001:キー入力:値]が6
 ◆条件分岐:変数[0013:ため量]が0以下
  ◆条件分岐:スイッチ[0020:スピードアップ中]がON
   ◆キャラクターの動作指定:主人公,移動速度アップ,移動速度アップ,移動速度アップ,移動速度アップ,移動速度アップ,移動速度ダウン,移動速度ダウン
   ◆スイッチの操作:[0020:スピードアップ中]をOFFにする
   ◆
  :分岐終了
  ◆
 :それ以外の場合
  ◆条件分岐:スイッチ[0020:スピードアップ中]がOFF
   ◆キャラクターの動作指定:主人公,移動速度アップ,移動速度アップ,移動速度アップ,移動速度アップ,移動速度アップ,移動速度ダウン
   ◆スイッチの操作:[0020:スピードアップ中]をONにする
   ◆
  :分岐終了
  ◆変数の操作:[0013:ため量]減算,1
  ◆イベントの呼び出し:ゲージ移動
  ◆
 :分岐終了
 ◆
:それ以外の場合
 ◆条件分岐:スイッチ[0020:スピードアップ中]がON
  ◆キャラクターの動作指定:主人公,移動速度アップ,移動速度アップ,移動速度アップ,移動速度アップ,移動速度アップ,移動速度ダウン,移動速度ダウン
  ◆スイッチの操作:[0020:スピードアップ中]をOFFにする
  ◆
 :分岐終了
 ◆条件分岐:変数[0013:ため量]が48より小さい
  ◆変数の操作:[0013:ため量]加算,1
  ◆
 :分岐終了
 ◆イベントの呼び出し:ゲージ移動
 ◆
:分岐終了
◆

スピードアップ中ならONになるスイッチを利用します。
押している間、ゲージが残っていればスピードアップするので、スピードアップ中をONにして速度アップします。
それとともにゲージを減らしていき、0になってしまうとスピードアップ中ならやめるようにします。
また、Escを離すとスピードアップ中ならOFFになるようにし、ゲージを増やすようにしています。

7月17日追記
ダッシュボタンを連打すると移動速度がずれてしまうことがありましたので、
移動速度のアップダウンの処理を変更しました。
主人公がどんな速度であっても「移動速度アップ」を5回行うと「4倍速」になることを利用しています。
「移動速度アップ」を5回入れた後に、
「標準速」にする場合は「移動速度ダウン」を2回、
「2倍速」にする場合は「移動速度ダウン」を1回入れています。
(2019/8/2追記)
本記事の内容は新ブログに転載済みです:
https://fermiumbay13.hatenablog.com/entry/2019/03/30/105246

敵が鉄球をぐるぐる回してくる処理を作ってみます。
めんどくさいので、鉄球の棒部分に当たり判定はなく、丸い鉄球部分のみ当たり判定があるようにしましょう。
この項は数学をいろいろ使いますので、説明を飛ばすのもありです。

イメージ 1

↑「鉄球.png」
回転させるので、縦の半分より上に鉄球があります。

イメージ 2

ピクチャーの表示では「回転描画」というものが設定できますが、
どれぐらいの角速度で回転するかというのが分かりません。
そこで、各速度で5分ぐらいずつ回してその回転数を計り、角速度の式を推測しました。
回転速度Sとすると、角速度ωは次のように表せるようです。

 ω=πS/128[rad/f]

RPGツクールにおける、ゲーム上の時間の最小単位は1/60[秒]とし、これを1[f](フレーム)とします。
1フレームにつき、πS/128ラジアン回ると考えました。
根拠は特に……どうせ、何とか分のπラジアンになるだろうと思い、実験で得られた結果から
分母が128(2の7乗)に近かったので、そうしましたが、
この角速度で実際にピクチャーを三角関数で回転させてみると
回転描画のピクチャーとぴったり重なったので、おそらく正しいでしょう^^

イメージ 3

まず、これを六十分法に改めます。π[rad]=180[°]ですので、
ω=180S/128[°/f]=45S/32[°/f] となり、この式を使います。

イメージ 4

↑(tx,ty)は敵の座標、(ax,ay)は鉄球の座標、(hx,hy)は主人公の座標です。
素材では、
棒から鉄球の中心までの距離R=64[dot]
鉄球の半径r=16[dot]
としています。
また、主人公の当たり判定半径rh=8[dot]としておき、鉄球の回転角度をθとしておきます。
鉄球の中心から主人公の中心までの距離Hがr+rh未満になったとき、
主人公の当たり判定が鉄球に当たることになるので、ダメージを受けることになります。

三平方の定理より、

イメージ 5

が成り立つとき、主人公は鉄球に当たっています。
一方、鉄球の座標(ax,ay)は次のように表せます。図から分かることでしょう。

イメージ 6

よって、これをさっきの式に入れれば、

イメージ 7

が得られます。左辺を計算して、右辺より小さいかどうか判断させればいいわけです。



変数は、
150番「鉄球:X」
151番「鉄球:Y」
152番「鉄球:経過時間」
153番「鉄球:角度」
154番「鉄球:当たり判定X」
155番「鉄球:当たり判定Y」
156番「鉄球:ダメージ時間」
157番「正弦関数:角度」
158番「正弦関数:結果」
159番「正弦関数:一時」
160番「正弦関数:結果係数」
を使っています。
三角関数の計算は空冥の幻影に載せていますので、それを利用してください。
変数の番号は変えても問題ありません。(正弦関数
 代替ページができたのでリンク先を変えました(2015年8月16日記)
 現在はリンク先を残していますが、代替ページを作成したら消去します(2014年2月26日記)

◆ウェイト:2.0秒
◆条件分岐:変数[0022]が999999以外
 ◆効果音の演奏:大地2
 ◆変数の操作:[0150:鉄球:X]代入,EV0002の画面X
 ◆変数の操作:[0151:鉄球:Y]代入,EV0002の画面Y
 ◆変数の操作:[0151:鉄球:Y]減算,8
 ◆変数の操作:[0152〜0153]代入,0
 ◆ピクチャーの表示:10,鉄球,(V[0150],V[0151])【透明色あり、回転速度5】
 ◆繰り返し処理
  ◆変数の操作:[0150:鉄球:X]代入,EV0002の画面X
  ◆変数の操作:[0151:鉄球:Y]代入,EV0002の画面Y
  ◆変数の操作:[0151:鉄球:Y]減算,8
  ◆ピクチャーの移動:10,(V[0150],V[0151]),0.0秒【ウェイトなし、透明色あり、回転速度5】
  ◆条件分岐:変数[0156:鉄球:ダメージ時間]が0
   ◆変数の操作:[0153:鉄球:角度]代入,変数[0152]の値
   ◆変数の操作:[0153:鉄球:角度]乗算,225
   ◆変数の操作:[0153:鉄球:角度]除算,32
   ◆変数の操作:[0157:正弦関数:角度]代入,変数[0153]の値
   ◆イベントの呼び出し:正弦関数拡張版
   ◆変数の操作:[0158:正弦関数:結果]乗算,64
   ◆変数の操作:[0158:正弦関数:結果]除算,100
   ◆変数の操作:[0154:鉄球:当たり判定X]代入,EV0002の画面X
   ◆変数の操作:[0154:鉄球:当たり判定X]加算,変数[0158]の値
   ◆変数の操作:[0154:鉄球:当たり判定X]減算,主人公の画面X
   ◆変数の操作:[0154:鉄球:当たり判定X]乗算,変数[0154]の値
   ◆変数の操作:[0157:正弦関数:角度]代入,変数[0153]の値
   ◆変数の操作:[0157:正弦関数:角度]加算,90
   ◆イベントの呼び出し:正弦関数拡張版
   ◆変数の操作:[0158:正弦関数:結果]乗算,64
   ◆変数の操作:[0158:正弦関数:結果]除算,100
   ◆変数の操作:[0155:鉄球:当たり判定Y]代入,EV0002の画面Y
   ◆変数の操作:[0155:鉄球:当たり判定Y]減算,変数[0158]の値
   ◆変数の操作:[0155:鉄球:当たり判定Y]減算,主人公の画面Y
   ◆変数の操作:[0155:鉄球:当たり判定Y]乗算,変数[0155]の値
   ◆変数の操作:[0154:鉄球:当たり判定X]加算,変数[0155]の値
   ◆条件分岐:変数[0154:鉄球:当たり判定X]が576より小さい
    ◆変数の操作:[0156:鉄球:ダメージ時間]代入,30
    ◆効果音の演奏:しびれ2
    ◆キャラクターのフラッシュ:主人公,0.5秒(赤31緑0青0強さ31、ウェイトなし)
    ◆キャラクターの動作指定:主人公,ジャンプ開始,180度方向転換,一歩前進,ジャンプ終了
    ◆HPの増減:メンバー全員のHPを5減らす
    ◆
   :分岐終了
   ◆
  :分岐終了
  ◆変数の操作:[0152:鉄球:経過時間]加算,1
  ◆条件分岐:変数[0156:鉄球:ダメージ時間]が0より大きい
   ◆変数の操作[0156:鉄球:ダメージ時間]減算,1
   ◆
  :分岐終了
  ◆ウェイト:0.0秒
  ◆条件分岐:変数[0152:鉄球:経過時間]が150以上
   ◆繰り返し処理の中断
   ◆
  :分岐終了
  ◆
 :以上繰り返し
 ◆ピクチャーの消去:10
 ◆
:分岐終了
◆
  

2秒おきに、敵2番(ダメージ量は変数22番に管理)が鉄球を放ってきます。
鉄球の座標は敵2番の画面座標から出します。
ただし、キャラクターから得られる画面Yは足元の座標になりますので、
中心に合わせるために画面Yだけ8減算したものを入れます。
鉄球を放ってからの経過時間と鉄球の回転角度を0にし、鉄球を表示させます。
ここでは、回転速度を5としています。

鉄球を表示したら、2.5秒間鉄球が回ります。
繰り返し処理を入れ、常に鉄球の座標を取得して表示(ピクチャーの移動)するようにします。
鉄球によるダメージを連続で受けないように、
変数「鉄球:ダメージ時間」というものを用意します。
ここでは0.5秒間はダメージを受けないようにしたいので、
鉄球に当たったら30(フレーム)を代入し、1/60秒ごとに1ずつ減らします。
これが0になっていないと、鉄球によるダメージ処理は行わないようにします。

鉄球のダメージ処理では、まず鉄球の角度を取得します。
θ=ωt  ω=45S/32[°/f]
ですので、経過時間を代入し、角速度を掛け算します。
回転速度5にしているので、ω=225/32[°/f]となりますから、
経過時間を225倍して32で割ったものを角度に代入します。
回転速度を変えるときは、ピクチャーの表示と移動のほか、ここの数値だけ変えればOKです。

次に、当たり判定の不等式の左辺を計算します。
sinθを計算するため、θを使って「正弦関数拡張版」を呼び出し、「結果」に計算結果の100倍を代入します。
(例:sin30°=0.5 なので、「結果」には50が代入される)
これを、R倍すれば良いのですから、R=64より、64を掛けます。
sinの計算結果は実際の値の100倍なので、更にこれを100で割ります。
これでRsinθが計算できました。
これに敵の画面Xを足し、主人公の画面Xを引いて2乗すれば、X成分は終わりです。
Y成分ではRcosθを計算します。
cosθ=sin(θ+90°)なので、角度に90足したものを「正弦関数拡張版」に入れれば良いです。
同様に式通り足し算引き算します。画面Yは前述通り足元の座標なので、中心にするために8引きます。

X成分+Y成分で左辺の式になります。これを「当たり判定X」に代入します。
右辺の値は(r+rh)^2=(16+8)^2=576になるので、
当たり判定Xにいま代入された値が576より小さいとダメージです。
ダメージの処理を入れ、ダメージ時間を30に設定します。

ダメージ時間は0より大きいとき1ずつ減算します。
経過時間は1/60秒おきに1ずつ加算されるため、0.0秒ウェイトの所に入れています。
経過時間が2.5秒=150フレーム以上になれば終わりなので、
繰り返し中断して鉄球のピクチャーを消去すればおしまいです。
(2019/8/2追記)
本記事の内容は新ブログに転載済みです:
https://fermiumbay13.hatenablog.com/entry/2019/03/30/102503

敵が複数の攻撃を使ってくる場合は、
行動パターンを組み込んでそれぞれの技を発動させれば良いです。
どんな行動パターンにするかは作者さん次第。
ランダムに色々攻撃してきたり、交互にしてきたり、HPが減ると新しい技を使ってきたり……

ここでは、ランダムにビームのどちらかを定期的に放ってくるようにしてみます。



イベント「炎+ビーム」(1ページ目、マップイベント、開始条件:定期的に並列処理する)

◆ウェイト:2.0秒
◆条件分岐:変数[0022]が999999以外
 ◇変数の操作:[0149:敵:行動パターン]代入,乱数[0〜1]
 ◇条件分岐:変数[0149:敵:行動パターン]が0
  ◆変数の操作:[0141:敵:炎x]代入,EV0002のX座標
  ◆変数の操作:[0142:敵:炎y]代入,EV0002のY座標
  ◆変数の操作:[0145:敵:炎向き]代入,EV0002の向き
  ◆条件分岐:変数[0145:敵:炎向き]が2
    ◆変数の操作:[0142:敵:炎y]加算,1
   ◆
  :分岐終了
  ◆条件分岐:変数[0145:敵:炎向き]が4
    ◆変数の操作:[0142:敵:炎x]減算,1
   ◆
  :分岐終了
  ◆条件分岐:変数[0145:敵:炎向き]が6
    ◆変数の操作:[0142:敵:炎x]加算,1
   ◆
  :分岐終了
  ◆条件分岐:変数[0145:敵:炎向き]が8
    ◆変数の操作:[0142:敵:炎y]減算,1
   ◆
  :分岐終了
  ◆変数の操作:[0143:敵:炎元x]代入,変数[0141]の値
  ◆変数の操作:[0144:敵:炎元y]代入,変数[0142]の値
  ◆効果音の演奏:炎2
  ◆イベントの位置を設定:炎,(V[0141],V[0142])
  ◆スイッチの操作:[0021:敵:炎出す]をONにする
  ◆
 :分岐終了
 ◇条件分岐:変数[0149:敵:行動パターン]が1
  ◆スイッチの操作:[0009:敵:ビーム発射]をONにする
  ◆効果音の演奏:アップ
  ◆キャラクターのフラッシュ:EV0002,1.0秒(W)(全部31)
  ◆変数の操作:[0018:敵:ビームx]代入,EV0002のX座標
  ◆変数の操作:[0019:敵:ビームy]代入,EV0002のY座標
  ◆変数の操作:[0020:敵:ビーム向き]代入,EV0002の向き
  ◆変数の操作:[0146:敵:ビーム残りマス数]代入,20
  ◆条件分岐:変数[0020:敵:ビーム向き]が2
   ◆戦闘アニメの表示:ビーム↓,EV0002(ウェイトなし)
   ◆
  :分岐終了
  ◆条件分岐:変数[0020:敵:ビーム向き]が4
   ◆戦闘アニメの表示:ビーム←,EV0002(ウェイトなし)
   ◆
  :分岐終了
  ◆条件分岐:変数[0020:敵:ビーム向き]が6
   ◆戦闘アニメの表示:ビーム→,EV0002(ウェイトなし)
   ◆
  :分岐終了
  ◆条件分岐:変数[0020:敵:ビーム向き]が8
   ◆戦闘アニメの表示:ビーム↑,EV0002(ウェイトなし)
   ◆
  :分岐終了
  ◆繰り返し処理
   ◆条件分岐:変数[0020:敵:ビーム向き]が2
    ◆変数の操作:[0019:敵:ビームy]加算,1
    ◆
   :分岐終了
   ◆条件分岐:変数[0020:敵:ビーム向き]が4
    ◆変数の操作:[0019:敵:ビームx]減算,1
    ◆
   :分岐終了
   ◆条件分岐:変数[0020:敵:ビーム向き]が6
    ◆変数の操作:[0019:敵:ビームx]加算,1
    ◆
   :分岐終了
   ◆条件分岐:変数[0020:敵:ビーム向き]が8
    ◆変数の操作:[0019:敵:ビームy]減算,1
    ◆
   :分岐終了
   ◆指定位置の地形ID取得:(V[0018],V[0019]),[0017:地形ID]
   ◆条件分岐:変数[0017:地形ID]が1以外
    ◆繰り返し処理の中断
    ◆
   :分岐終了
   ◆現在の場所を記憶:[0147],[0147],[0148]
   ◆条件分岐:変数[0018:敵:ビームx]がV[0147]と同値
    ◆条件分岐:変数[0019:敵:ビームy]がV[0148]と同値
     ◆効果音の演奏:しびれ2
     ◆キャラクターのフラッシュ:主人公,0.5秒(赤31緑0青0強さ31、ウェイトなし)
     ◆キャラクターの動作指定:主人公,ジャンプ開始,180度方向転換,一歩前進,ジャンプ終了
     ◆HPの増減:メンバー全員のHPを5減らす
     ◆繰り返し処理の中断
     ◆
    :分岐終了
    ◆
   :分岐終了
   ◆変数の操作:[0146:敵:ビーム残りマス数]減算,1
   ◆条件分岐:変数[0146:敵:ビーム残りマス数]が0以下
    ◆繰り返し処理の中断
    ◆
   :分岐終了
   ◆
  :以上繰り返し
  ◆スイッチの操作:[0009:敵:ビーム発射]をOFFにする
  ◆
 :分岐終了
 ◆
:分岐終了
◆

2ページ目は炎の発射の所で紹介しているものと
完全に同じなので、コピーしてください。

とっても長いように見えますが、炎とビームの処理をコピーしてきて
↑◇の所(3つしかないね)を追加しただけです。すでにどちらの処理も出来ているなら、一瞬で作れるでしょう。


2秒間隔でどちらかの攻撃を放ってきます。
敵が生きていると変数149番「敵:攻撃パターン」に乱数0〜1を代入し、
0だったら炎の処理、1だったらビームの処理を行わせるようにしています。

乱数とはランダムな数のことです。
0〜1の乱数を発生させるということは、0または1のどちらかの値が代入されるということです。
0〜100とかすれば、0〜100までの101個の数からどれか選ばれることになります。
0〜1の乱数を発生させる場合は0になる場合と1になる場合が同確率ですので、
炎とビームがどちらも同じ確率(50%)で発生することになります。

炎の頻度の方が多くしたい場合は例えば乱数を0〜4にして、
0〜2のときは炎、3〜4のときはビーム、という風にすると、
炎の方が多くでることになります。炎の確率が60%、ビームの確率が40%になりますね。
設定するときは、

条件分岐:2以下{
 炎の処理
}
条件分岐:3以上{
 ビームの処理
}

とすればいいですね。
3つ以上技があって、技Aが20%、技Bが50%、技Cが30%としたい場合は、
0〜9の乱数を発生させ、

条件分岐:1以下{
 技Aの処理
}
条件分岐:2以上{
 条件分岐:6以下{
  技Bの処理
 }
}
条件分岐:7以上{
 技Cの処理
}

と設定すればいいことになります。だいじょうううぶですね。
更に敵の残りHPによって分けたい場合も同じように作れます。
例えばはじめ、技Aが30%、技Bが70%であったものが、
敵ダメージ量が5以上になると技Aが30%、技Bが30%、技Cが40%としたい場合、
0〜9の乱数を発生させて、

条件分岐:行動パターン2以下{
 技Aの処理
}
条件分岐:行動パターン3以上{
 条件分岐:行動パターン5以下{
  技Bの処理
 }
}
条件分岐:行動パターン6以上{
 条件分岐:敵ダメージ量5以上{
  技Cの処理
 }
 それ以外の場合{
  技Bの処理
 }
}

みたいにすればいいですね。
0〜2のとき技A、敵ダメージ量が5未満のときは3〜9のとき技B、
敵ダメージ量が5以上のときは3〜5のとき技B、6〜9のとき技Cになっています。

確率分布そのものを変えたい場合は、発生させる乱数も場合分けさせれば良いでしょう。
(2019/8/2追記)
本記事の内容は新ブログに転載済みです:
https://fermiumbay13.hatenablog.com/entry/2019/03/30/000353

敵が2秒おきにビームを放ってくるようにします。
ビームは前回主人公が使えるようになったビームと同じものとします。
基本的に、敵が炎を放ってくる処理の使い回しをします。


イベント「ビーム発射」(マップイベント、開始条件:定期的に並列処理する)

◆ウェイト:2.0秒
◆条件分岐:変数[0022]が999999以外
 ◆スイッチの操作:[0009:敵:ビーム発射]をONにする
 ◆効果音の演奏:アップ
 ◆キャラクターのフラッシュ:EV0002,1.0秒(W)(全部31)
 ◆変数の操作:[0018:敵:ビームx]代入,EV0002のX座標
 ◆変数の操作:[0019:敵:ビームy]代入,EV0002のY座標
 ◆変数の操作:[0020:敵:ビーム向き]代入,EV0002の向き
 ◆変数の操作:[0146:敵:ビーム残りマス数]代入,20
 ◆条件分岐:変数[0020:敵:ビーム向き]が2
  ◆戦闘アニメの表示:ビーム↓,EV0002(ウェイトなし)
  ◆
 :分岐終了
 ◆条件分岐:変数[0020:敵:ビーム向き]が4
  ◆戦闘アニメの表示:ビーム←,EV0002(ウェイトなし)
  ◆
 :分岐終了
 ◆条件分岐:変数[0020:敵:ビーム向き]が6
  ◆戦闘アニメの表示:ビーム→,EV0002(ウェイトなし)
  ◆
 :分岐終了
 ◆条件分岐:変数[0020:敵:ビーム向き]が8
  ◆戦闘アニメの表示:ビーム↑,EV0002(ウェイトなし)
  ◆
 :分岐終了
 ◆繰り返し処理
  ◆条件分岐:変数[0020:敵:ビーム向き]が2
   ◆変数の操作:[0019:敵:ビームy]加算,1
   ◆
  :分岐終了
  ◆条件分岐:変数[0020:敵:ビーム向き]が4
   ◆変数の操作:[0019:敵:ビームx]減算,1
   ◆
  :分岐終了
  ◆条件分岐:変数[0020:敵:ビーム向き]が6
   ◆変数の操作:[0019:敵:ビームx]加算,1
   ◆
  :分岐終了
  ◆条件分岐:変数[0020:敵:ビーム向き]が8
   ◆変数の操作:[0019:敵:ビームy]減算,1
   ◆
  :分岐終了
  ◆指定位置の地形ID取得:(V[0018],V[0019]),[0017:地形ID]
  ◆条件分岐:変数[0017:地形ID]が1以外
   ◆繰り返し処理の中断
   ◆
  :分岐終了
  ◆現在の場所を記憶:[0147],[0147],[0148]
  ◆条件分岐:変数[0018:敵:ビームx]がV[0147]と同値
   ◆条件分岐:変数[0019:敵:ビームy]がV[0148]と同値
    ◆効果音の演奏:しびれ2
    ◆キャラクターのフラッシュ:主人公,0.5秒(赤31緑0青0強さ31、ウェイトなし)
    ◆キャラクターの動作指定:主人公,ジャンプ開始,180度方向転換,一歩前進,ジャンプ終了
    ◆HPの増減:メンバー全員のHPを5減らす
    ◆繰り返し処理の中断
    ◆
   :分岐終了
   ◆
  :分岐終了
  ◆変数の操作:[0146:敵:ビーム残りマス数]減算,1
  ◆条件分岐:変数[0146:敵:ビーム残りマス数]が0以下
   ◆繰り返し処理の中断
   ◆
  :分岐終了
  ◆
 :以上繰り返し
 ◆スイッチの操作:[0009:敵:ビーム発射]をOFFにする
 ◆
:分岐終了
◆

敵2番(ダメージ量は変数22番が管理)がビームを放つこととします。
長いけど半分以上前回と同じスタイルです。ほとんど変数を変えただけ。
変数18番、19番、20番がそれぞれ敵2番のX座標、Y座標、向きで、
変数146番がビームの残り進み歩数、
変数147番、148番はそれぞれ「主人公:x」「主人公:y」という主人公座標の変数です。
地形IDを取得するための変数は前回同様変数17番に入れています。

まず2秒のウェイトを入れ、敵2番が生きていたら(ダメージ量が999999でなければ)、
ビーム発射の処理を行います。スイッチ9番「敵:ビーム発射」をONにします。
このスイッチがONになっている間は敵が停止するようにします。チャージのためです。
敵2番の4ページ目をコピーして5ページ目を作り、
出現条件を「敵:ビーム発射」がON、移動タイプを移動しないに変更してください。
他はいじらなくて良いです。これで、ビームのチャージ中は5ページ目になり、移動しなくなります。

1秒間経ったあと、ビーム発射の処理が始まります。
ビーム発射中主人公を動けなくする場合は、ここで新たにスイッチを作ってONにし、
そのスイッチを条件に2ページ目を作ってそこにビームの処理を作ると良いでしょう。
開始条件を自動的に始まるにすることで、主人公を動けなくさせます。

敵の座標、向きを変数に入れたら、前回主人公が撃ったビームの処理をそのまま使い回します。
変数の番号や、戦闘アニメの表示キャラなどを変え忘れないように注意しましょう。
しかし、主人公も戦闘アニメの表示を行う攻撃が出来る場合は、
ビーム発射中に主人公が攻撃することで戦闘アニメが消えてしまう可能性がありますので、
出来れば敵の攻撃は戦闘アニメにしない方が良いと思います。

ビームを貫通させないため、地形が1番(草原)以外だと中断するのも同じです。
その後、主人公がビームに当たっているかを判定するため、
主人公の現在座標を変数に入れ、ビームの座標と等しいか調べます。
もし等しければ、主人公にダメージを与えてビームの処理を中断します。
主人公が放つビームと異なるところはこれぐらいです。

最後に「敵:ビーム発射」をOFFすることで、敵が再び動き出します。
(2019/8/2追記)
本記事の内容は新ブログに転載済みです:
https://fermiumbay13.hatenablog.com/entry/2019/03/29/235826

ビームを放ってみましょう。向いている方向の直線上にいる敵にダメージを与えます。
Escを押すと放てるようにしてみますねぇ。

コモンイベント「キー入力(ビーム)」(定期的に並列処理する、「キー入力受付」がON)

◆キー入力の処理:[0001:キー入力:値](6のみチェック、キーが押されるまで待つON
◆現在の場所を記憶:[0006],[0004],[0005]
◆変数の操作:[0006:向き]代入,主人公の向き
◆スイッチの操作:[0010:ビーム]をONにする
◆スイッチの操作:[0005:キー入力受付]をOFFにする)
◆

剣とほぼ同じです。技の内容とキーが違うだけですから……
Escを押すとビームを放つことを意味するスイッチがONになり、キー入力受付がOFFになります。


ビームは画面をはみ出してずっと向こうの敵にも攻撃することが可能ですが、
ここでは向いている方向20マスまでを限界とします。
画面内にいる敵のみビーム有効、とすることも可能ですが、ここでは省略します。
20マス同時に判定するので、コモンイベント「ダメージを与える処理」にある2つの
◆条件分岐:変数[0010:敵番号]が108より大きい
108を、それぞれ120に増やしてください。それだけです。


イベント「技」新規ページ(出現条件:「ビーム」がON  開始条件:定期的に並列処理する)

◆変数の操作:[0012:ダメージ]代入,3
◆変数の操作:[0101〜0120]代入,0
◆変数の操作:[0010:敵番号]代入,101
◆指定動作の全解除
◆変数の操作:[0016:ビーム進む残りマス数]代入,20
◆条件分岐:変数[0006:向き]が2
 ◆戦闘アニメの表示:ビーム↓,主人公
 ◆
:分岐終了
◆条件分岐:変数[0006:向き]が4
 ◆戦闘アニメの表示:ビーム←,主人公
 ◆
:分岐終了
◆条件分岐:変数[0006:向き]が6
 ◆戦闘アニメの表示:ビーム→,主人公
 ◆
:分岐終了
◆条件分岐:変数[0006:向き]が8
 ◆戦闘アニメの表示:ビーム↑,主人公
 ◆
:分岐終了
◆繰り返し処理
 ◆条件分岐:変数[0006:向き]が2
  ◆変数の操作:[0005:攻撃y]加算,1
  ◆
 :分岐終了
 ◆条件分岐:変数[0006:向き]が4
  ◆変数の操作:[0005:攻撃x]減算,1
  ◆
 :分岐終了
 ◆条件分岐:変数[0006:向き]が6
  ◆変数の操作:[0005:攻撃x]加算,1
  ◆
 :分岐終了
 ◆条件分岐:変数[0006:向き]が8
  ◆変数の操作:[0005:攻撃y]減算,1
  ◆
 :分岐終了
 ◆イベントの呼び出し:このイベント[1]
 ◆変数の操作:[0016:ビーム進む残りマス数]減算,1
 ◆条件分岐:変数[0016:ビーム進む残りマス数]が0以下
  ◆繰り返し処理の中断
  ◆
 :分岐終了
 ◆
:以上繰り返し
◆指定動作の全実行
◆イベントの呼び出し:ダメージを与える処理
◆スイッチの操作:[0005:キー入力受付]をONにする
◆スイッチの操作:[0010:ビーム]をOFFにする
◆

長いけど……難しいことはしていませんよねぇ。
初めの数行は定型です。ダメージは今回は3にしましたので、スライムは一発で死にます。
戦闘アニメはなんでもいいです。ウェイトも入れても入れなくても……
定期的に並列処理でウェイトを入れると、歩きながら戦闘アニメが表示され、それが終わった瞬間にダメージ判定が始まります。
それを防ぎたい場合は、自動的に始まるにすると良いでしょう。

原理は、変数「ビーム進む残りマス数」に初め20を代入し、
1マス進んで対象者探しするごとにそれを1減算していき、0以下になるまで繰り返すというものです。
向いている方向へ、攻撃x、攻撃yが加減し、
1マス進むごとに1ページ目を呼び出して、対象者探しを行います。
これを20マス繰り返したら終了というわけです。

ただ、これではビームはすべての壁を貫通してしまうので、
それでも良い場合はこれで完成ですが、壁は貫通しないようにしたい場合、
地形を利用することで実現できます。


地形とは、データベースの欄にある通り、草原や森など
それぞれのマップチップ固有で決められているものとなっています。
普通は敵とエンカウントしたときに、地形によって背景が変わるというのを実現したり、
森に入って足元が透けて表示するようにしたりすることに用いるものです。
イベント命令には指定位置の地形IDを取得するものがありますから、
壁となるマップチップの地形を例えば「壁」という地形にするなどして、
対象者探しを行っているときにその地形IDに当たったら攻撃を強制終了する、とすればOKです。

ここでは初めからある地形ID1番の「草原」でない地形に当たった場合
対象者探しを中断する、というシステムにしてみます。

イメージ 1

試しに海を置きました。海は「草原」ではないので、ビームは海を越えることはできません。

   …
   …

 ◆条件分岐:変数[0006:向き]が8
  ◆変数の操作:[0005:攻撃y]減算,1
  ◆
 :分岐終了
 ◇指定位置の地形ID取得:(V[0004],V[0005]),[0017:地形ID]
 ◇条件分岐:変数[0017:地形ID]が1以外
  ◇繰り返し処理の中断
  ◇
 :分岐終了
 ◆イベントの呼び出し:このイベント[1]
 ◆変数の操作:[0016:ビーム進む残りマス数]減算,1
 ◆条件分岐:変数[0016:ビーム進む残りマス数]が0以下
  ◆繰り返し処理の中断
  ◆
 :分岐終了
 ◆
:以上繰り返し
◆指定動作の全実行
◆イベントの呼び出し:ダメージを与える処理
◆スイッチの操作:[0005:キー入力受付]をONにする
◆スイッチの操作:[0010:ビーム]をOFFにする
◆

↑さっきの技イベントに、◇の行を追加してください。
攻撃x、yの座標の地形IDを調べて、変数17番「地形ID」に代入します。
それが草原(=1番)でなければ、繰り返し処理を中断します。
これで海を越えないビームのできあがり。

山のチップはデフォルトでは草原の地形になっているので、山は越えてしまいます。
アクションゲームを作る場合、地形の戦闘背景などはほとんど関係ないので、
地形は簡素に「通行可」「通行不可」「ビーム通行可」「足元透過」とか、
地形の性質を直接表す名前にして、少数の地形にした方が扱いやすいでしょう。


今度は敵がビームを放ってくるやつを作ってみます。

全4ページ

[1] [2] [3] [4]

[ 次のページ ]


.
検索 検索
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
フェルミウム湾
フェルミウム湾
男性 / O型
人気度
Yahoo!ブログヘルプ - ブログ人気度について

過去の記事一覧

よしもとブログランキング

もっと見る

[PR]お得情報

お肉、魚介、お米、おせちまで
おすすめ特産品がランキングで選べる
ふるさと納税サイト『さとふる』
ふるさと納税サイト『さとふる』
11/30まで5周年記念キャンペーン中!
Amazonギフト券1000円分当たる!
数量限定!イオンおまとめ企画
「無料お試しクーポン」か
「値引きクーポン」が必ず当たる!

その他のキャンペーン


プライバシー -  利用規約 -  メディアステートメント -  ガイドライン -  順守事項 -  ご意見・ご要望 -  ヘルプ・お問い合わせ

Copyright (C) 2019 Yahoo Japan Corporation. All Rights Reserved.

みんなの更新記事