SVGの基本図形:rect要素
前回は、ブロック崩しのステージ設定を実装しました。今回は、SVGの基本図形であるrect
要素を使って、パドル(バー)を作成しようと思います。
初期設定ファイルにパドルの初期値を格納
前回作成したblock-breaking-init.js
にパドルの初期値を格納する変数を書き足します。
〜略〜 var game = { stage : { base : document.getElementById('stage'), svgns : 'http://www.w3.org/2000/svg', w : 500, h : 500 }, paddle : { x : 250, y : 450, w : 60, h : 10, fill: '#000' } }; 〜略〜
9〜15行目が追加した内容です。それぞれの変数の値は以下の通り。
- game.paddle.x – パドルのx座標
- game.paddle.y – パドルのy座標
- game.paddle.w – パドルの幅
- game.paddle.h – パドルの高さ
- game.paddle.fill – パドルの色
この値を元にrect
要素を生成します。
パドルのクラスを定義
パドルのインスタンスを生成するために、パドルのクラスを定義します。クラスのメソッドとして、パドルの初期値を受取る処理とその値を使用して描画する処理を定義します。
パドルの基本クラス定義
Paddle
という名前でクラスを定義します。新しくblock-breaking-paddle.js
というファイルを作成して、以下のように記述します。
function Paddle() { this.initialize.apply(this, arguments); }
apply
の引数に自分自身(this)とargumentsを渡します。arguments
はPaddleクラスのインスタンスを作成する時に渡される引数をオブジェクトで保持してくれます。
パドルの初期化処理の定義
これから、クラスの初期処理用のメッソドをinitialize
という名前で作成するのですが、過去記事:JavaScriptのapplyとcallメソッドの動作とその違いでも書いた、apply
を使用します。Paddleクラスのprototypeプロパティにinitialize
メソッドを定義します。
Paddle.prototype.initialize = function(option) { this.paddle = option.paddle; this.x = option.x; this.y = option.y; this.w = option.w; this.h = option.h; this.fill = option.fill; };
引数のoption
にargument
から値を受け取れるので、インスタンスの値として保存しておきます。この値を使用して、rect
要素を作成します。
パドルの描画処理の定義
draw
というメソッドを作成しようと思います。以下の通り定義。
Paddle.prototype.draw = function() { this.paddle.setAttribute('x', String(this.x)); this.paddle.setAttribute('y', String(this.y)); this.paddle.setAttribute('width', String(this.w)); this.paddle.setAttribute('height', String(this.h)); this.paddle.setAttribute('fill', this.fill); game.stage.base.appendChild(this.paddle); };
this.paddle
変数にrect
オブジェクトをインスタンス化する時に渡します。そのrect
オブジェクトの属性値をそれぞれセットして、 appendChild
メソッドでステージの子要素とします。
Paddleクラスからインスタンス作成
クラスも定義できたところで、このクラスを元にインスタンスを生成して描画をします。
インスタンスを生成
インスタンスの生成をします。クラスの定義ファイルと分けたいので、block-breaking-main.js
というメインの処理コードを書くファイルを新規作成して、そちらに以下のコードを書きます。
var paddle = new Paddle({ paddle: document.createElementNS(game.stage.svgns, 'rect'), x: game.paddle.x, y: game.paddle.y, w: game.paddle.w, h: game.paddle.h, fill: game.paddle.fill });
ポイントは2点。1点目は2行目のcreateElementNS
メソッド。通常、要素を生成するときには、createElement
を使用しますが、svg
要素内に子要素を作成する場合、名前空間(NameSpace)が設定されてあるので、createElementNS
メソッドを使用しないと生成されません。第一引数に名前空間(NameSpace)を指定しましょう。
もう1点は、クラスの引数にオブジェクトで初期値を渡すこと。この値をargument
で受け取って、initialize関数にて初期値のセットをします。
描画メソッド(draw)のコール
インスタンスが生成されたので、最後に描画メソッドをコールします。
function main() { paddle.draw(); } main();
できた!\(^o^)/
ステージ上にパドル(黒い四角形)が出現!ゲームの初期値を変えてみて、サイズや位置、座標などが変化するかどうか試してみましょう。
- game-block-breaking
- Author : Kazuya Takami
- Repository URL : https://github.com/miiitaka/game-block-breaking