トップページへ
 これ以上簡単に書けないゲーム制作講座
 さらにめり込みを修正する 前のページ   次のページ
前章で、「めり込みが直っていないぞ!」という方もいるかもしれません。
自機の初期位置によってはまだめり込んでしまうことがあります。ためしにF2キーを押してプログラムを停止させ、キャラクタをクリックしてください。オブジェクトインスペクタからxを50、yを65にしてみます。数値を入力した際、数値をリターンキーなどで確定することをお忘れなく。(プログラムの最初のほうに、x=50; y=65;と追記してもOKです)


これで実行してみます。足のほうがめり込んでしまいました。


前章では自機y座標の16dot先にブロックがあった場合に落下速度をとめる処理を書きましたが、判定時すでに自機がめり込んでいたときにブロックから抜け出すことをしていないためにこうなってしまっています。また1文加えて修正してみます。

extends SpriteChar;

/*キャラクタ歩行プログラム
左右のキーを押すとキャラクタが
足踏みしながら移動します。*/

$map.setBGColor(color(0,200,255)); //背景色の変更

p=$pat_chara+0;

anim=newAnimation();

while(1){
anim.pause();
if (getkey(39)>2) { //右のキーが押されたとき
anim.swing($pat_chara+0,$pat_chara+2,12);
//キャラクタのアニメーション
x=x+1; //右へ1ドット移動
f=1; //右を向く
}
if (getkey(37)>2) { //左のキーが押されたとき
anim.swing($pat_chara+0,$pat_chara+2,12);
//キャラクタのアニメーション
x=x-1; //左へ1ドット移動
f=-1; //左を向く
}

if ($map.getAt(x,y+16)==$pat_block+0){
//ブロックに当たった場合
vy=0; //落下速度を0にする
y=trunc(y/32)*32+16; //y座標をブロックの上に移動する
} else {
//ブロックに当たっていなかった場合
vy=vy+0.5; //落下速度を上げる
}

//if (getkey(32)==1 && $map.getAt(x,y+16)==$pat_block+0) vy=-10;

y=y+vy;
vx=0;
update();
}



まずtrunc(y/32)で、自機のy座標を32で割った値の小数点を切り捨てています(詳しくはtruncを参照)。これでいるべき位置が上から4区画目であることがわかります。ここに、構成単位である32をかけて16を足せば、自機をブロックのちょうど上に置くことができます。これを式で書くと、y=trunc(y/32)*32+16となります。実際に自機が止まった位置をオブジェクトインスペクタで見てみると下記のようになっています。


これでどんな位置から落としてもブロックの上に止まることができるようになります。自機の位置をいろいろと変えて試してみてください。

前のページ   次のページ



|  トップページ | このサイトについて | 利用規約 | ご意見・お問い合わせ |

TonyuアクションRPG - ゲームプログラミング解説 -