コードオブジーニアスでは、「プログラミングを通して、アイデアをカタチにする」をテーマにプログラミング学習を進めています。
プログラミングを知っているだけではなく、プログラミングを使って何かを創り出せるような人になることを目指して日々プログラミング学習に励んでいます。
各プログラミング言語を学習したタイミングで、それぞれオリジナル作品を作ることにチャレンジしています。
ここでは、生徒が実際に作ったオリジナル作品を紹介していきます。
作品紹介
今回紹介する作品は、以下のようなゲームです。
作品名 | リベリオンゲーム |
---|---|
作者 | I.K.さん(中学3年生) |
プログラミング言語 | JavaScript |
どんなゲーム? | 縦スクロールシューティングゲームです。敵の数と弾数の多さに驚きます。全3ステージ構成。 |
実際の作品はこちら。
さらに作品について掘り下げて見ていきたいと思います。
今回は、猫先生から作成者へのインタビュー形式でまとめてみました。
インタビュー
どんなゲーム?
まずはどんなゲームか教えてほしいにゃ
シューティングゲームです。弾を敵に当てて倒し、宇宙の平和を取り戻そう!というゲームです。自機を動かし、敵の弾を避けつつ攻撃しやっつけます
にゃるほどにゃ~!!聞いてるだけでおもしろそうにゃ~
この作品を作ろうと思った理由
どうしてこのゲームを作ろうとしたのか教えてほしいにゃ
数年前、Undertaleや東方などのシューティングゲームをプレイしていたので、今回は同じ系統のゲームを作ってみようと思いました。
自分が面白かったゲームを作ってみようとする気持ち、分かるにゃ~。
工夫したところは?
それでは、工夫したのはどんなところにゃ。
弾の打ち方を工夫しました。最初はボタンを連打して弾を打っていたのですが、長押しで打てるようにしました。
なるほどにゃ!! これだけで操作性が全然違ってきそうにゃ。
難しかったところは?
ゲームを作っている時に、難しかったのはどんなところにゃ。
敵の攻撃についてです。敵がたくさん登場し、それぞれが一定間隔ごとに攻撃を行うようにすると、それぞれの敵の位置を取得することができずに苦労しました。最終的には、タイマーイベントに引数として敵の情報を渡すことで解決することができました。
作っていると、想定外の結果になることはよくあるにゃ。試行錯誤しながら問題を解決することができて、素晴らしいにゃ。
プログラムについて
インタビューの中でも出てきた部分について実際のプログラムを見ながら説明したいと思います。
プレイヤーの弾の発射方法
プレイヤーの弾を発射する方法についてです。スペースキーを押している時に、タイマーを設置し、0.15秒ごとに弾を発射するようにプログラムが作られています。そして、スペースキーが離れた時に、タイマーを削除しています。これでスペースキーを押している間だけ、弾が発射され続けるようになりました。タイマー処理うまく活用し、自動で弾を打つ仕組みを考えてくれました。
this.input.keyboard.on('keydown-SPACE', function(event) {
// 弾を発射するタイマー処理を追加
this.playerBeamTime = this.time.addEvent({
delay: 150,
callback: this.playerShoot,
loop: true,
callbackScope: this,
});
}, this);
// ~~~~~~~~ 省略 ~~~~~~~~
if(!this.direction.space.isDown && typeof this.playerBeamTime != "undefined") {
// 弾を発射するタイマーを削除
this.playerBeamTime.destroy();
}
敵の弾の発射方法
敵がたくさん登場した場合、単にタイマー処理を設定するだけだと、誰が弾を発射しているかが分かりません。そこで、タイマーイベントに敵の情報を渡すことで、誰が弾を発射するかが分かるようになります。
//敵の作成
var enemy = this.enemyGroup.create(positionX, 50, 'enemy01');
// ~~~~~~~~ 省略 ~~~~~~~~
enemy.timeEvent = this.time.addEvent({
delay : this.enemy_beam_speed,
callback: this.enemyShoot,
args: [enemy],
loop: true,
callbackScope: this
});
// ~~~~~~~~ 省略 ~~~~~~~~
mainScene.enemyShoot = function(enemy){
this.enemy_beam_count++;
var enemy_x = enemy.x;
var enemy_y = enemy.y;
var enemy_beam = this.enemyBeamGroup.create( enemy_x, enemy_y, 'enemy_beam01');
var enemy_beam_speed = Phaser.Math.RND.between(200, 100);
enemy_beam.setVelocityY(enemy_beam_speed);
};
他にも、スコアを消費してスピードを上げたり、HPを回復させたり、ステージが3つに分かれていたりとたくさんの工夫がありました。
習ったことだけだと、簡単にできることでも、いざ自分のアイデアを実現しようとするとうまくいかないことがたくさん出てきます。うまくいかない時に試行錯誤して、問題を解決していくプロセスが大切ですね
気になる方は、以下から定期受講コースの詳細をご確認ください。