エクステンション解説/Platform Movement object

Last-modified: 2018-10-01 (月) 15:42:42

Platform Movement objectとは

Platform Movement objectは、標準動作の「ジャンプとはしご(Platform)」の機能強化版です。ジャンプとはしごはKlik&Play時代から存在しているアクションゲーム用の動作ですが、壁際でジャンプすると引っかかったり、天井にぶつかり続けると張り付いてしまうなど使い勝手が悪く、アクションゲームを作る場合は動作は自前で組むのが当たり前とされていました。
そんななか登場したのがPlatform Movement objectです。ジャンプとはしごに存在するバグが無いので、ジャンプとはしごを使う位ならこちらを使いましょう。
その他にもデフォルトで坂道に対応、
わざわざ高速ループなどで設定しなくても障害物指定した背景にめり込まないといったメリットがあります。
ただし、障害物のはしごには対応してないので必要な場合はアクティブで自作する必要があります。

作成者Fodo
バージョン
対応ランタイムWindows,HWA,Java,SWF,iOS,XNA,Anaconda

入手方法

コマンド解説

オブジェクト設定

edit.png

MaxX velocityX方向の最高移動速度。
MaxY velocityY方向の最高移動速度。
X accelerationX方向の加速度。
X decelerationX方向の減速度。小さいほど止まりづらくなる。
Gravity重力
Jump strengthジャンプの強さ
Jump hold strengthUser is holding jump in the airを設定した場合、
ボタン押しっぱなしで上昇する力の強さ。
重力より大きく設定するとボタンを離さない限り上昇し続ける。
大体重力の半分程度に設定すると上昇と下降のバランスが取れたジャンプになるようだ。
max step upこの値(ドット数)の分の段差はないものとされ、移動させることができる。
0にすると坂道を登れなくなる。
あまり大きく設定すると処理が落ちやすくなる模様。
Downhill slope correctionmax step upの逆。
入力した数(ドット数)の落下分の段差はないものとされ、
自由落下せずに地面に吸着する。
 
Enable jump through platforms「下からすり抜けられる障害物」を有効にする。チェックを外すと「下からすり抜けられる障害物」が使用できなくなる
Top pixel of platform against bottom objectオブジェクトの下部に対して下からすり抜けられる障害物の一番上のピクセルと衝突を判定
Whole platform against whole objectオブジェクト全体に対して下からすり抜けられる障害物の全体と衝突を判定

条件

condition.png

Movement is paused動作が一時停止した時
Collision testing衝突判定(条件の並びでは必ず先頭に持ってくる必要がある)
Test for obstacle overlap障害物に設定した背景と衝突
Test for jump through platform overlap下からすり抜けられる障害物に設定したアクティブと衝突
Object statesオブジェクトの状態
Object is standing on groundオブジェクトが地面に載っている場合
Object is jumpingオブジェクトがジャンプ(上昇)している場合
Object is fallingオブジェクトが落下している場合
Object is movingオブジェクトが移動している場合

注)この"オブジェクト"はイベントエディタで"set object to"でプレイヤーキャラとして設定したオブジェクトの事
・ジャンプの上昇、下降を問わず空中にいる場合に条件を設定したい場合は
Object is standing on groundを反転させるといい。

アクション

action.png

