Canvas de shooting 制作のポイント

53
Canvas de Shootingからみる HTML5 Canvasを用いた ゲームの作り方 ~ HTML5 Canvas × JavaScript Development ~

Transcript of Canvas de shooting 制作のポイント

Page 1: Canvas de shooting 制作のポイント

Canvas de Shootingからみる

HTML5 Canvasを用いた

ゲームの作り方

~ HTML5 Canvas × JavaScript Development ~

Page 2: Canvas de shooting 制作のポイント

まずは自己紹介します!

名前とか: 宗定 洋平(@yoheiMune)

 YoheiM.NET(http://www.yoheim.net/)ブロガー

趣味: テニス、プログラミング(最近は、HTML5, Objective-Cが中心)

Page 3: Canvas de shooting 制作のポイント

今日お話するネタはこちらです

http://www.yoheim.net/labo/html5/canvasShooting.html

Page 4: Canvas de shooting 制作のポイント

"Canvas de Shooting" このゲームの作り方の解説を通して、

HTML5でのゲーム制作する際の技術ポイントを

少しでもお伝え出来ればと思います!

今日お話するネタはこちらです

Page 5: Canvas de shooting 制作のポイント

Sencha Touch

Page 6: Canvas de shooting 制作のポイント

Sencha TouchNO

Page 7: Canvas de shooting 制作のポイント

enchant.js

Page 8: Canvas de shooting 制作のポイント

enchant.jsNO

Page 9: Canvas de shooting 制作のポイント

ライブラリ無しで   いきます!!

Page 10: Canvas de shooting 制作のポイント

ライブラリなしだとこんな大変なのか!とか、 ライブラリ無くても全然イケんじゃん!とか、 を感じて貰えれば幸いです。

Page 11: Canvas de shooting 制作のポイント

では目次へ

Page 12: Canvas de shooting 制作のポイント

Agenda

1. HTML5 Canvasで今回利用する技術紹介

2. 実装内容のご紹介(ここメイン!!)

3. Canvas de Shootingの課題

4. 最後に

Page 13: Canvas de shooting 制作のポイント

Agenda

1. HTML5 Canvasで今回利用する技術紹介

Canvasの技術を4つ紹介します

Page 14: Canvas de shooting 制作のポイント

1. Canvasの準備

// Canvasエレメントを取得

var canvas = document.getElementById("myCanvas"); // 描画命令を行う為のコンテキストを取得

var ctx = canvas.getContext("2d");

Page 15: Canvas de shooting 制作のポイント

2. 色の指定 // 塗りつぶしの色を指定

ctx.fillStyle = "rgb(0,255,0)"; // 緑 ctx.fillStyle = "rgb(255,255,0)"; // 黄 ctx.fillStyle = "rgb(255,0,0)"; // 青

利用用途:壁色の指定、ショットの色の指定

Page 16: Canvas de shooting 制作のポイント

3. 図形の描画と、画像の描画

// 四角形の描画ctx.fillRect(posX, posY, width, height);

// 画像の描画ctx.drawImage(imageObject, posX, posY);

利用用途:ショットの描画、自機や敵機の描画

Page 17: Canvas de shooting 制作のポイント

4. 描画内容のクリア

// Canvas上の描画内容をクリアctx.clearRect(posX, posY , width, height);

利用用途:MainLoopで再描画する時に使う

Page 18: Canvas de shooting 制作のポイント

えっ!?これだけ?

Page 19: Canvas de shooting 制作のポイント

はい!これだけです。

Page 20: Canvas de shooting 制作のポイント

続いて、実装内容の紹介です

Page 21: Canvas de shooting 制作のポイント

Agenda

1. HTML5 Canvasで今回利用する技術紹介

2. 実装内容のご紹介(ここメイン!!)

3. Canvas de Shootingの課題

4. 最後に

Page 22: Canvas de shooting 制作のポイント

まずは初期処理です

Page 23: Canvas de shooting 制作のポイント

1. 初期化処理

// Canvasを取得var canvas = document.getElementById("myCanvas");

// Canvasの大きさを画面に合わせる

canvas.width = window.innerWidth || 800;canvas.height = window.innerHeight * 0.95 || 400;

// contextを生成する

var ctx = canvas.getContext("2d");

Page 24: Canvas de shooting 制作のポイント

1. 初期化処理

// 使う画像を、事前に読み込みますimg_plane = new Image();img_plane.src = "img/plane.png";img_plane.onload = function () {

// 読み込み終了した状態を保存

imageLoadDone = true;}

