SlideShare a Scribd company logo
MPS Setagaya 第6回 (2015/09/27) ミーティング
JavaScript でパックマン! 第3回
金子純也
Morning Project Samurai 代表
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
今日の目標
JS のパスについてさらに理解する!
JS でパックマンを動かす準備!

(関数の理解)
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
前回描いたパックマン
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
arc()
arc(中心x, 中心y, 半径, 開始角度, 終了角度, 反時計回り)
* 開始角度、終了角度はラジアンで指定

(360度 = 2 * Math.PI ラジアン)
ctx.arc(100, 100, 50, 0, 1/2 * Math.PI, true);
ctx.arc(100, 100, 50, 0, 1/2 * Math.PI, false);
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
arc を使ったパックマンの描画
• ヒント1

白い扇形を赤い丸に重ねてやればいい!!
• ヒント2

扇形はどうやって作ればいい??
+
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
var cv = document.getElementById(‘pac-man');
var ctx = cv.getContext("2d");
ctx.strokeStyle="#FF0000";
ctx.fillStyle="#FF0000";
ctx.beginPath();
ctx.arc(100, 100, 50, 0, 2 * Math.PI);
ctx.fill();
ctx.strokeStyle="#FFFFFF";
ctx.fillStyle="#FFFFFF";
ctx.lineWidth=3;
ctx.beginPath();
ctx.arc(100, 100, 50, -30 * Math.PI/180, 30 * Math.PI/180)
ctx.moveTo(100, 100);
ctx.lineTo(100 + 50 * Math.cos(-30 * Math.PI/180),
100 + 50 * Math.sin(-30 * Math.PI/180));
ctx.lineTo(100 + 50 * Math.cos(30 * Math.PI/180),
100 + 50 * Math.sin(30 * Math.PI/180));
ctx.stroke();
ctx.fill();
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
var cv = document.getElementById(‘pac-man');
var ctx = cv.getContext("2d");
ctx.strokeStyle="#FF0000";
ctx.fillStyle="#FF0000";
ctx.beginPath();
ctx.arc(100, 100, 50, 0, 2 * Math.PI);
ctx.fill();
ctx.strokeStyle="#FFFFFF";
ctx.fillStyle="#FFFFFF";
ctx.lineWidth=3;
ctx.beginPath();
ctx.arc(100, 100, 50, -30 * Math.PI/180, 30 * Math.PI/180)
ctx.moveTo(100, 100);
ctx.lineTo(100 + 50 * Math.cos(-30 * Math.PI/180),
100 + 50 * Math.sin(-30 * Math.PI/180));
ctx.lineTo(100 + 50 * Math.cos(30 * Math.PI/180),
100 + 50 * Math.sin(30 * Math.PI/180));
ctx.stroke();
ctx.fill();
赤い円を描画
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
var cv = document.getElementById(‘pac-man');
var ctx = cv.getContext("2d");
ctx.strokeStyle="#FF0000";
ctx.fillStyle="#FF0000";
ctx.beginPath();
ctx.arc(100, 100, 50, 0, 2 * Math.PI);
ctx.fill();
ctx.strokeStyle="#FFFFFF";
ctx.fillStyle="#FFFFFF";
ctx.lineWidth=3;
ctx.beginPath();
ctx.arc(100, 100, 50, -30 * Math.PI/180, 30 * Math.PI/180)
ctx.moveTo(100, 100);
ctx.lineTo(100 + 50 * Math.cos(-30 * Math.PI/180),
100 + 50 * Math.sin(-30 * Math.PI/180));
ctx.lineTo(100 + 50 * Math.cos(30 * Math.PI/180),
100 + 50 * Math.sin(30 * Math.PI/180));
ctx.stroke();
ctx.fill();
口を描画
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
var cv = document.getElementById(‘pac-man');
var ctx = cv.getContext("2d");
ctx.strokeStyle="#FF0000";
ctx.fillStyle="#FF0000";
ctx.beginPath();
ctx.arc(100, 100, 50, 0, 2 * Math.PI);
ctx.fill();
ctx.strokeStyle="#FFFFFF";
ctx.fillStyle="#FFFFFF";
ctx.lineWidth=3;
ctx.beginPath();
ctx.arc(100, 100, 50, -30 * Math.PI/180, 30 * Math.PI/180)
ctx.moveTo(100, 100);
ctx.lineTo(100 + 50 * Math.cos(-30 * Math.PI/180),
100 + 50 * Math.sin(-30 * Math.PI/180));
ctx.lineTo(100 + 50 * Math.cos(30 * Math.PI/180),
100 + 50 * Math.sin(30 * Math.PI/180));
ctx.stroke();
ctx.fill();
Pathってなに?
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
パスの例
1
2
3
4
5
6
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
ctx.beginPath()
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
パスの例
1
2
3
4
5
6
ctx.beginPath()
ctx.arc()
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
パスの例
1
2
3
4
5
6
ctx.beginPath()
ctx.arc()
ctx.linTo()
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
パスの例
1
2
3
4
5
6
ctx.beginPath()
ctx.arc()
ctx.linTo()
.
.
.
ctx.linTo()
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
stroke()
1
2
3
4
5
6
ctx.beginPath()
ctx.arc()
ctx.linTo()
.
.
.
ctx.linTo()
ctx.stroke()
実際に線が描かれる
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
パスと色塗りの関係
ctx.beginPath()
ctx.arc()
ctx.linTo()
.
.
.
ctx.linTo()
ctx.fill()
パスに囲まれた部分が

塗りつぶされる MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
パスと色塗りの関係
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
パスと色塗りの関係
Q. 囲まれてるから?
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
この場合は?
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
非ゼロワインディングルール
-1
1
1
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
0
1
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
パックマンを非ワインディング
ルールを考慮して書いてみよう!
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
var cv = document.getElementById('pacman');
var ctx = cv.getContext("2d");
ctx.strokeStyle="#FF0000";
ctx.fillStyle="#FF0000";
ctx.beginPath();
ctx.arc(100, 100, 50, 30 * 

Math.PI / 180, 330 * Math.PI / 180);
ctx.lineTo(100, 100);
ctx.lineTo(100 + 50 * Math.cos(30 * Math.PI / 180), 

100 + 50 * Math.sin(30 * Math.PI / 180));
ctx.fill();
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
アニメーションに必要なこと
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
アニメーションに必要なこと
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
アニメーションに必要なこと
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
アニメーションに必要なこと
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
アニメーションに必要なこと
パックマンを何度も何度も描くこと!
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
アニメーションに必要なこと
パックマンを何度も何度も描くこと!
何度でも気軽にパックマンを
かけないと困る!
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
「パックマンを描く」というJSの命令を
新たにブラウザに教えてやる!
(関数を定義する)
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
関数
複数の命令をセットにして名前をつけたもの

(必要があれば、入力と出力を持つ)
例: パックマンを描く関数
パックマンを描くのに必要な命令をまとめたもの
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
関数の例
function drawPacman(ctx) {
ctx.strokeStyle="#FF0000";
ctx.fillStyle="#FF0000";
ctx.beginPath();
ctx.arc(100, 100, 50, 

30 * Math.PI / 180, 330 * Math.PI / 180);
ctx.lineTo(100, 100);
ctx.lineTo(100 + 50 * Math.cos(30 * Math.PI / 180), 

100 + 50 * Math.sin(30 * Math.PI / 180));
ctx.fill();
}
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
下記関数を<script>の直下に
書いて定義してみよう!
function drawPacman(ctx) {
ctx.strokeStyle="#FF0000";
ctx.fillStyle="#FF0000";
ctx.beginPath();
ctx.arc(100, 100, 50, 

30 * Math.PI / 180, 330 * Math.PI / 180);
ctx.lineTo(100, 100);
ctx.lineTo(100 + 50 * Math.cos(30 * Math.PI / 180), 

100 + 50 * Math.sin(30 * Math.PI / 180));
ctx.fill();
}
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
関数の例
function drawPacman(ctx) {
ctx.strokeStyle="#FF0000";
ctx.fillStyle="#FF0000";
ctx.beginPath();
ctx.arc(100, 100, 50, 

30 * Math.PI / 180, 330 * Math.PI / 180);
ctx.lineTo(100, 100);
ctx.lineTo(100 + 50 * Math.cos(30 * Math.PI / 180), 

100 + 50 * Math.sin(30 * Math.PI / 180));
ctx.fill();
}
関数の名前
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
関数の例
function drawPacman(ctx) {
ctx.strokeStyle="#FF0000";
ctx.fillStyle="#FF0000";
ctx.beginPath();
ctx.arc(100, 100, 50, 

30 * Math.PI / 180, 330 * Math.PI / 180);
ctx.lineTo(100, 100);
ctx.lineTo(100 + 50 * Math.cos(30 * Math.PI / 180), 

100 + 50 * Math.sin(30 * Math.PI / 180));
ctx.fill();
}
関数への入力
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
使い方
<script>
function drawPacman(ctx) {
…
}
var cv = document.getElementById('pacman');
var ctx = cv.getContext("2d");
drawPacman(ctx);
</script>
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
関数を改良してみよう
function drawPacman(ctx, cx, cy) {
ctx.strokeStyle="#FF0000";
ctx.fillStyle="#FF0000";
ctx.beginPath();
ctx.arc(cx, cy, 50, 

30 * Math.PI / 180, 330 * Math.PI / 180);
ctx.lineTo(cx, cy);
ctx.lineTo(cx + 50 * Math.cos(30 * Math.PI / 180), 

cy + 50 * Math.sin(30 * Math.PI / 180));
ctx.fill();
}
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
改良した関数を使って
複数のPacman を描いてみよう!
var cv = document.getElementById('pacman');
var ctx = cv.getContext("2d");
drawPacman(ctx, 50, 50);
drawPacman(ctx, 240, 50);
drawPacman(ctx, 400, 50);
*注意) canvas の width を 500 に変更!
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko
次回
• 今度こそ、パックマンを動かす!
• キーボードからの入力を処理する!
MPS Setagaya 第6回 (2015/09/27) ミーティング (c) Junya Kaneko

More Related Content

PDF
JavaScript でパックマン!第6回
PDF
JavaScript でパックマン! 第2回
PDF
JavaScript で パックマン! 第5回
PDF
JavaScript でパックマン!第7回 (一旦最終回)
PDF
JavaScript でパックマン!第1回
PDF
JavaScript でパックマン!第4回
PPTX
VRボドゲ実装の話
PPTX
プログラミング技法特論第8回
JavaScript でパックマン!第6回
JavaScript でパックマン! 第2回
JavaScript で パックマン! 第5回
JavaScript でパックマン!第7回 (一旦最終回)
JavaScript でパックマン!第1回
JavaScript でパックマン!第4回
VRボドゲ実装の話
プログラミング技法特論第8回

What's hot (11)

PPTX
論理指向とプログラミング2010年度秋学期第9回
ODP
ggplot2 110129
PDF
【Unite Tokyo 2018】誘導ミサイル完全マスター
PDF
Tsukuba
PDF
ggplot2 110129
PDF
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
PPTX
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
PPTX
CG2013 02
PPTX
CG2013 07
PPTX
CG2013 05
PPTX
CG2013 03
論理指向とプログラミング2010年度秋学期第9回
ggplot2 110129
【Unite Tokyo 2018】誘導ミサイル完全マスター
Tsukuba
ggplot2 110129
【Unite 2018 Tokyo】60fpsのその先へ!スマホの物量限界に挑んだSTG「アカとブルー」の開発設計
【Unity道場スペシャル 2017博多】クォータニオン完全マスター
CG2013 02
CG2013 07
CG2013 05
CG2013 03
Ad

More from Project Samurai (20)

PDF
数学的基礎から学ぶ Deep Learning (with Python) Vol. 12
PDF
Python で画像処理をやってみよう! -SIFT 第7回-
PDF
数学的基礎から学ぶ Deep Learning (with Python) Vol. 9
PDF
Python で画像処理をやってみよう! -SIFT 第6回-
PDF
数学的基礎から学ぶ Deep Learning (with Python) Vol. 8
PDF
数学的基礎から学ぶ Deep Learning (with Python) Vol. 7
PDF
Python で画像処理をやってみよう! -SIFT 第5回-
PDF
数学的基礎から学ぶ Deep Learning (with Python) Vol. 6
PDF
Mpsy20160423
PDF
Make your Artificial Intelligence
PDF
数学的基礎から学ぶ Deep Learning (with Python) Vol. 4
PDF
数学的基礎から学ぶ Deep Learning (with Python) Vol. 3
PDF
数学的基礎から学ぶ Deep Learning (with Python) Vol. 2
PDF
数学的基礎から学ぶ Deep Learning (with Python) Vol. 1
PDF
Python で画像処理をやってみよう!第11回 - SIFT Vol.1 キーポイント候補 -
PDF
Instagram API を使ってウェブアプリを作ろう!
PDF
Pythonで画像処理をやってみよう!第8回 - Scale-space 第7回 -
PDF
Pythonで画像処理をやってみよう!第7回 - Scale-space 第6回 -
PDF
Pythonで画像処理をやってみよう!第6回 - Scale-space 第3回 -
PDF
Python で OAuth2 をつかってみよう!
数学的基礎から学ぶ Deep Learning (with Python) Vol. 12
Python で画像処理をやってみよう! -SIFT 第7回-
数学的基礎から学ぶ Deep Learning (with Python) Vol. 9
Python で画像処理をやってみよう! -SIFT 第6回-
数学的基礎から学ぶ Deep Learning (with Python) Vol. 8
数学的基礎から学ぶ Deep Learning (with Python) Vol. 7
Python で画像処理をやってみよう! -SIFT 第5回-
数学的基礎から学ぶ Deep Learning (with Python) Vol. 6
Mpsy20160423
Make your Artificial Intelligence
数学的基礎から学ぶ Deep Learning (with Python) Vol. 4
数学的基礎から学ぶ Deep Learning (with Python) Vol. 3
数学的基礎から学ぶ Deep Learning (with Python) Vol. 2
数学的基礎から学ぶ Deep Learning (with Python) Vol. 1
Python で画像処理をやってみよう!第11回 - SIFT Vol.1 キーポイント候補 -
Instagram API を使ってウェブアプリを作ろう!
Pythonで画像処理をやってみよう!第8回 - Scale-space 第7回 -
Pythonで画像処理をやってみよう!第7回 - Scale-space 第6回 -
Pythonで画像処理をやってみよう!第6回 - Scale-space 第3回 -
Python で OAuth2 をつかってみよう!
Ad

JavaScript でパックマン!第3回