1. HOME
  2. »
  3. プログラミング・Web
  4. »
  5. JavaScript
  6. »
  7. enchant.js100行未満!!本格シューティングゲーム作り方

enchant.js100行未満!!本格シューティングゲーム作り方

昨日歩き回ったせいで、足がかなり痛い@It_is_Rです。

さて、今回はenchant.jsのネタです。enchant.jsを使うと、javascriptのプログラムがものすごく簡単に書けてしまいます。
ならば、enchant.jsを使えば100行未満のシューティングゲームの開発が可能なのでしょうか?

今回はenchant.jsでのたった100行未満の、本格シューティングゲーム開発に挑戦してみました。

では、今回の目標を発表します。

  • プログラムは100行以内。
  • 行数を縮めるために、無理やり1行にしたりはなるべくしない。
  • 背景は表示する。スクロールもさせる。
  • 敵はまっすぐ下に弾を撃つ。自機ももちろん弾を撃てる
  • スコアも表示させる。

こんな感じで作ってみようと思います。
では、まずは実際に作ってみたゲームをごらんください。
9leapにアップロードしてみました。
こちらでプレイできます。

ソースはこちらです。

enchant();
window.onload = function() {
  game = new Core(320,320);
  game.preload('img/FC-1.png','img/F-1.png','img/shot.png','img/sky.png');
  game.onload = function() {
    gameScene = game.rootScene;
    enemies = [];
    score = 0;
    var sky = [];
    for (var i=0; i<2; i++) {
      sky[i] = new Sprite(320,320);
      sky[i].image = game.assets['img/sky.png'];
      sky[i].moveTo(0,-320*i);
      gameScene.addChild(sky[i]);
    }
    player = new Player(135,200);
    gameScene.addChild(player);
    var scoreTxst = new Label();
    gameScene.addChild(scoreTxst);
    gameScene.onenterframe = function() {
      scoreTxst.text = "Score:" + score;
      for (var i=0; i<2; i++) {
        sky[i].y += 5;
        if (sky[i].y === 320) sky[i].y = -320;
      }
      if (game.frame % 40 === 0) {
        enemies[game.frame] = new Enemy(50,50);
        gameScene.addChild(enemies[game.frame]);
        enemies[game.frame].extence = true;
      }
    };
    game.gameoverScene = function() {
      var scene = new Scene();
      var label = new Label("GAME OVER");
      label.moveTo(120,160);
      scene.addChild(label);
      return scene;
    };
  };
  game.start();
};
var Player = Class.create(Sprite, {
  initialize: function() {
    Sprite.call(this,50,50);
    this.moveTo(135,200);
    this.image = game.assets['img/FC-1.png'];
  }, ontouchstart: function(e){
    px = e.x - this.x; py = e.y - this.y;
    var shot = new Shot(this.x+24,this.y,0);
    gameScene.addChild(shot);
  }, ontouchmove: function(e) {
    this.x = e.x - px; this.y = e.y - py;
    if (this.x > 270) this.x = 270;
    else if (this.x < 0) this.x = 0;
    else if (this.y > 270) this.y = 270;
    else if (this.y < 0) this.y = 0;
  }
});
var Enemy = Class.create(Sprite, {
  initialize: function() {
    var rnd = Math.floor(Math.random() * 270);
    Sprite.call(this,50,50);
    this.moveTo(rnd,-50);
    this.image = game.assets['img/F-1.png'];
  }, onenterframe: function() {
    this.y += 3;
    if (this.y > 330) gameScene.removeChild(this);
    if (this.within(player, 15)) game.pushScene(game.gameoverScene());
    if (this.age % 25 === 0) {
      var shot = new Shot(this.x+24,this.y+50,1);
      gameScene.addChild(shot);
    }
  }
});
var Shot = Class.create(Sprite, {
  initialize: function(x,y,type) {
    Sprite.call(this,2,5);
    this.moveTo(x,y);
    this.image = game.assets['img/shot.png'];
    this.type = type;
  }, onenterframe: function() {
    if (this.type === 0) {
      this.y -= 5;
      for(var i in enemies){
        if (!enemies[i].extence) continue;
        if (enemies[i].within(this,20)) {
          gameScene.removeChild(this);
          gameScene.removeChild(enemies[i]);
          enemies[i].extence = false;
          score+=100;
        }
      }
    } else if (this.type === 1) {
      this.y += 5;
      if (this.within(player, 15)) game.pushScene(game.gameoverScene());
    }
    if (this.y < -10 || this.y > 330) gameScene.removeChild(this);
  }
});