Page 25: Canvas de shooting 制作のポイント

次にメインループです

Page 26: Canvas de shooting 制作のポイント

// 描画や当たり判定を行うMainLoopをつくるvar gameMainLoop = function () { // 今回は、mainLoop内で再描画します

ctx.clearRect(0, 0, w, h);} // setIntervalでゲームを開始!

var timer = setInterval(gameMainLoop, 50);

2. MainLoopを開始する

Page 27: Canvas de shooting 制作のポイント

ここまでで、

以下のような画面が出来ます

真っ暗です。でも動いてます。

Page 28: Canvas de shooting 制作のポイント

自機を動かします

Page 29: Canvas de shooting 制作のポイント

// まずは自機を表すオブジェクトを作ります

var plane = { img : img_plane, posX : 10, posY : (h - img_plane.height) / 2, life : 3}

3. 自機を動かす ①

Page 30: Canvas de shooting 制作のポイント

// 自機を動かす為に、keypressイベントを監視しますdocument.onkeypress = function (e) { // 例えば自機を上に動かす場合

if (e.keyCode == 101/*E*/) { plane.posY -= 5; }}

3. 自機を動かす ②

Page 31: Canvas de shooting 制作のポイント

// そしてメインループ内で、自機を描画します

var gameMainLoop = function () { // 自機を描画する ctx.drawImage(plane.img, plane.posX, plane.posY);}

3. 自機を動かす ③

Page 32: Canvas de shooting 制作のポイント

自機で攻撃してみます

Page 33: Canvas de shooting 制作のポイント

// 自機ショットを保持する配列を定義します

var plane_balls = []; // 自機ショットは、以下のオブジェクト型と

// します

var ball = { radius : 5, posX : 10, posY : 10, speed : 10}

4. 自機がショットを撃つ ①

Page 34: Canvas de shooting 制作のポイント

// "K"ボタンが押されたら、ショットを生成

document.onkeypress = function () {

if (e.keyCode == 107/*K*/) { var newBall = { radius : 5, posX : plane.posX, posY : plane.posY, speed : 10 };

plane_balls.push(newBall); }}

4. 自機がショットを撃つ ②

Page 35: Canvas de shooting 制作のポイント

// mainLoop内で、speed分だけ移動させて描画する

var gameMainLoop = function () { for (var i = 0; i < plane_balls.length; i++) {

var ball = plane_balls[i]; ball.posX += ball.speed; ctx.fillStyle = "rgba(200,0,0,1)"; ctx.fillRect(ball.posX, ball.posY, ball.radius, ball.radius); }}

4. 自機がショットを撃つ ③

Page 36: Canvas de shooting 制作のポイント

これで自機を動かして、

攻撃できるようになりました

Page 37: Canvas de shooting 制作のポイント

次に、敵機を出現させます

Page 38: Canvas de shooting 制作のポイント

// まずは敵機を保持する配列を定義します

var enemies = []; // 敵機は、以下のオブジェクト定義とします

var enemy = { img : img, /* 今回は2種類の画像を使う */

posX : x, posY : y, speed : s};

5. 敵機を出現させる ①

Page 39: Canvas de shooting 制作のポイント

// 敵機はランダムに出現させますfunction createEnemy () { var num =(Math.floor((Math.random()*100)%100); if (num < 5) { var s = num; var i = (num%2==0 ? imgE01 : imgE02); var y = canvasHeght * Math.random(); var x = canvasWidth; var enemy = {img:i, posX:x, posY:y, speed:s}; enemies.push(enemy); }}

5. 敵機を出現させる ②

Page 40: Canvas de shooting 制作のポイント

// MainLoop内でspeed分、左に移動させて描画

var gameMainLoop = function () { for (var i = 0; i < enemies.length; i++) {

var enemy = enemies[i]; var enemy.posX -= enemy.speed;

ctx.drawImage(enemy.img, enemy.posX, enemy.posY); }}

5. 敵機を出現させる ③

Page 41: Canvas de shooting 制作のポイント

これで敵機が左に向かって、

動くようになりました

Page 42: Canvas de shooting 制作のポイント

当たり判定です

Page 43: Canvas de shooting 制作のポイント

当たり判定は、物体と物体が重なったか、否かを判断します。重なっている場合には、2つの物体同士が当たっていると考えます。

6.当たり判定を行う ①

Hit!!

Page 44: Canvas de shooting 制作のポイント

例えば自機ショットと敵機の当たり判定の場合を説明します。

6.当たり判定を行う ②

x座標 = PosXy座標 = PosY

radius

x座標 = PosX+radiusy座標 = PosY

x座標 = PosX+radiusy座標 = PosY+radius

x座標 = PosXy座標 = PosY

x座標 = PosXy座標 = PosY + img.height

Page 45: Canvas de shooting 制作のポイント

// ソースコードではこんな感じですvar b = plane_balls[i];var e = enemies[j];

if ((b.posX + b.radius) >= e.posX /* x 座標 */

&& b.posY <= e.posY+e.img.width /* y座標下 */

&& b.posY >= e.posY) { /* y座標上 */

delete plane_balls[i]; delete enemies[j];}

6.当たり判定を行う ③

Page 46: Canvas de shooting 制作のポイント

// 最後にdeleteした要素をお掃除する// 例えば自機ショットの場合

var new_plane_balls = [];

for (var i = 0; i < plane_balls.length; i++) { if (plane_balls[i]) new_plane_balls.push(plane_balls[i]);} plane_balls = new_plane_balls;

6. 当たり判定を行う ④

Page 47: Canvas de shooting 制作のポイント

// ボスを倒すか、自機が倒されたら終わりif (deadBoss() || deadSelf()) { // mainLoopを終了させる

clearTimeout(timer); // メッセージを表示する

if (deadBoss()) alert("CONGURATURATION!!"); else alert("GAME OVER");}

