SlideShare a Scribd company logo
1 of 37
Download to read offline
テーマ1
enchant.js で ゲーム作り
(4)
2015/05/19
苫小牧高専 ソフトウェアテクノロジー部
今日やること
• テスト前の活動について
• ちょっとしたアンケート
• 前回のまとめ
• ゲームオーバーの処理を追加してみよう
• クラスを使ってみよう
前回のまとめ
インデント
どっちが見やすい?
enchant();
window.onload = function() {
var core = new Core(320, 320);
core.preload('chara1.png');
core.onload = function() {
var bear = new Sprite(32, 32);
bear.image = core.assets['chara1.png'];
bear.x = 0;
bear.y = 0;
core.rootScene.addChild(bear);
}
core.start();
}
enchant();
window.onload = function() {
var core = new Core(320, 320);
core.preload('chara1.png');
core.onload = function() {
var bear = new Sprite(32, 32);
bear.image = core.assets['chara1.png'];
bear.x = 0;
bear.y = 0;
core.rootScene.addChild(bear);
}
core.start();
}
インデントあり インデントなし
インデントとは
• インデント = 字下げ
• インデントを使って、

入れ子になっている部分をわかりやすくするべし。
• インデントは、キーボードの[tab]キーで!

(スペースキー連打はダメよ)
• 自分と、他人(3日後の自分も他人!)が

見やすいコードを書くよう心がけよう!
ラベルを表示してみる

∼ストップウォッチを表示してみよう∼
前回のテーマ(1)
ストップウォッチ的な
main.js
// 省略
if (core.input.down) {
this.y += 3;
}
});
var label = new Label();
label.x = 280;
label.y = 5;
label.color = 'red';
label.font = '14px "Arial"';
label.text = '0';
label.on('enterframe', function() {
label.text = core.frame / core.fps;
});
core.rootScene.addChild(bear);
core.rootScene.addChild(label);
}
core.start();
}
← labelを作成
← 座標指定(おなじみ)
← 色指定
← フォントとサイズ
← addChildを忘れずに!
← たぶんaddEventListenerと同じ
label.on
label.on('enterframe', function() {
label.text = core.frame / core.fps;
});
• たぶんaddEventListenerと同じ
• label.text は labelに表示されるテキスト。

そこに core.frame / core.fps を格納している。
• 現在のフレーム数をfpsで割れば秒数が出るよ!!
衝突判定をやってみる



∼いよいよゲームっぽくなってきたかも∼
前回のテーマ(2)
within
if (this.within(enemy, 15)) {
label.text = 'HIT!';
}
• thisはbear
• this.within(enemy, 15)

thisの中心とenemyの中心が15px近づいたらHIT!
• 数値を変えれば衝突判定を厳しくしたり、

ゆるくしたりできる。
ゲームオーバーの処理