Set object操作するオブジェクトを選択
Pause movement動作を一時停止
Unpause movement一時停止を解除
Collisions衝突(条件のCollision testingとセットで使用)
Object does overlap an obstacleオブジェクトが障害物と重なったとして動作を停止
Object does overlap with a jump through platformオブジェクトが下からすり抜けられる障害物と重なったとして動作を停止
On user inputユーザー入力
User is holding right input key右移動入力
User is holding left input key左移動入力
User is holding jump in the airジャンプの高さが変わる。チュートリアルの手順7を参照。
Jumpジャンプ入力
Variables速度類変更
Set X velocity設定した速度で強制的にオブジェクトをX方向に移動させる。additional X velocityとの違いは、X方向の最高移動速度と減速の設定値が適用されるということ。設定速度で移動を開始するが徐々に減速して停止する。
Set Y velocity設定した速度で強制的にオブジェクトをY方向に移動させる。こちらはY方向の最高移動速度と重力の設定値が適用される。
Set maximun X velocityX方向の最高移動速度を変更。
Set maximun Y velocityY方向の最高移動速度を変更。
Set X accelerationX方向の加速度を変更。
Set Y accelerationY方向の加速度を変更。
Set Gravity重力を変更。
Set Jump strengthジャンプの強さを変更。
Set Jump hold strengthジャンプボタン押しっぱなしで上昇する力の強さを変更。
Set max step upないものとされる段差の数を変更。
Set Downhill slope correctionないものとされる落下分の段差の数を変更。
Set additional X velocity設定した速度で強制的にオブジェクトをX方向に移動させる。反対方向への移動速度より高い場合に動作。設定した数値がプラスの場合は右へ移動し、マイナスの場合は左へ移動する。
Set additional Y velocity設定した速度で強制的にオブジェクトをY方向に移動させる。反対方向への移動速度(重力なども)より高い場合に動作。設定した数値がプラスの場合は下へ移動し、マイナスの場合は上へ移動する。

計算式

expression.png

Varues変数
Get X velocityX方向の移動速度を取得。
Get Y velocityY方向の移動速度を取得。
Get maximun X velocityX方向の最高移動速度を取得。
Get maximun Y velocityY方向の最高移動速度を取得。
Get X accelerationX方向の加速度を取得。
Get Y accelerationY方向の加速度を取得。
Get Gravity重力を取得。
Get Jump strengthジャンプの強さを取得。
Get Jump hold height確認中(ジャンプボタン押しっぱなしで上昇する高さを取得?)
Get max step upないものとされる段差の数を取得。
Get Downhill slope correctionないものとされる落下分の段差の数を取得。
Get additional X velocity強制的にオブジェクトをX方向へ移動させる速度を取得。
Get additional Y velocity強制的にオブジェクトをX方向へ移動させる速度を取得。
Countカウント
Retrieve fixed value固定値を呼び出し

チュートリアル

Platform Movement objectを使ってジャンプアクションを作るための設定の仕方を説明します。

手順1 Platform Movement objectの設置

pmo_t_1.png
まず、一番上のメニューから「挿入」>「新規オブジェクト」>「ゲーム」から
Platform Movement objectを選択し、邪魔にならないところに配置します。
初期設定のウィンドウについては上記のコマンド解説/オブジェクト設定の欄を参照。
あとで変えられるのでとりあえずそのままで問題ありません。

手順2 足場となる背景を用意する

pmo_t_2.png
「挿入」>「新規オブジェクト」>「バックグラウンド」>「背景」で素材を貼り付けるか、
サンプルの中の適当な素材をフレーム内に設置して、
プロパティ欄のランタイムオプションのタブで「障害物の種類」を「障害物」に設定。
これで足場となるブロックの完成です。

手順3 操作キャラになるオブジェクトを用意する

pmo_t_3.png
障害物に設定した背景を複製やドラッグ&ドロップでそれっぽく配置したら、
プレイヤーキャラとなるアクティブオブジェクトを用意しましょう。
「挿入」>「新規オブジェクト」>「グラフィックとアニメーション」>「アクティブ」です。

手順4 操作キャラをPlatform Movement objectにセットする

pmo_t_4.png
イベントエディタを開き、新しい条件をクリック。
ストーリーボードコントロールを右クリックして、「フレームが開始」を選択。
Platform Movement objectのアイコンの列を右クリックして、上から4番目の「Set object」を選択し、
先ほど用意したプレイヤーキャラ用のオブジェクトを選択します。
これでこのアクティブオブジェクトを操作させるオブジェクトにできました。

テクニック:セットするオブジェクトは矩形にする

pmo_player1.png
Platform Movement objectが操作するオブジェクトには、見た目のプレイヤーオブジェクトに設定するのではなく、動作用の矩形のグラフィックのオブジェクトを用意してそちらに設定し、見た目のプレイヤーオブジェクトは、その矩形オブジェクトに重ねるようにすると良いです。

