SlideShare une entreprise Scribd logo
1  sur  17
MPS Setagaya 第10回 (2015/11/29) ミーティング
JavaScript でパックマン! 第7回
金子純也
Morning Project Samurai 代表
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
本日の目標
• パックマンを追跡し殺すあかべーを作り動かす!

- JavaScript における継承の実現
コードは mpssd_pacman_20151129 で github.com を検索 !
https://github.com/morningprojectsamurai/mpssd_pacman_20151129MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
継承
Character
Pacman と Akabeiに

共通の性質 (properties)と
機能 (methods) を持つ
Character の properties と methodsに加え
独自のものも持つ
親
子
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
継承の利点
• キャラを楽に増やすことが可能!
• 保守や変更が楽!
全てのキャラに共通のコードは再利用可能
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
オブジェクトの作成
• Step1:

コンストラクタの作成 (Properties の定義)

var Pacman = function (radius, speed, theta, …) {

this.radius = radius;

…

}
• Step2:

メソッドの定義

Pacman.prototype.move = function() {

…

}
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
JavaScript における継承の実現
• ステップ1:

キャラクターに共通の properties と methods を
持ったオブジェクト Character を作成
• ステップ2:

具体的なキャラクタのオブジェクトを作成

- Character オブジェクトのコンストラクタを

内部で呼び出し、Character オブジェクトの

Prototype を Prototype として持つ
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
Character と Pacman オブジェクト
var Character = function (speed, map, row, col) {…};
Character.prototype.move = function() {…};
var inheritFromCharacter = function (childClass) {
var CharacterTempConstructor = function () {
};
CharacterTempConstructor.prototype = Character.prototype;
childClass.prototype = new CharacterTempConstructor();
childClass.prototype.constructor = childClass;
};
var Pacman = function (radius, speed, theta, map, row, col) {
Character.call(this, speed, map, row, col);
…
};
inheritFromCharacter(Pacman);
Pacman.prototype.getRadius = function () {…};
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
Character と Pacman オブジェクト
var Character = function (speed, map, row, col) {…};
Character.prototype.move = function() {…};
var inheritFromCharacter = function (childClass) {
var CharacterTempConstructor = function () {
};
CharacterTempConstructor.prototype = Character.prototype;
childClass.prototype = new CharacterTempConstructor();
childClass.prototype.constructor = childClass;
};
var Pacman = function (radius, speed, theta, map, row, col) {
Character.call(this, speed, map, row, col);
…
};
inheritFromCharacter(Pacman);
Pacman.prototype.getRadius = function () {…};
Character オブジェクト
のコンストラクタの定義
とメソッドの定義
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
Character と Pacman オブジェクト
var Character = function (speed, map, row, col) {…};
Character.prototype.move = function() {…};
var inheritFromCharacter = function (childClass) {
var CharacterTempConstructor = function () {
};
CharacterTempConstructor.prototype = Character.prototype;
childClass.prototype = new CharacterTempConstructor();
childClass.prototype.constructor = childClass;
};
var Pacman = function (radius, speed, theta, map, row, col) {
Character.call(this, speed, map, row, col);
…
};
inheritFromCharacter(Pacman);
Pacman.prototype.getRadius = function () {…};
Character オブジェクトのメソッドを持つ
CharacterTempConsutuctor オブジェクトを
作成し子のプロトタイプとして設定する関数
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
Character と Pacman オブジェクト
var Character = function (speed, map, row, col) {…};
Character.prototype.move = function() {…};
var inheritFromCharacter = function (childClass) {
var CharacterTempConstructor = function () {
};
CharacterTempConstructor.prototype = Character.prototype;
childClass.prototype = new CharacterTempConstructor();
childClass.prototype.constructor = childClass;
};
var Pacman = function (radius, speed, theta, map, row, col) {
Character.call(this, speed, map, row, col);
…
};
inheritFromCharacter(Pacman);
Pacman.prototype.getRadius = function () {…};
Pacman オブジェクトの Properties のうち、
Character オブジェクトの持つものを

