ドラゴンレーダー風ナビ ~デザイン編~(2/4)
お絵描きには「CreateJS」を使うぞ!
ネイティブなJavaScriptとHTML5でごりごりお絵描きをしてもいいのですが、より効率良くコーディングするために、「
CreateJS」ライブラリを使います。
このライブラリは、FlashのActionScriptライクにJavaScriptのコーディングができる優れもの。
Flashと言えば、多彩なアニメーションを実装できる私も大好きなツールでしたが、Flash本体が消滅しかかっている今、CreateJSはFlashらしい体験ができる貴重なライブラリと言えるでしょう。
お絵描きをするだけなら、このライブラリの必要性をそこまで感じないかもしれませんが、この後アニメーション効果で動きをつけていく時に、その本領を発揮しますよ!
さて、CreateJSを使うための前準備。
CreateJSのJSファイルを読み込んでおきます。
<script src="https://code.createjs.com/createjs-2015.11.26.min.js"></script>
もう一つの準備。
お絵描きする土台となる「Canvas」タグを設置しましょう。
読んで字のごとく、お絵描きキャンバス。
このCanvasタグは、HTML5の目玉です。HTMLの可能性が大きく広がった!
<canvas id="myCanvas" width="260" height="300"></canvas>
Canvasに直線を描く
<script type="text/javascript">
// 画面ロード時にサンプル関数を呼び出します
window.addEventListener("load", sample1);
// サンプル1(直線を描画)
function sample1() {
// Stageオブジェクトを作成します
var stage = new createjs.Stage("myCanvas");
// Shapeオブジェクトを作成して、直線を引きます
var shape = new createjs.Shape();
shape.graphics.beginStroke("red");
shape.graphics.setStrokeStyle(3);
shape.graphics.moveTo(100, 60);
shape.graphics.lineTo(110, 35);
shape.graphics.lineTo(150, 35);
shape.graphics.lineTo(160, 60);
shape.graphics.endStroke();
// Stageに追加します
stage.addChild(shape);
// Stageの描画を更新します
stage.update();
}
</script>
beginStroke()メソッドで線の色を指定して描画を開始し、endStroke()メソッドで描画を終了します。
(※endStroke()メソッドは省略可能。書いたほうがお行儀がいいですが、普段は書かないです。)
setStrokeStyle()メソッドで線の太さを指定します。
moveTo()メソッドで描画の開始位置を指定、lineTo()メソッドで次の描画位置を指定して、直線を描画します。
ネイティブなJavaScriptとの違いは、StageにShapeを追加していく、というところでしょうか。この辺りがFlashのActionScriptと同じ実装となっています。
(ネイティブなJavaScriptの場合は、Canvasのコンテキストに描画パスを引く、という手順になります。言葉にすると難しいですが、やっていることは同じです。)
Canvasに四角形を描く
<script type="text/javascript">
// 画面ロード時にサンプル関数を呼び出します
window.addEventListener("load", sample2);
// サンプル2(四角形を描画)
function sample2() {
// Stageオブジェクトを作成します
var stage = new createjs.Stage("myCanvas");
// Shapeオブジェクトを作成して、四角形を描きます
var shape = new createjs.Shape();
shape.graphics.beginStroke("red");
shape.graphics.beginFill("pink");
shape.graphics.setStrokeStyle(2);
shape.graphics.drawRect(115, 30, 30, 5);
// Stageに追加します
stage.addChild(shape);
// Stageの描画を更新します
stage.update();
}
</script>
drawRect()メソッドで、4点を指定して四角形を描画します。
四角形のようなパスが閉じた図形は、beginFill()メソッドで、色を塗ることができます。
Canvasに円を描く
<script type="text/javascript">
// 画面ロード時にサンプル関数を呼び出します
window.addEventListener("load", sample3);
// サンプル3(円を描画)
function sample3() {
// Stageオブジェクトを作成します
var stage = new createjs.Stage("myCanvas");
// Shapeオブジェクトを作成して、円を描きます
// 1つ目の円(塗りつぶしなし)
var shape1 = new createjs.Shape();
shape1.graphics.beginStroke("blue");
shape1.graphics.setStrokeStyle(1);
shape1.graphics.drawCircle(130, 170, 105);
stage.addChild(shape1);
// 2つ目の円(グラデーションで塗りつぶし)
var shape2 = new createjs.Shape();
shape2.graphics.beginStroke("red");
shape2.graphics.setStrokeStyle(1);
shape2.graphics.beginLinearGradientFill(["#ff69b4","#ff1493"], [0.1,1.0], 130, 70, 180, 270);
shape2.graphics.drawCircle(130, 170, 100);
stage.addChild(shape2);
// Stageの描画を更新します
stage.update();
}
</script>
drawCircle()メソッドで、中心座標と半径を指定して、円を描画します。
beginLinearGradientFill()メソッドで、グラデーションを使った塗りつぶしができます。
beginFill()メソッドと同様で、パスの閉じた図形ならば使用可能です。
Canvasに円弧を描く
<script type="text/javascript">
// 画面ロード時にサンプル関数を呼び出します
window.addEventListener("load", sample4);
// サンプル4(円弧を描画)
function sample4() {
// Stageオブジェクトを作成します
var stage = new createjs.Stage("myCanvas");
// Shapeオブジェクトを作成して、円弧を描きます
// 1つ目の円弧(時計回り)
var shape1 = new createjs.Shape();
shape1.graphics.beginStroke("blue");
shape1.graphics.setStrokeStyle(3);
shape1.graphics.arc(130, 170, 115, Math.PI*1.58, Math.PI*1.42, false);
stage.addChild(shape1);
// 2つ目の円弧(反時計回り)
var shape2 = new createjs.Shape();
shape2.graphics.beginStroke("red");
shape2.graphics.setStrokeStyle(2);
shape2.graphics.arc(130, 30, 22, 0, Math.PI, true);
stage.addChild(shape2);
// Stageの描画を更新します
stage.update();
}
</script>
円弧(閉じられていない円)の場合、少しだけややこしくなります。
act()メソッドで、中心座標、半径、開始位置角度(ラジアン)、終了位置角度(ラジアン)、時計回りか反時計回りか、を指定して円弧を描画します。
角度をラジアンで指定するところが、若干難しく感じますね。
ラジアン(弧度)
弧の長さが半径と等しくなる角度を1とする角度の単位のこと。
単位記号は「rad」。ラジアンで角度を表すことを弧度法という。
- 0° = 0 rad
- 90° = 0.5 π rad
- 180° = 1 π rad
- 270° = 1.5 π rad
- 360° = 2 π rad
※π:円周率(3.141592…)