Flashゲーム作成講座

初心者からクリエイター志望まで Flashゲームの作り方 入門

ゲームの作り方を初心者にも分かりやすく説明します。ゲームクリエイターを目指す方にも役立つ情報を。

当たり判定を行う

自機と障害物の当たり判定を行います。

Flash では当たり判定を行うのに、とても簡単な方法があります。
詳しくは [ 1ドット当たり判定 ] を参照して下さい。

当たり判定を追加したプログラムは次のようになります。

var flg1 = 0;
var flg2 = 0;
var flg3 = 0;
var flg4 = 0;
var hitflg = 0;

// 毎フレーム実行されるイベントを登録
stage.addEventListener(Event.ENTER_FRAME, mainloop);

function mainloop(event:Event):void {

    hitflg = 0;       // 0:外れ 1:当り

    if( ball_mc.hitTestPoint(player_mc.x, player_mc.y, true) ){
        hitflg = 1;
    }
    if( ball2_mc.hitTestPoint(player_mc.x, player_mc.y, true) ){
        hitflg = 1;
    }
    if( ball3_mc.hitTestPoint(player_mc.x, player_mc.y, true) ){
        hitflg = 1;
    }
    if( ball4_mc.hitTestPoint(player_mc.x, player_mc.y, true) ){
        hitflg = 1;
    }

    if( hitflg == 1 ){
        player_mc.rotation += 15;    // 自機を回転する
    } else {
        player_mc.rotation = 0;
    }

    // マウスx座標を取得して自機を動かす
    player_mc.x = stage.mouseX;
    player_mc.y = 320;

    // 障害物の初期処理
    var rnd:int = 0;

    if( flg1 == 0 ){
        flg1 = 1;
        rnd = Math.random() * 400;
        ball_mc.y = -100 - rnd;    // 初期y座標
    }
    if( flg2 == 0 ){
        flg2 = 1;
        rnd = Math.random() * 400;
        ball2_mc.y = -100 - rnd;
    }
    if( flg3 == 0 ){
        flg3 = 1;
        rnd = Math.random() * 400;
        ball3_mc.y = -100 - rnd;
    }
    if( flg4 == 0 ){
        flg4 = 1;
        rnd = Math.random() * 400;
        ball4_mc.y = -100 - rnd;
    }

    // 障害物の移動
    ball_mc.y += 5;                 // 下に移動
    if( ball_mc.y > 500 ){          // 画面外へ出た
        flg1 = 0;
    }
    ball2_mc.y += 5;
    if( ball2_mc.y > 500 ){
        flg2 = 0;
    }
    ball3_mc.y += 5;
    if( ball3_mc.y > 500 ){
        flg3 = 0;
    }
    ball4_mc.y += 5;
    if( ball4_mc.y > 500 ){
        flg4 = 0;
    }
}

ムービープレビューしてみましょう。
自機が障害物に重なると、くるくると回転するようになりました。

 

新しく追加された部分を見てみましょう。

flash as3 当たり判定プログラム

 

では、当たったかどうかを記録する変数を用意しています。
では、初期化をしています。これが無いと、1度当たるとずっと当たっている状態に
なってしまいます。

のところで当たり判定を行っています。
障害物1つずつと自機との判定を行っているので、4つあります。

flash as3 hitTestPoint 当たり判定

障害物のインスタンス名と自機の座標で、当たり判定を行います。

hitflg は当たり(1) 外れ(0) の情報を格納します。
この情報を元に、当っている時はやられ演出を行います。

で、やられ演出として自機の回転を行います。
player_mc.rotation += 15;
これは「自機を15度ずつ角度を付ける」という処理です。
この処理が数フレーム続けて行われると回転しているように見えます。

 

当り判定の方法

今回使っている当り判定の方法は
1ドットの座標と対象となるものとの関係をチェックしてます。
指定した座標に対象物が存在する時「当っている」と判断します。

この方法のメリットは取り扱いが簡単であること
デメリットは、実際の見た目と当り判定に違いがあることです。

1ドット当たり判定のしくみ

見た目と当たりとの誤差があるため、ゲームの内容によっては注意が必要です。
正確な当たり判定を必要とするタイプのゲームには向きません。

今回は
自機の当り判定の範囲が小さい = プレイヤーに有利
および
当たり判定の正確性はあまり重要ではない
ということで、この方法でも許されると思います。

注意するパターンとして、敵の当たりを1ドットで判定するようなゲームを作ると
当たりが小さくて、プレイヤーが撃った弾がなかなか当らない
という状況が発生します。プレイヤーはすごいストレスを感じることになるでしょう。
対象物の性質に合わせて判定方法を使い分ける必要があります。

 

当たり判定をする時の注意点

当たり判定をする時に注意することがあります。
それは当り判定を行うタイミングです。

今回のプログラムの概要は次のようになっています。

ゲームプログラムの概要の例

 

注目する点は、当り判定の場所です。
自機や障害物の移動処理の前にあります。
移動処理では、次フレームに表示する場所を計算しています。
移動処理後に当り判定をもってくると、移動先の位置で判定することになるので
実際の見た目で接触していないのに、「当たり」と判定される可能性があるのです。

当たり判定のタイミングには注意

 

今回のような大雑把なゲーム内容では、あまり気にする必要もないのですが
今後ゲームを作成していく上で、このポイントは重要になってきます。
移動処理と当り判定の場所は、意識しながら作るようにしましょう。
(移動先で当り判定をする場合もあります 例:玉が壁で跳ね返る処理など)

 

次[ 当たり判定からゲームオーバーへ ]へ進む