Character コンストラクタを用いて初期化
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
Character と Pacman オブジェクト
var Character = function (speed, map, row, col) {…};
Character.prototype.move = function() {…};
var inheritFromCharacter = function (childClass) {
var CharacterTempConstructor = function () {
};
CharacterTempConstructor.prototype = Character.prototype;
childClass.prototype = new CharacterTempConstructor();
childClass.prototype.constructor = childClass;
};
var Pacman = function (radius, speed, theta, map, row, col) {
Character.call(this, speed, map, row, col);
…
};
inheritFromCharacter(Pacman);
Pacman.prototype.getRadius = function () {…};
Pacman オブジェクトに Character オブジェクト

の持つ methods を継承させる。
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
Character と Pacman オブジェクト
var Character = function (speed, map, row, col) {…};
Character.prototype.move = function() {…};
var inheritFromCharacter = function (childClass) {
var CharacterTempConstructor = function () {
};
CharacterTempConstructor.prototype = Character.prototype;
childClass.prototype = new CharacterTempConstructor();
childClass.prototype.constructor = childClass;
};
var Pacman = function (radius, speed, theta, map, row, col) {
Character.call(this, speed, map, row, col);
…
};
inheritFromCharacter(Pacman);
Pacman.prototype.getRadius = function () {…};
Pacman オブジェクト独自の method を定義
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
Q: Pacman とあかべーに共通する
properties と methods は何だろう?
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
Q: Pacman とあかべーに共通する
properties と methods は何だろう?
• マップ上の移動に関する properties と methods
• 他のキャラとの距離を測る method
• etc.
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
当たり判定
d
(px, py) (ax, ay)
接触 ⇄ d <= max(あかべーの半径, Pacman の半径)
(Character.getDistance メソッド参照)
(Akabei.killPacman メソッド参照)
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
おバカなだけど割と手強いあかべー
• ステップ1:

水平方向に動くか垂直方向に動くかランダムに
決定
• ステップ2:

パックマンとの位置関係から詳細な移動方向を
決定

例: ステップ1 で水平方向を選択した場合は右左を決定
(Akabei.decideDirection 参照)
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
Q: 自分なりのあかべーアルゴリズムを
作ってみよう!
MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko

Contenu connexe

En vedette

En vedette (6)

Pythonで画像処理をやってみよう!第7回 - Scale-space 第6回 -
Pythonで画像処理をやってみよう!第7回 - Scale-space 第6回 -Pythonで画像処理をやってみよう!第7回 - Scale-space 第6回 -
Pythonで画像処理をやってみよう!第7回 - Scale-space 第6回 -
 
Pythonで画像処理をやってみよう!第8回 - Scale-space 第7回 -
Pythonで画像処理をやってみよう!第8回 - Scale-space 第7回 -Pythonで画像処理をやってみよう!第8回 - Scale-space 第7回 -
Pythonで画像処理をやってみよう!第8回 - Scale-space 第7回 -
 
数学的基礎から学ぶ Deep Learning (with Python) Vol. 2
数学的基礎から学ぶ Deep Learning (with Python) Vol. 2数学的基礎から学ぶ Deep Learning (with Python) Vol. 2
数学的基礎から学ぶ Deep Learning (with Python) Vol. 2
 
数学的基礎から学ぶ Deep Learning (with Python) Vol. 1
数学的基礎から学ぶ Deep Learning (with Python) Vol. 1数学的基礎から学ぶ Deep Learning (with Python) Vol. 1
数学的基礎から学ぶ Deep Learning (with Python) Vol. 1
 
Pythonで画像処理をやってみよう! 第1回 - ヒストグラムと濃度変換 -
Pythonで画像処理をやってみよう! 第1回 - ヒストグラムと濃度変換 -Pythonで画像処理をやってみよう! 第1回 - ヒストグラムと濃度変換 -
Pythonで画像処理をやってみよう! 第1回 - ヒストグラムと濃度変換 -
 
