[前へ] [目次へ] [次へ]

調べると押せるイベントを作ってみる

今回は調べると押せるイベントを作ってみます。


●イベント方向
   イベントオブジェクトは向いている方向を保持しています。
   これはキャラクターだけでなく、向きによって画像が変化しないツボ等でも同様です。
   
   イベント方向など、FGSで方向を扱う場合、原則として「方向ID」が使われます。
   「方向ID」は上を0として時計回りに45度ずつずらして定義されています。
   ざっくり表にすると以下のようになります。
方向ID対応する方向
0
1右上
2
3右下
4
5左下
6
7左上

   ムーブコマンドエディターを使っている場合は方向IDは自動的に処理されますが、
   スクリプト上で方向を扱う時はこの対応を把握している必要があります。
   

●「押せるイベント」とは即ち?
   「押せる」ということは、上から調べれば下へ、下から調べれば上へ移動するということで、
   調べる方向によって動くべき方向が変わるということを意味します。
   
   だったら「プレイヤーの向きを調べて条件分岐すればいい」と思うかもしれません。
   確かにそれでも実現はできますが、もっと楽な方法があります。
   
   実はデフォルトで「調べられたイベントは調べた相手の方を向く」という動作が入っています。
   基本的には話しかけたキャラクターがプレイヤーの方を向くための機構なのですが、
   見た目をツボにしたところでこれはしっかり動作しています。
   
   つまり、イベントが開始された時点でこのツボイベントはプレイヤーの方を向いています。
   上から調べた場合、ツボは上を、下から調べた場合、ツボは下を向いているわけです。
   そして移動したい方向は「この向きの逆」であることに気付けば勝ちです。

   オプションに「自身の向き基準」というのがあります。
   これは「自分の向いている方向を前(上)として扱う」というもので、
   イベントが左を向いている時の「右」は画面上では「上」になり、
   イベントが右を向いている時の「右」は画面上では「下」になります。
   ということは、「自身の向き基準」で「後ろ」に進めばいいわけですね。

   
   そして前回の連打対策を組み合わせてこうです。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