pmo_player2.png
と言うのも、プレイヤーはアニメーションすることで様々な形に変化する可能性があります。壁際でアニメーションしてプレイヤーのグラフィックのサイズが変化し、背景にめり込んでしまうと、手順5でPlatform Movement objectとその障害物の判定を設定している場合、プレイヤーが強制的に上に押し上げられてしまうのです。
なのでPlatform Movement objectにセットするオブジェクトはアニメーションしない矩形のオブジェクトが良いのです。

・判定用のアクティブにキャラグラフィックを重ねる方法
pmo_hantei.png
あとは判定用のアクティブを「表示/非表示」>「オブジェクトを表示させないようにする」で消せばOK。

手順5 操作キャラに障害物を足場と判断させる

pmo_t_5.png
新しい条件をクリックし、Platform Movement objectを右クリックで
Collision testing(top of the event)>Test for obstacle overrap【障害物を衝突】を選択。
同じ欄に右クリックで挿入>プレイヤーキャラ用のアクティブのアイコンを右クリック>衝突>背景
pmo_t_6.png
と、条件を二つ設定します。
このときかならず、Test for obstacle overrapの方が上に来るようにしてください。
Platform Movement objectのアイコンの列を右クリックして、
Collision>Object does overrap with an obstacleを選択。
これで最初のフレームでPlatform Movement objectにセットしたアクティブオブジェクトが
背景に着地するようになりました。

手順6 ジョイスティックの方向キーを移動に割り当てる

pmo_t_7.png
新しい条件をクリックし、
「プレイヤー1」>「ジョイスティック」>「ボタンや方向キーを押してる間繰り返す」をクリックし方向の右を選択
pmo_t_8.png
Platform Movement objectのアイコンの列を右クリックして、
On user input>User is holding right input keyを選択。
これで右を押したときに右に移動するようになりました。
新しい条件をクリックして、左キーも同様に設定してください。

手順7 ジャンプを割り当てる

pmo_t_9.png
新しい条件をクリックし、「プレイヤー1」>「ジョイスティック」>「ボタンや方向キーを押した時」をクリックし、
方向キーの選択を外し、ボタン1にチェックを入れる。
Platform Movement objectのアイコンの列を右クリックして、On user input>Jumpを選択。
これでジャンプできるようになりましたが、
このままだと空中で無限にジャンプできるようになってしまうので、
条件を挿入でPlatform Movement object>Object states>Object is standing on groundと選択。
これで地面に立ってる時にボタン1(特に設定してない場合はShiftキー)を押す事によって
ジャンプできるようになりました。

 

※ジャンプのイベントの条件は、画像のように入力のイベントを先頭に持ってきて下さい。
Platform Movement objectの条件が先だと、キーを押しっ放しにしていた場合、着地すると即もう一度ジャンプしてしまいます。
 
 
さらに、新しい条件でボタン1が押されている間繰り返す&Object states>Object is jumpingと条件を設定し、
On user input>User is holding jump in the air と設定する事で、
スーパーマリオのようにボタンを押してる長さによってジャンプの高さが調整できるようになります。
pmo_t_10.png

これでとりあえず、ジャンプアクションの雛形ができました。
他のサンプルなどを参考に、敵や弾などを追加してオリジナルのゲーム作りに挑戦してみてください。

下からすり抜けられる障害物の作り方

下からすり抜けられる障害物はアクティブオブジェクトで用意する

pmo_jtp1.png
下からジャンプしてすり抜けられる障害物の設定方法を説明します。
画像内で用意しているオブジェクトは、緑色がプレイヤー、赤色が地面で、障害物に設定した背景オブジェクトです。チュートリアルで説明したプレイヤーの動作や障害物との衝突はすでに設定してあるものとします。そして黄色が下からすり抜けられる障害物となるオブジェクトですが、これはアクティブオブジェクトにします。

 

黄色いオブジェクトも背景オブジェクトにして「下からすり抜けられる障害物」に設定すれば良いのではないかと思われるかもしれませんが、実は、既に通常の障害物との衝突イベントが設定してある場合、プレイヤーは下からすり抜けられる障害物を通り抜けることができないのです。