∼いよいよゲームっぽくなってきたかも∼
今日のテーマ(1)
main.js
// 略
core.onload = function() {
var bear = new Sprite(32, 32);
// 中略
var gameOverScene = new Scene();
gameOverScene.backgroundColor = 'black';
var gameOverLabel = new Label();
gameOverLabel.x = 100;
gameOverLabel.y = 160;
gameOverLabel.color = 'red';
gameOverLabel.font = '24px "Arial"';
gameOverLabel.text = 'GAME OVER!!';
bear.addEventListener('enterframe', function() {
// 中略
if (this.within(enemy, 15)) {
core.pushScene(gameOverScene);
gameOverScene.addChild(gameOverLabel);
core.stop();
}
});
// 略
ゲームオーバー処理
シーンについて復習
• coreオブジェクトを作成。

coreオブジェクトは最初からrootSceneを持っている。
• クマさん(Sprite)やテキスト(Label)を作るたびに、

core.rootSceneにaddChildしていく。
// 第1回目で書いたソースコード
enchant();
window.onload = function() {
var core = new Core(320, 320);
core.preload('chara1.png');
core.onload = function() {
// 中略
core.rootScene.addChild(bear);
}
core.start();
}
自作のシーンを使う
• 自作のシーンをrootSceneに重ねるイメージ。
ゲームオーバー処理を作る
• 自作シーンもSpriteやLabelと同様に作る。
var gameOverScene = new Scene();
gameOverScene.backgroundColor = 'black';
• シーンを出す処理
if (this.within(enemy, 15a)) { // 前回やった within
core.pushScene(gameOverScene); // core.pushScene(yourSceneName)でシーンを出す
core.stop(); // ゲームをstop
}
• rootSceneと同様にaddChildもできる
gameOverScene.addChild(gameOverLabel); // gameOverLabelは前のスライド参照
• rootSceneを自作シーン(gameOverScene)で

覆い被さるイメージ。
クラスを使ってみよう



∼いよいよゲームっぽくなってきたかも∼
今日のテーマ(2)
突然ですが、そろそろ暖かく
なってきてクマも冬眠から覚
める頃かと思うので、大量に
クマさんを表示してみたいと
思います。手始めに白いクマ
さん(Sprite)を50体作っ
て画面に表示してください。
var bear1 = new Sprite(32, 32);
bear1.image = core.assets['chara1.png'];
bear1.x = 280;
bear1.y = 50;
bear1.frame = 5;
var bear2 = new Sprite(32, 32);
bear2.image = core.assets['chara1.png'];
bear2.x = 200; // クマさん同士が重ならないように適当に
bear2.y = 30; // 座標を変えてね
bear2.frame = 5;
var bear3 = new Sprite(32, 32);
bear3.image = core.assets['chara1.png'];
bear3.x = 100;
bear3.y = 50;
bear3.frame = 5;
var bear4 = new Sprite(32, 32);
bear4.image = core.assets[‘chara1.png'];

// 略
// これを40回以上繰り返す(頑張れ
さて、50体の白いクマさん
を作ってもらいましたが、やっ
ぱり白いクマさんだとあり
きたりなので、白いクマさ
んじゃなくてピンクのクマ
さんに変更してください。
var bear1 = new Sprite(32, 32);
bear1.image = core.assets['chara1.png'];
bear1.x = 280;
bear1.y = 50;
bear1.frame = 5;
var bear2 = new Sprite(32, 32);
bear2.image = core.assets['chara1.png'];
bear2.x = 280;
bear2.y = 50;
bear2.frame = 5;
var bear3 = new Sprite(32, 32);
bear3.image = core.assets['chara1.png'];
bear3.x = 280;
bear3.y = 50;
bear3.frame = 5;
var bear4 = new Sprite(32, 32);
bear4.image = core.assets[‘chara1.png'];

// 略
← ここを bearN.frame = 9 にする 50回
            / ̄ ̄\
          /   _ノ  \
          |    ( ●)(●)
          |     (__人__)
             |     ` ⌒´ノ   学生時代に打ち込んだものは?
              |         }
              ヽ        }
            ヽ、.,__ __ノ
   _, 、 -― ''"::l:::::::\ー-..,ノ,、.゙,i 、
  /;;;;;;::゙:':、::::::::::::|_:::;、>、_ l|||||゙!:゙、-、_
 丿;;;;;;;;;;;:::::i::::::::::::::/:::::::\゙'' ゙||i l\>::::゙'ー、
. i;;;;;;;;;;;;;;;;;;;;;;|::::::::::::::\::::::::::\ .||||i|::::ヽ::::::|:::!
/;;;;;;;;;;;;;;;;;;;;;;;;![面接官 ]\:::::::::ヽ|||||:::::/::::::::i:::|
;;;;;;;;;;;;;;;;;;;;;;;;;;|;;;;:::::::::::::::::::::::\:::::゙、|||:::/::::::::::|:::
       ____
    /      \
   /  ─    ─\
 /    (●) (●) \    キーボードです
 |       (__人__)    |
 \     ` ⌒´   /
,,.....イ.ヽヽ、___ ーーノ゙-、.
:   |  '; \_____ ノ.| ヽ i
    |  \/゙(__)\,|  i |
    >   ヽ. ハ  |   ||
var bear1 = new Sprite(32, 32);
bear1.image = core.assets['chara1.png'];
bear1.x = 280;
bear1.y = 50;
bear1.frame = 5;
var bear2 = new Sprite(32, 32);
bear2.image = core.assets['chara1.png'];
bear2.x = 280;
bear2.y = 50;
bear2.frame = 5;
var bear3 = new Sprite(32, 32);
bear3.image = core.assets['chara1.png'];
bear3.x = 280;
bear3.y = 50;
bear3.frame = 5;
var bear4 = new Sprite(32, 32);
bear4.image = core.assets[‘chara1.png'];

// 略
// これを40回以上繰り返す(頑張れ
1.bearN(Nは自然数)を作成
2.bear.imageの指定
3.bearの座標を指定
4.bearのframeを指定
5.rootScene.addChild
やってることは皆同じ。
違うのは、座標だけ。
共通部分は

まとめられるのでは?
クマさんの共通部分
• Sprite型の変数である
• this.image は chara1.png である
• 1フレームごとにx += 5する処理
• 画面の端へ行ったらx座標を0にする的な処理
など
enchant();
window.onload = function() {
var core = new Core(320, 320);
core.preload('chara1.png');
core.onload = function() {
var Bear = Class.create(Sprite, {
initialize: function(x, y) {
Sprite.call(this, 32, 32);
this.x = x;
this.y = y;
this.image = core.assets['chara1.png'];
this.addEventListener('enterframe', function() {
this.frame = this.age % 3;
this.x += 3;
if (this.x > 320) {
this.x = 0;
}
});
core.rootScene.addChild(this);
}
});
var bear = new Bear(0, 0);
}
core.start();
}
せっかくなので大々的に書き直そう
var bear = new Bear(0, 0);
var bear2 = new Bear(10, 0);
var bear3 = new Bear(30, 20);
var bear4 = new Bear(50, 100); // 変えるのは座標だけでOK! もっと楽にやる方法もあるヨ
一度Bearクラスを
定義してしまえば…
クラス
クラス
• オブジェクトが持つデータと振る舞いを定義した設
計図のようなもの。

 オブジェクト: クマさん(Sprite)とか

         ストップウォッチ(Label)とか
• 詳しい話は次回する(かも)
もうちょっとだけクラス
• もし、犬を表すクラス Dog があったら……
• dog = new Dog(40, 8) // 身長40cm 体重8kg

dog.name = ポチ // 名前データは犬

dog.run() // 犬を走らせる
var Bear = Class.create(Sprite, {
initialize: function(x, y) {
Sprite.call(this, 32, 32);
this.x = x;
this.y = y;
this.image = core.assets['chara1.png'];
this.addEventListener('enterframe', function() {
this.frame = this.age % 3;
this.x += 3;
if (this.x > 320) {
this.x = 0;
}
});
core.rootScene.addChild(this);
}
});
定義済みのクラスから
新しく変数を作る
← 基本形
initialize: function(与える値) {

初期化処理;
}
←addChildも
 ここでできる
↑this.○○ でデータにアクセスできる。
↑ おまじない
var bear = new Bear(0, 0);
var bear2 = new Bear(10, 30);
var bear3 = new Bear(50, 10);
var bear4 = new Bear(200, 50);
クラスから
新しいインスタンスを生成
• var bear = new Bear(50, 100);

というように変数を作れば、めんどくさい処理(座標
の初期設定とか)を全部クラス側でやってくれる。
• initialize: function(x, y) { … } のx, yは

こちらで指定できる部分。
課題1
1. Bearクラスに、

キーボードの矢印キーで移動する処理 

を書き加えよう!
2. 敵を表すEnemyクラスを作ってみよう!

・敵とわかりやすいよう白クマさんに。

・初期座標と移動方向、スピードはランダムに。

・プレイヤーのクマさんと衝突したら

 ゲームオーバーにしてゲームをstopさせよう。

・Math.floor(Math.random() * 300);

 で 0以上300以下のランダムな整数が取れる。

More Related Content

What's hot

R Language Definition 2.2 to 2.3
R Language Definition 2.2 to 2.3R Language Definition 2.2 to 2.3
R Language Definition 2.2 to 2.3
Kohta Ishikawa
 
MySQL勉強会 インデックス編.2013 08-02
MySQL勉強会 インデックス編.2013 08-02MySQL勉強会 インデックス編.2013 08-02
MySQL勉強会 インデックス編.2013 08-02
CROOZ, inc.
 
2012年1月13日
2012年1月13日2012年1月13日
2012年1月13日
nukaemon
 
三角関係になったときの対処法
三角関係になったときの対処法三角関係になったときの対処法
三角関係になったときの対処法
Yachiyo Suzuki
 

What's hot (17)

Gtug girls-20140828
Gtug girls-20140828Gtug girls-20140828
Gtug girls-20140828
 
R's anti sparseness
R's anti sparsenessR's anti sparseness
R's anti sparseness
 
とあるイルカのバーボンハウス
とあるイルカのバーボンハウスとあるイルカのバーボンハウス
とあるイルカのバーボンハウス
 
PostgreSQL:行数推定を読み解く
PostgreSQL:行数推定を読み解くPostgreSQL:行数推定を読み解く
PostgreSQL:行数推定を読み解く
 
Perl for visualization
Perl for visualizationPerl for visualization
Perl for visualization
 
今更ながらDBのカウントアップの話
今更ながらDBのカウントアップの話今更ながらDBのカウントアップの話
今更ながらDBのカウントアップの話
 
Rで触れる日本経済~RでVAR編~
Rで触れる日本経済~RでVAR編~Rで触れる日本経済~RでVAR編~
Rで触れる日本経済~RでVAR編~
 
より深く知るオプティマイザとそのチューニング
より深く知るオプティマイザとそのチューニングより深く知るオプティマイザとそのチューニング
より深く知るオプティマイザとそのチューニング
 
R Language Definition 2.2 to 2.3
R Language Definition 2.2 to 2.3R Language Definition 2.2 to 2.3
R Language Definition 2.2 to 2.3
 
20170923 excelユーザーのためのr入門
20170923 excelユーザーのためのr入門20170923 excelユーザーのためのr入門
20170923 excelユーザーのためのr入門
 
TarandocでJSONを永続化
TarandocでJSONを永続化TarandocでJSONを永続化
TarandocでJSONを永続化
 
Monadicプログラミング マニアックス
Monadicプログラミング マニアックスMonadicプログラミング マニアックス
Monadicプログラミング マニアックス
 
MySQL勉強会 インデックス編.2013 08-02
MySQL勉強会 インデックス編.2013 08-02MySQL勉強会 インデックス編.2013 08-02
MySQL勉強会 インデックス編.2013 08-02
 
Gorinphp0729
Gorinphp0729Gorinphp0729
Gorinphp0729
 
2012年1月13日
2012年1月13日2012年1月13日
2012年1月13日
 
三角関係になったときの対処法
三角関係になったときの対処法三角関係になったときの対処法
三角関係になったときの対処法
 
Aaなゲームをjsで
AaなゲームをjsでAaなゲームをjsで
Aaなゲームをjsで
 

Viewers also liked

Viewers also liked (6)

苫小牧高専 ソフトウェアテクノロジー部 enchant.jsでゲーム作り 1
苫小牧高専 ソフトウェアテクノロジー部 enchant.jsでゲーム作り 1苫小牧高専 ソフトウェアテクノロジー部 enchant.jsでゲーム作り 1
苫小牧高専 ソフトウェアテクノロジー部 enchant.jsでゲーム作り 1
 
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
苫小牧高専 ソフトウェアテクノロジー部 Rubyで遊ぼう 1
 
苫小牧高専 ソフトウェアテクノロジー部 enchant.jsでゲーム作り 2
苫小牧高専 ソフトウェアテクノロジー部 enchant.jsでゲーム作り 2苫小牧高専 ソフトウェアテクノロジー部 enchant.jsでゲーム作り 2
苫小牧高専 ソフトウェアテクノロジー部 enchant.jsでゲーム作り 2
 
ブログ駆動人生 - 高専生のキャリアについて考える会(20150823)
ブログ駆動人生 - 高専生のキャリアについて考える会(20150823)ブログ駆動人生 - 高専生のキャリアについて考える会(20150823)
ブログ駆動人生 - 高専生のキャリアについて考える会(20150823)
 
Global Game Jam Sapporo 2016 参加記 - Josho.LT
Global Game Jam Sapporo 2016 参加記 - Josho.LTGlobal Game Jam Sapporo 2016 参加記 - Josho.LT
Global Game Jam Sapporo 2016 参加記 - Josho.LT
 
第2回 Framgia × LOUPE 勉強会 「Chrome Extensionいじってみた話」
第2回 Framgia × LOUPE 勉強会 「Chrome Extensionいじってみた話」第2回 Framgia × LOUPE 勉強会 「Chrome Extensionいじってみた話」
第2回 Framgia × LOUPE 勉強会 「Chrome Extensionいじってみた話」
 

More from Takuya Mukohira

More from Takuya Mukohira (13)

2015年度苫小牧高専情報工学科 学外実習発表会 発表資料
2015年度苫小牧高専情報工学科 学外実習発表会 発表資料2015年度苫小牧高専情報工学科 学外実習発表会 発表資料
2015年度苫小牧高専情報工学科 学外実習発表会 発表資料
 
向平卓矢について - 2015/12/23 ITエンジニア高専 逆求人
向平卓矢について - 2015/12/23 ITエンジニア高専 逆求人向平卓矢について - 2015/12/23 ITエンジニア高専 逆求人
向平卓矢について - 2015/12/23 ITエンジニア高専 逆求人
 
苫小牧高専 ソフトウェアテクノロジー部 enchant.jsでゲーム作り 5
苫小牧高専 ソフトウェアテクノロジー部 enchant.jsでゲーム作り 5苫小牧高専 ソフトウェアテクノロジー部 enchant.jsでゲーム作り 5
苫小牧高専 ソフトウェアテクノロジー部 enchant.jsでゲーム作り 5
 
Web APIを使って生活を便利にしたい件
Web APIを使って生活を便利にしたい件Web APIを使って生活を便利にしたい件
Web APIを使って生活を便利にしたい件
 
開発の道具についてのお話 LOUPE Study #15
開発の道具についてのお話 LOUPE Study #15開発の道具についてのお話 LOUPE Study #15
開発の道具についてのお話 LOUPE Study #15
 
やってみようCHaser - LOUPE Study #7
やってみようCHaser - LOUPE Study #7やってみようCHaser - LOUPE Study #7
やってみようCHaser - LOUPE Study #7
 
Sinatra軽量Web開発 - LOUPE Study #1
Sinatra軽量Web開発 - LOUPE Study #1Sinatra軽量Web開発 - LOUPE Study #1
Sinatra軽量Web開発 - LOUPE Study #1
 
Nokogiri on Rails
Nokogiri on RailsNokogiri on Rails
Nokogiri on Rails
 
第4回 釧路OSS札幌 勉強会「自己紹介LT」 #946oss札幌
第4回 釧路OSS札幌 勉強会「自己紹介LT」 #946oss札幌第4回 釧路OSS札幌 勉強会「自己紹介LT」 #946oss札幌
第4回 釧路OSS札幌 勉強会「自己紹介LT」 #946oss札幌
 
Git学ぼうぜの会 ハンズオン資料 - LOCAL学生部 GWイベント
Git学ぼうぜの会 ハンズオン資料 - LOCAL学生部 GWイベントGit学ぼうぜの会 ハンズオン資料 - LOCAL学生部 GWイベント
Git学ぼうぜの会 ハンズオン資料 - LOCAL学生部 GWイベント
 
LT Kosenconf946 #2
LT Kosenconf946 #2LT Kosenconf946 #2
LT Kosenconf946 #2
 
学校にギークっぽい集団を作ってみたかった Kosenconf946 #2
学校にギークっぽい集団を作ってみたかった Kosenconf946 #2学校にギークっぽい集団を作ってみたかった Kosenconf946 #2
学校にギークっぽい集団を作ってみたかった Kosenconf946 #2
 
120811高専カンファin旭川 ふるさと自慢(千歳と恵庭)
120811高専カンファin旭川 ふるさと自慢(千歳と恵庭)120811高専カンファin旭川 ふるさと自慢(千歳と恵庭)
120811高専カンファin旭川 ふるさと自慢(千歳と恵庭)
 

苫小牧高専 ソフトウェアテクノロジー部 enchant.jsでゲーム作り 4