if(IsBaseMoving()){
   
   
//論理移動の予約
   
EMC::Move(this,4,1,EMC::NOWAIT|EMC::DIRRELAY);//後ろに1歩移動(待無)
   

   実行して確認してみてください。
   上下左右どの方向から調べてもちゃんと前方に移動していきます。


●もう少し押している感じを出す
   しかし押した瞬間にプレイヤーが自由に動けてしまうと今ひとつ押している感じが出ません。
   押している間、プレイヤーも一緒に動いて押している感じを演出してみましょう。
   
   ところが、今までの移動設定は全て「このイベント」を対象にしてきました。
   「プレイヤー」を対象に移動設定をするにはどうすればいいのか?となるわけですね。
   本格的なプログラミングの経験がある人は(ちょくちょくある this で)察しが付いていると思いますが、
   「プレイヤーを示すオブジェクト」を拾ってそれを対象にすればいいのです。
   
   端的に言うと以下のような記述で player_obj に「プレイヤーを示すオブジェクト」を結びつけることができます。
<  1>INativeEventObject@ player_obj=@@quest_scene->GetPlayerObject(); 

   しかしながら、今回の場合はもっと簡単な方法があります。
   
   ●イベントのペアリング
      実はイベント処理では「ペアリング」というものが行われています。
      これは簡単に言えば「仕掛けた側」と「仕掛けられた側」を一対にして扱う仕組みで、
      今回の場合は「調べてきた相手(=プレイヤー)」がペアリング相手としてひっそり渡されています。
      
      この「ペアリング相手」は pairobj という名前になっており、
      これを対象にすればプレイヤーに対して移動予約などを行うことができます。
   
   
   コマンドの挿入→「行動予約」からムーブコマンドエディターを起動し、
   「処理対象」を pairobj にしてから「特性設定」を選択、「タイル移動時間」を64に設定します。
   「タイル移動時間」は「描画移動時間(1マス移動するのに掛けるフレーム数)」の変更です。
   ここではプレイヤーの移動速度をツボイベントの移動速度に合わせています。


   次に、「移動」を選択、「周期を待たない」「自身の向き基準」を付けて「上/前」を押します。

   
   最後に、また「特性設定」を選択、「タイル移動時間」を初期化します。
   「特性設定」の設定変更は移動完了後も残るため、
   こうしないとプレイヤーの移動速度はツボイベントの速度と同じままになってしまいます。



   ここまでをまとめて以下のようにします。
   最初のツボイベントの行動予約とプレイヤーの行動予約の間にさらっと pause を挟んでいるのは、
   実は結構重要なことだったりします。
   ( pause はこのフレームでの処理を中断して続きを次フレームで行うという処理です)
   
   というのも、「プレイヤー」と「ツボイベント」に同じフレームで行動予約をした場合、
   「プレイヤー」の方が先に処理が行われるという決まりがあるのです。
   そのため、単に行動予約をすると「プレイヤー」が移動しようとした時点ではまだ
   「ツボイベント」は移動していないため、「プレイヤー」の移動は失敗してしまうのです。
   
   そこで、「ツボイベント」の移動開始を待つために1フレーム処理を遅らせているというわけです。
<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>

//論理移動の予約
EMC::Move(this,4,1,EMC::NOWAIT|EMC::DIRRELAY);//後ろに1歩移動(待無)

pause;

//論理移動の予約
EMC::SetDrawFrame(pairobj,64);//タイル移動時間を64フレームに変更
EMC::Move(pairobj,0,1,EMC::NOWAIT|EMC::DIRRELAY);//前に1歩移動(待無)
EMC::SetDrawFrame(pairobj,0);//タイル移動時間をデフォルトに戻す
 
   このイベントは2フレーム掛けて「プレイヤー」に移動を予約した後すぐに完了していますが、
   「プレイヤー」に対してムーブコマンドが実行されている場合、
   操作を受け付けないようになっているためツボを押しきるまで自由には動けません。
   
   さて、これを実際に実行して何回か動かしているとあることに気付くと思います。
   それは「プレイヤー」をムーブコマンドで動かした場合、画面のスクロールが追従しないということです。
   そして本来スクロールしているべき状況にあった場合、
   処理完了後の自由行動を行った時点で画面のスクロール位置が同期されます。
   
   これはイベント処理を行う場合、プレイヤーとスクロールが強制同期されない方が都合がいい場合が多いためです。
   (例えば、プレイヤーが画面の左側に退場していきつつ、
      画面を上にずらしながらフェードアウトといった演出がしやすいのです)
   
   しかし今回の場合はプレイヤーとスクロールが同期していて欲しいので、
   「行動完了の待機」から「プレイヤーの行動完了を待機する(スクロール同期あり)」を入れます。


<  1>
<  2>
<  3>
<  4>
<  5>
<  6>
<  7>
<  8>
<  9>
< 10>
< 11>
< 12>
< 13>
< 14>

//論理移動の予約
EMC::Move(this,4,1,EMC::NOWAIT|EMC::DIRRELAY);//後ろに1歩移動(待無)

pause;

//論理移動の予約
EMC::SetDrawFrame(pairobj,64);//タイル移動時間を64フレームに変更
EMC::Move(pairobj,0,1,EMC::NOWAIT|EMC::DIRRELAY);//前に1歩移動(待無)
EMC::SetDrawFrame(pairobj,0);//タイル移動時間をデフォルトに戻す

//プレイヤーの行動完了を待機する(スクロール同期あり)
ECL::WaitPlayerMoveSyncScroll();
 

   これで、プレイヤーの動きに合わせて画面がスクロールするようになりました。
   実行して確認してみてください。




[前へ] [目次へ] [次へ]

最終更新 2018/01/25