brown water

ゲームやアニメの感想とかプログラムとか

ジャンプゲームの制作1

GameMaker:Studioを使って2Dプラットフォーマーゲームを作っていきたいと思います。

前回読んだ本でジャンプアクションの基本的な物が作れるようになりましたが、複雑で使いづらい所があるため、別の方法を探していました。 それでこちらの動画を参考に作ってみました。

英語ですが、ソースコードを見るだけで何とかなります。

スプライトとルームの作成

プレイヤーはカーソルキーで左右移動、スペースキーでジャンプ 障害物は壁のみ とりあえずこの仕様で作ってみます。

f:id:chaz4:20180415172728p:plain f:id:chaz4:20180415172731p:plain

プレイヤーと壁のスプライト画像 プレイヤーの原点はセンター。ルームサイズは640x480、スピードは60。 これをルームに適当に並べてテスト。

f:id:chaz4:20180415183048p:plain

移動と衝突判定

オブジェクトにGMLを書いていきます。

定数の設定

PLAYER_JUMPSPEED 6.5
PLAYER_GRAVITY 0.3
PLAYER_FALLMAX 10

プレイヤーオブジェクト Create

///初期化
m_hsp = 0;
m_vsp = 0;

プレイヤーオブジェクト Step

///移動
key_left = -keyboard_check(vk_left);
key_right = keyboard_check(vk_right);
key_jump = keyboard_check_pressed(vk_space);

var move = key_left + key_right;
var hsp = move * PLAYER_SPEED;

//垂直方向に重力を加える
if m_vsp < PLAYER_FALLMAX {m_vsp += PLAYER_GRAVITY;}

//方向によってスプライトの向きを変える
if move != 0 {image_xscale = sign(move);}

//地面に接地していたらスペースキーでジャンプ
if key_jump && place_meeting(x, y+1, obj_wall) {m_vsp = -PLAYER_JUMPSPEED;}

//水平方向の衝突
if place_meeting(x+hsp, y, obj_wall) {
    while(!place_meeting(x+sign(hsp), y, obj_wall)) x += sign(hsp);
    hsp = 0;
}
x += hsp;

//垂直方向の衝突
if place_meeting(x, y+m_vsp, obj_wall) {
    while(!place_meeting(x, y+sign(m_vsp), obj_wall)) y += sign(m_vsp);
    m_vsp = 0;
} 
y += m_vsp;

実行して動作を確認。 ジャンプの高さや重力の値等を調節していきます。

f:id:chaz4:20180415172708p:plain

壁オブジェクトには何も記述せず、プレイヤーのStep1つだけで判定をしているので非常にシンプルです。

衝突判定のコードですが、自分なりに解読してみました。 次の移動で速度を加えた値が壁に衝突する時は、Whileを使って1ずつずらしながら壁をチェックしていき、壁の手前まで移動するようにする(壁にくっつける)

基本的な操作が出来上がったので、次回はトラップとゴールを追加してゲームらしくしていこうと思います。