数学的基礎から学ぶ Deep Learning (with Python) Vol. 12
数学的基礎から学ぶ Deep Learning (with Python) Vol. 12数学的基礎から学ぶ Deep Learning (with Python) Vol. 12
数学的基礎から学ぶ Deep Learning (with Python) Vol. 12
 

Plus de Project Samurai

Python で画像処理をやってみよう! -SIFT 第5回-
Python で画像処理をやってみよう! -SIFT 第5回-Python で画像処理をやってみよう! -SIFT 第5回-
Python で画像処理をやってみよう! -SIFT 第5回-
Project Samurai
 

Plus de Project Samurai (20)

Python で画像処理をやってみよう! -SIFT 第7回-
Python で画像処理をやってみよう! -SIFT 第7回-Python で画像処理をやってみよう! -SIFT 第7回-
Python で画像処理をやってみよう! -SIFT 第7回-
 
数学的基礎から学ぶ Deep Learning (with Python) Vol. 9
数学的基礎から学ぶ Deep Learning (with Python) Vol. 9数学的基礎から学ぶ Deep Learning (with Python) Vol. 9
数学的基礎から学ぶ Deep Learning (with Python) Vol. 9
 
Python で画像処理をやってみよう! -SIFT 第6回-
Python で画像処理をやってみよう! -SIFT 第6回-Python で画像処理をやってみよう! -SIFT 第6回-
Python で画像処理をやってみよう! -SIFT 第6回-
 
数学的基礎から学ぶ Deep Learning (with Python) Vol. 8
数学的基礎から学ぶ Deep Learning (with Python) Vol. 8数学的基礎から学ぶ Deep Learning (with Python) Vol. 8
数学的基礎から学ぶ Deep Learning (with Python) Vol. 8
 
数学的基礎から学ぶ Deep Learning (with Python) Vol. 7
数学的基礎から学ぶ Deep Learning (with Python) Vol. 7数学的基礎から学ぶ Deep Learning (with Python) Vol. 7
数学的基礎から学ぶ Deep Learning (with Python) Vol. 7
 
Python で画像処理をやってみよう! -SIFT 第5回-
Python で画像処理をやってみよう! -SIFT 第5回-Python で画像処理をやってみよう! -SIFT 第5回-
Python で画像処理をやってみよう! -SIFT 第5回-
 
数学的基礎から学ぶ Deep Learning (with Python) Vol. 6
数学的基礎から学ぶ Deep Learning (with Python) Vol. 6数学的基礎から学ぶ Deep Learning (with Python) Vol. 6
数学的基礎から学ぶ Deep Learning (with Python) Vol. 6
 
Mpsy20160423
Mpsy20160423Mpsy20160423
Mpsy20160423
 
Make your Artificial Intelligence
Make your Artificial IntelligenceMake your Artificial Intelligence
Make your Artificial Intelligence
 
数学的基礎から学ぶ Deep Learning (with Python) Vol. 4
数学的基礎から学ぶ Deep Learning (with Python) Vol. 4数学的基礎から学ぶ Deep Learning (with Python) Vol. 4
数学的基礎から学ぶ Deep Learning (with Python) Vol. 4
 
数学的基礎から学ぶ Deep Learning (with Python) Vol. 3
数学的基礎から学ぶ Deep Learning (with Python) Vol. 3数学的基礎から学ぶ Deep Learning (with Python) Vol. 3
数学的基礎から学ぶ Deep Learning (with Python) Vol. 3
 
Python で画像処理をやってみよう!第11回 - SIFT Vol.1 キーポイント候補 -
Python で画像処理をやってみよう!第11回 - SIFT Vol.1 キーポイント候補 -Python で画像処理をやってみよう!第11回 - SIFT Vol.1 キーポイント候補 -
Python で画像処理をやってみよう!第11回 - SIFT Vol.1 キーポイント候補 -
 
