■概要
・HTML5のCanvasタグを使って回転しているボールを描くサンプルである。
■要点
・setIntervalを利用し、定時的にメソッドを呼ぶ
・contextのtranslate、rotate、drawImage、save、restoreを利用し、回転、イメージを描く
■ソース
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Ball</title>
</head>
<body>
<div style="text-align:center;">
<canvas id="testCanvas" width="500" height="300" style="border:1px solid #1111AA;"></canvas>
</div>
<br>Debug Space<br>
<textarea id="debugDiv" style="border:1px solid #1111AA;width:500;height:150;font-size:small"></textarea>
<script type="text/javascript">
var dncsoft;
if (!dncsoft) dncsoft = {};
dncsoft.Debug = function() {};
dncsoft.Debug.prototype = {
debug : function(p_msg) {
var debugDiv = document.getElementById('debugDiv');
if ( ! debugDiv ) return false;
debugDiv.value = debugDiv.value + p_msg + "\n";
},
clear : function() {
debugDiv.value = "";
}
};
var g_log = new dncsoft.Debug();
g_log.clear();
//-----------------------------------------------
// dncsoft.Board
//-----------------------------------------------
dncsoft.Board = function() {};
dncsoft.Board.prototype = {
_ctx : null,
getCtx : function() {
return _ctx;
},
init : function() {
_width = 500;
_height = 300;
_canvas = document.getElementById('testCanvas');
if ( ! _canvas || ! _canvas.getContext ) return false;
_ctx = _canvas.getContext('2d');
},
draw : function() {
_ctx.beginPath();
_ctx.fillStyle = "#EEEEEE";
_ctx.fillRect(0, 0, _width, _height);
}
};
//-----------------------------------------------
// dncsoft.Ball
//-----------------------------------------------
dncsoft.Ball = function() {
this._angle = 45;
this._x = 0;
this._y = 0;
};
dncsoft.Ball.prototype = {
_angle :45,
_x :0,
_y :0,
getAngle : function() {
return this._angle;
},
setAngle : function(p_angle) {
this._angle = p_angle;
},
init : function(p_ctx, p_angle) {
this._x = 200;
this._y = 100;
_radius = 32;
_speed = 1;
_rotate = 2;
_img = new Image();
_img.src = "magic_ball.png";
_ctx = p_ctx;
this._angle = p_angle;
},
draw : function() {
_rotate = (_rotate + 1) % 360;
_ctx.save();
_ctx.translate(this._x, this._y);
_ctx.rotate(_rotate/180 * Math.PI);
_ctx.translate(-16, -16);
_ctx.drawImage(_img, 0, 0, _radius, _radius);
_ctx.restore();
this._x = this._x + (5 * Math.sin(this._angle/180 * Math.PI));
this._y = this._y + (5 * Math.cos(this._angle/180 * Math.PI));
_rotate = _rotate + 4;
this.calcPath();
},
calcPath : function() {
if (this._x < 16) {
this._angle = 360 - this._angle;
} else if (this._x > 500 - 16) {
this._angle = 360 - this._angle;
} else if (this._y < 16) {
this._angle = 180 - this._angle;
} else if (this._y > 300 - 16) {
this._angle = 180 - this._angle;
}
this._angle = this._angle % 360;
}
};
//-----------------------------------------------
// main
//-----------------------------------------------
var g_board;
var g_ball;
var g_counter;
var g_timerDrawID;
window.onload = function() {
g_counter = 1000;
g_board = new dncsoft.Board();
g_board.init();
g_ball = new dncsoft.Ball();
g_ball.init(g_board.getCtx(), 30);
g_timerDrawID = setInterval("ballMove()", 25);
};
function ballMove() {
g_board.draw();
g_ball.draw();
g_counter--;
if (g_counter <= 0) clearInterval(g_timerDrawID);
}
</script>
</body>
</html>
■結果


被折叠的 条评论
为什么被折叠?