大まかに見ていきましょう。

9〜15行目で、背景(空)の画像を2枚表示しています。2枚表示するのは、背景をスクロールさせるためです。
行数を省略するため、for文を使いました。
22〜25行目で、背景(空)の画像をスクロールさせています。
26〜30行目で、敵を40フレームごとに出現させています。
32〜38行目は、ゲームオーバーシーンを作っています。このシーンを読み込むことで、ゲームオーバー画面を作ることができます。

クラスとして、Player、Enemy、Shotのクラスを作成しています。
今回は行数を減らすため、Shotクラスを、自機、敵機の2つから同じものを利用しています。

その為に、Shotクラスに弾を出す機体を判別する為の引数を加えました。

スポンサードリンク

関連コンテンツ

オススメ記事

【Android Studio】アプリ開発の基本とそれぞれのファイルの役割を覚える。

iPhone持ってないみなさん、一緒にAndroidアプリ開発しましょう。@It_is_Rです。 Androidアプリ開発、5回目となりました。 今回は Android Studio でアプリ

キャラを決まった間隔ずつ動かすよ!

【JavaScript】キャラを決まった間隔ずつ動かす! 小学生からのプログラミング入門

小学生からのプログラミング入門講座《にゅうもんこうざ》、今回もはじめていきましょう! 前回は、キャラクターの画像《がぞう》をスムーズに動かす方法でしたが、スピードが速すぎたので、画像の移動間隔

文字を表示するクラスを作ろう!

【JavaScript】文字を表示するクラスを作ってみよう! 小学生からのプログラミング入門

小学生からのJavaScript講座です。このシリーズでは、ゲームをつくりながらJavaScriptの使い方を学んでいきます。シリーズの一覧はこちらをご覧ください。 さて、ゲーム作成で重要なキ

文字を一文字ずつ表示してみよう!

【JavaScript】改行と一文字ずつ画面に表示する方法! 小学生からのプログラミング入門

小学生からのJavaScript講座です。このシリーズでは、ゲームをつくりながらJavaScriptの使い方を学んでいきます。 前回、画面に文字を表示するためのクラスを作ったのですが、それをも

画像を動かすよ!

JavaScriptで画像を移動してみよう! 小学生からのプログラミング入門

みなさんこんにちは。今回も、プログラミングの勉強《べんきょう》をはじめていきましょう! 前回、「JavaScriptで画像を表示してみよう! 小学生からのプログラミング入門」では、JavaSc

Dockerでよく使うコマンドとオプション、その使い方を徹底解説!

人生に意味は求めない。それよりもDockerのコマンドの意味を理解する方が重要です。@It_is_Rです。 Dockerにはたくさんのコマンドがありますが、まずはよく使うコマンドを覚えていきまし

FC2でブログを始めよう!誰でも簡単にできるブログの作り方

FC2ブログは、FC2が運営する無料でブログを開設できるサービスです。(有料版もあります) また、FC2のサービスには、動画、ライブ配信、アフィリエイト、小説など、様々なものがあります。 今回

オブジェクトを使ってみよう!

【JavaScript】オブジェクトを使ってみよう! 小学生からのプログラミング入門

小学生からのJavaScript《ジャバスクリプト》入門講座《にゅうもんこうざ》、今回もはじめていきましょう!前回の講座《こうざ》では、HTMLやCSS、JavaScriptを分けて管理《かんり》す

【Gulp4】gulpfile.jsを複数ファイルに分割して、作業効率を上げよう!

Gulpを使って開発を進めているいると、だんだんとgulpfile.jsが複雑になり、どこになにが書いてあったか分からなくなることがあります。そんなときは、gulpfile.jsを分割して管理すると

キー入力で文字を切り替えるべ

【JavaScript】ノベルゲーム風にキー入力で文字を切り替える方法! 小学生からのプログラミング入門

小学生からのJavaScript講座です。 前回、文字を一文字づつ表示させる方法と改行の方法を紹介しました。今回はこのプログラムに、キー入力によって文字を切り替えられる機能をつけてみましょう。

コメントをどうぞ!(コメントは承認後に反映されます)

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です