Instagram API を使ってウェブアプリを作ろう!
Instagram API を使ってウェブアプリを作ろう!Instagram API を使ってウェブアプリを作ろう!
Instagram API を使ってウェブアプリを作ろう!
 
Pythonで画像処理をやってみよう!第6回 - Scale-space 第3回 -
Pythonで画像処理をやってみよう!第6回 - Scale-space 第3回 -Pythonで画像処理をやってみよう!第6回 - Scale-space 第3回 -
Pythonで画像処理をやってみよう!第6回 - Scale-space 第3回 -
 
Python で OAuth2 をつかってみよう!
Python で OAuth2 をつかってみよう!Python で OAuth2 をつかってみよう!
Python で OAuth2 をつかってみよう!
 
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第4回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第4回(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第4回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第4回
 
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第2回
 
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第1回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第1回(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第1回
(Pythonで作って学ぶ) Youtube の動画リストを作るアプリの開発 
第1回
 
安全なWebアプリ構築1回
安全なWebアプリ構築1回安全なWebアプリ構築1回
安全なWebアプリ構築1回
 
Pythonで画像処理をやってみよう!第5回 - Scale-space 第2回 -
Pythonで画像処理をやってみよう!第5回 - Scale-space 第2回 -Pythonで画像処理をやってみよう!第5回 - Scale-space 第2回 -
Pythonで画像処理をやってみよう!第5回 - Scale-space 第2回 -
 

JavaScript でパックマン!第7回 (一旦最終回)

  • 1. MPS Setagaya 第10回 (2015/11/29) ミーティング JavaScript でパックマン! 第7回 金子純也 Morning Project Samurai 代表 MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
  • 2. 本日の目標 • パックマンを追跡し殺すあかべーを作り動かす!
 - JavaScript における継承の実現 コードは mpssd_pacman_20151129 で github.com を検索 ! https://github.com/morningprojectsamurai/mpssd_pacman_20151129MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
  • 3. 継承 Character Pacman と Akabeiに
 共通の性質 (properties)と 機能 (methods) を持つ Character の properties と methodsに加え 独自のものも持つ 親 子 MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
  • 5. オブジェクトの作成 • Step1:
 コンストラクタの作成 (Properties の定義)
 var Pacman = function (radius, speed, theta, …) {
 this.radius = radius;
 …
 } • Step2:
 メソッドの定義
 Pacman.prototype.move = function() {
 …
 } MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
  • 6. JavaScript における継承の実現 • ステップ1:
 キャラクターに共通の properties と methods を 持ったオブジェクト Character を作成 • ステップ2:
 具体的なキャラクタのオブジェクトを作成
 - Character オブジェクトのコンストラクタを
 内部で呼び出し、Character オブジェクトの
 Prototype を Prototype として持つ MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
  • 7. Character と Pacman オブジェクト var Character = function (speed, map, row, col) {…}; Character.prototype.move = function() {…}; var inheritFromCharacter = function (childClass) { var CharacterTempConstructor = function () { }; CharacterTempConstructor.prototype = Character.prototype; childClass.prototype = new CharacterTempConstructor(); childClass.prototype.constructor = childClass; }; var Pacman = function (radius, speed, theta, map, row, col) { Character.call(this, speed, map, row, col); … }; inheritFromCharacter(Pacman); Pacman.prototype.getRadius = function () {…}; MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
  • 8. Character と Pacman オブジェクト var Character = function (speed, map, row, col) {…}; Character.prototype.move = function() {…}; var inheritFromCharacter = function (childClass) { var CharacterTempConstructor = function () { }; CharacterTempConstructor.prototype = Character.prototype; childClass.prototype = new CharacterTempConstructor(); childClass.prototype.constructor = childClass; }; var Pacman = function (radius, speed, theta, map, row, col) { Character.call(this, speed, map, row, col); … }; inheritFromCharacter(Pacman); Pacman.prototype.getRadius = function () {…}; Character オブジェクト のコンストラクタの定義 とメソッドの定義 MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
  • 9. Character と Pacman オブジェクト var Character = function (speed, map, row, col) {…}; Character.prototype.move = function() {…}; var inheritFromCharacter = function (childClass) { var CharacterTempConstructor = function () { }; CharacterTempConstructor.prototype = Character.prototype; childClass.prototype = new CharacterTempConstructor(); childClass.prototype.constructor = childClass; }; var Pacman = function (radius, speed, theta, map, row, col) { Character.call(this, speed, map, row, col); … }; inheritFromCharacter(Pacman); Pacman.prototype.getRadius = function () {…}; Character オブジェクトのメソッドを持つ CharacterTempConsutuctor オブジェクトを 作成し子のプロトタイプとして設定する関数 MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
  • 10. Character と Pacman オブジェクト var Character = function (speed, map, row, col) {…}; Character.prototype.move = function() {…}; var inheritFromCharacter = function (childClass) { var CharacterTempConstructor = function () { }; CharacterTempConstructor.prototype = Character.prototype; childClass.prototype = new CharacterTempConstructor(); childClass.prototype.constructor = childClass; }; var Pacman = function (radius, speed, theta, map, row, col) { Character.call(this, speed, map, row, col); … }; inheritFromCharacter(Pacman); Pacman.prototype.getRadius = function () {…}; Pacman オブジェクトの Properties のうち、 Character オブジェクトの持つものを
 Character コンストラクタを用いて初期化 MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
  • 11. Character と Pacman オブジェクト var Character = function (speed, map, row, col) {…}; Character.prototype.move = function() {…}; var inheritFromCharacter = function (childClass) { var CharacterTempConstructor = function () { }; CharacterTempConstructor.prototype = Character.prototype; childClass.prototype = new CharacterTempConstructor(); childClass.prototype.constructor = childClass; }; var Pacman = function (radius, speed, theta, map, row, col) { Character.call(this, speed, map, row, col); … }; inheritFromCharacter(Pacman); Pacman.prototype.getRadius = function () {…}; Pacman オブジェクトに Character オブジェクト
 の持つ methods を継承させる。 MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
  • 12. Character と Pacman オブジェクト var Character = function (speed, map, row, col) {…}; Character.prototype.move = function() {…}; var inheritFromCharacter = function (childClass) { var CharacterTempConstructor = function () { }; CharacterTempConstructor.prototype = Character.prototype; childClass.prototype = new CharacterTempConstructor(); childClass.prototype.constructor = childClass; }; var Pacman = function (radius, speed, theta, map, row, col) { Character.call(this, speed, map, row, col); … }; inheritFromCharacter(Pacman); Pacman.prototype.getRadius = function () {…}; Pacman オブジェクト独自の method を定義 MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
  • 13. Q: Pacman とあかべーに共通する properties と methods は何だろう? MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
  • 14. Q: Pacman とあかべーに共通する properties と methods は何だろう? • マップ上の移動に関する properties と methods • 他のキャラとの距離を測る method • etc. MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
  • 15. 当たり判定 d (px, py) (ax, ay) 接触 ⇄ d <= max(あかべーの半径, Pacman の半径) (Character.getDistance メソッド参照) (Akabei.killPacman メソッド参照) MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
  • 16. おバカなだけど割と手強いあかべー • ステップ1:
 水平方向に動くか垂直方向に動くかランダムに 決定 • ステップ2:
 パックマンとの位置関係から詳細な移動方向を 決定
 例: ステップ1 で水平方向を選択した場合は右左を決定 (Akabei.decideDirection 参照) MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko
  • 17. Q: 自分なりのあかべーアルゴリズムを 作ってみよう! MPS Setagaya 第10回 (2015/11/29) ミーティング資料 (c) Junya Kaneko