pmo_jtp2.png
↑このように下からすり抜けられる障害物の一番上に衝突してしまい、抜けることができません。
pmo_jtp_sample1.zip(下からすり抜けられる障害物を背景オブジェクトで設定した場合のサンプル)
Platform Movementによる障害物の種類の判断がイマイチで、どちらの場合も衝突しているオブジェクトが同じ背景オブジェクトであるため競合してしまうのかもしれません。
よって、「下からすり抜けられる障害物」はアクティブオブジェクトにする必要があります。

手順

pmo_jtp3.png
手順はチュートリアルの手順5とほぼ同じです。
違いは、条件のPlatform Movementの判定を「Test for jump through platform overlap」に設定。プレイヤーオブジェクトとの衝突は下からすり抜けられる地形としたアクティブオブジェクトと判定させます。そしてPlatform Movementのアクションは「Object does overlap with a jump through platform」に設定します。
これで下からすり抜けられる地形を作ることができました。

 

pmo_jtp_sample2.zip
下からすり抜けられる障害物のサンプルです。その障害物から降りる操作も含んであります。

はしごの作り方

Platform Movement objectは背景オブジェクトの障害物の種類の「はしご」には対応していません。
はしごを上るような動作を自作する必要があります。
はしごを上る動作としてプレイヤーのアクティブオブジェクトの座標変更を使おうとしましたが、PMOと干渉するためか上手く動作しませんでした。
はしごを上る動作もPMOを使って作ります。
pmo_ladder.png
Set additional Y velocityを使うと、強制的に移動させることが出来ます。
これを使って、はしごに重なっている時に上方向を押すと上に移動、下方向を押すと下に移動するようにします。
Set additional Y velocityは、通常の左右移動やジャンプの速度より高くなければ動作しません。
なので、Set maximum Y velocityを0にして通常の移動の最高速度を一時的に0にします。
プレイヤーがはしごに重なっていない時は最高速度を元に戻すのを忘れずに。

 

13行目は、はしごの頂上に接地した時の判定イベントです。
下方向へ入力を反転させた条件を含ませると、はしごを降りられるようにすることが出来ます。
この条件が無い場合は、上まで上りきってしまうと降りられないはしごになります。

移動速度について

PMOの移動速度の仕様についてです。
PMOの設定画面で「Measuring in 1/100th of a pixel per game frame.」と表示されているように、PMOの様々な設定値は「1フレーム毎に1ドットの100分の1の精度で測定」されています。

 

例えば、「Max X velocity」を100に設定すると、最高速度は「1フレーム毎に1ドット」になり、1000に設定すると1フレーム毎に10ドット」となります。
加速度の設定である「X accerelation」からは「最高速度に達するまでに何フレーム掛かるか」を算出することが出来ます。「Max X velocity」が1000で「X accerelation」を100にすると、最高速度に達するのに10フレーム掛かるということになります。50に設定すると20フレーム掛かります。
70などの中途半端な値でも「1000÷70=14.28571428571429」で座標に少数は使えないので切り捨てとなり、14フレーム掛かるということが算出できます。
減速についてもこれと同じでその逆の考え方になります。移動するドット数が分かれば壁に衝突しと時に押し返すドット数も見つけ易くなります。

 

ジャンプも基本的な考えは同じですが、重力やジャンプの強さも関わってくるため、ややこしいです(未検証)。

サンプル集

Platform Movementのサンプルを公開されているサイトへのリンクです。

コメント

  • プロパティアドベンチャー良いですね。参考になります。 -- 2010-03-15 (月) 18:40:15
  • エクステンションパックをインストールしたらトロイの木馬を検知した。 -- 注意書き? 2013-03-05 (火) 16:36:09
  • kcmouse.mfxがウイルス反応するね -- 2013-04-05 (金) 22:18:57
  • ここには書かれていないが、PMOオブジェクトは「最後にセットしたオブジェクト」にのみ動作する。なので、敵キャラクターにも適用したいならその数だけPMOオブジェクトを作るなどする必要がある。 -- 2017-08-16 (水) 23:55:35
  • 下からすり抜けられる障害物:足場を上下に往復させる場合、上移動時にプレイヤーがすり抜けて落ちます。一時的に通常障害物を重ねると、下キーで任意に落ちることが出来なくなりそう。 -- 2018-10-01 (月) 15:42:41