LoginSignup
0
0

More than 1 year has passed since last update.

Tonyu System 2であほげーを作ろう - その3 ターゲットと敵と

Last updated at Posted at 2018-04-28

前回に引き続き,Toyu System 2(以下Tonyu2)で作る あほげーのテンプレートを紹介していきます.

記事一覧

第1回 設定とタイトル
第2回 メイン画面
第3回 ターゲットと敵と
第4回 スコア・時間など
第5回 ゲームを公開する
第6回 Twitterにスコアを投稿
第7回 サウンド関係
第8回 物理エンジンなど

今回追加するもの

前回はプレイヤーが動くだけだったので,他の登場人物として<<第26回のテーマ>><<テーマに関連する何か>> を作ります.

今日のファイルはこちらです.改めて,Tonyu2はブラウザで動作しますので,次のリンクからプログラムの閲覧&編集&実行が可能です.(すいません,投稿した直後のプログラムはうまく開かなかったので,もう一度開いてみてください)

今回のプログラムを開く!

メニューの実行Settingを実行 を選んで, 一応,ストーリー?を見直しておきましょう

スクリーンショット 2018-04-28 11.57.46.png

というなんとも抽象的なストーリーですが,テーマが決まった暁には具体的になる....はずです.
とにかく,今回は<<第26回のテーマ>> を集めるのが目的なので,<<第26回のテーマ>> のことを Target と名付けました.

Targetの動作

Target
p=$pat_ahoge26+1;//★1
while(true) {
    x+=vx;//★2
    y+=vy;//★2
    if (screenOut()) die();
    update();
}

★1の変数pは,前回説明した通り,絵柄の設定を行っています.↓の絵の2番目の絵になります.

ahoge26.png

★2では,x+=vx;だの,y+=vy だの書いてありますが,これらの変数はどこにも初期化されている様子がありません.これらは実際にはMainクラスで値を設定しています.

Main
new Player{x=100,y=100};
//---今回追加分↓
while(true) {
    if (rnd(50)==0) {
        new Target{x=rnd($screenWidth),y=0,vx=0,vy=1};// ★3
    }
    if (rnd(50)==0) {
        new Enemy{x=rnd($screenWidth),y=$screenHeight,vx=0,vy=-1};
    }
    update();
}

★3のように,オブジェクトを作るときに,後ろに{変数=値...} という形式で変数(フィールド)の内容を初期化しています.ちなみに,ここでは次のように初期化されます.

  • x は 0 以上 $screenWidth 未満の乱数
    • $screenWidth は画面の幅を表すグローバル変数
  • y は 0
  • vx は 0
  • vy は 1

★2のx+=vx;y+=vyによって,xyの値をvxvyの分だけ増やすことになるので,このTargetは次のように動きます.

  • vxは0なのでx座標(横)は動かない
  • vyは1なのでy座標(縦)は増える.画面上端がy=0で,yが増えるほど下に移動するので,下に移動する

Targetの残りの部分を見ていきます:

Target
p=$pat_ahoge26+1;
while(true) {
    x+=vx;
    y+=vy;
    if (screenOut()) die();//★3
    update();//★4
}
  • ★3は,screenOut メソッドにより「オブジェクトが画面外にいるか」という判定を行い,もしそうだったら die メソッドによりオブジェクトを消しています.
  • ★4の updateメソッドは,前回も説明した通り,このオブジェクトの1フレーム分の動作を終了させます.

Targetとの当たり判定

Playerクラスにて,プレイヤーがTargetに当たったら,そのTargetを取れるようにしています.

Player
pad=new APad;
p=$pat_ahoge26+0;
while(true) {
    x+=pad.vx*5;
    y+=pad.vy*5;
    //---今回追加分↓
    t=crashTo(Target);//★5
    if (t) {//★6
        t.die();//★7
    }
    e=crashTo(Enemy);
    if (e) {
        die();
    }
    //---------
    update();
}
  • ★5 ではcrashTo メソッドを用いて,Targetクラスのオブジェクト のうちどれかに当たっているかを判定します.
    • 当たっていたらそのオブジェクトを返します
    • 当たっていなかったらundefinedを返します
  • ★6では,★5の結果が undefined 以外かどうか,すなわち,当たっているオブジェクトがあったかを判定します.
    • JavaScript同様,値がfalseundefinednullNaN0,空文字列の場合はfalse相当,それ以外はtrue相当になります.
  • ★7では,当たったオブジェクトに対してdieメソッドを呼び,当たったオブジェクトにを消します.

敵を作る.

ストーリーでは「<<テーマに関連する何か>> は集めるなよ!」と言っていたので,これをEnemyと呼びます.プレイヤーが当たったらプレイヤーが消えます.

作り方はTargetとほとんど同じです.

Enemy
p=$pat_ahoge26+2;//Targetとの違いはここの絵柄だけ 
while(true) {
    x+=vx;
    y+=vy;
    if (screenOut()) die();
    update();
}

出現はMainで行います.Targetを出現させる方法と同じです.yは画面下,vyは-1にしているので下から出現します.

Main
new Player{x=100,y=100};
//---今回追加分↓
while(true) {
    if (rnd(50)==0) {
        new Target{x=rnd($screenWidth),y=0,vx=0,vy=1};
    }
    if (rnd(50)==0) {// ここでEnemy出現
        new Enemy{x=rnd($screenWidth),y=$screenHeight,vx=0,vy=-1};
    }
    update();
}

当たり判定はPlayerで行います.「当たったらプレイヤー自身が消える」という点以外はTargetと同じです.

Player
pad=new APad;
p=$pat_ahoge26+0;
while(true) {
    x+=pad.vx*5;
    y+=pad.vy*5;
    //---今回追加分↓
    t=crashTo(Target);
    if (t) {
        t.die();
    }
    e=crashTo(Enemy);
    if (e) {
        die();// プレイヤー自身が消える
    }
    //---------
    update();
}

今回はここまで.はスコアやら体力やら時間やら,パラメータ系の作成をしていきます.

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0