7.GameOver or GameClear ①

Page 48: Canvas de shooting 制作のポイント

これでシューティングゲームが

できました(*゚▽゚)ノ

Page 49: Canvas de shooting 制作のポイント

Agenda

1. HTML5 Canvasで今回利用する技術紹介

2. 実装内容のご紹介(ここメイン!!)

3. Canvas de Shootingの課題

4. 最後に

Page 50: Canvas de shooting 制作のポイント

3. Canvas de Shootingの課題

・JavaScriptの各種ブラウザ対応 ・ゲームプランニング(駆け引きの設定など) ・Canvas 2Dの描画性能 ・課金方法

Page 51: Canvas de shooting 制作のポイント

そして、最後に。

Page 52: Canvas de shooting 制作のポイント

長時間のご清聴、ありがとうございました。 ライブラリに依存しないゲーム制作の内容をお伝えしてきました。 このプレゼンテーションから何か感じたものがあったら幸いです。 実際のゲームやソースコードは、こちらにあります。ご興味あればご覧頂ければ幸いです。 http://www.yoheim.net/labo/html5/canvasShooting.html

Page 53: Canvas de shooting 制作のポイント

HTML5って便利で面白くて、そして触りは簡単だと思います。 これからもHTML5をたくさん触れていきたいと思います。その中で何か皆様のお役に立てる事が出来れば、良いなぁと感じる。 今日はお時間頂きましてありがとうございました。             Yohei Munesada