canvasを使って、x座標、y座標で、setTime関数で動かしています。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Pong Game</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="styles.css">
<style>
body {
margin: 0;
font-family: "Century Gothic";
font-size: 16px;
}
#container {
text-align: center;
margin: 5px auto;
}
#mycanvas {
background: #AAEDFF;
}
#btn {
margin: 3px auto;
width: 200px;
padding: 5px;
background: #00AAFF;
color: #FFFFFF;
border-radius: 3px;
cursor: pointer;
}
#btn:hover {
opacity: 0.8;
}
</style>
</head>
<body>
<div id="container">
<canvas width="280" height="280" id="mycanvas">
Canvasに対応したブラウザを用意してください。
</canvas>
<div id="btn">START</div>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
<script>
$(function(){
var ctx,
myPaddle,
myBall,
mouseX,
score,
scoreLabel,
isPlaying = false,
timerId;
var canvas = document.getElementById('mycanvas');
if (!canvas|| !canvas.getContext) return false;
ctx = canvas.getContext('2d');
var Label = function(x, y){
this.x = x;
this.y = y;
this.draw = function(text){
ctx.font = 'bold 14px "Century Gothic"';
ctx.fillStyle = '#00AAFF';
ctx.textAlign = 'left';
ctx.fillText(text, this.x, this.y);
}
}
var Ball = function(x, y, vx, vy, r){
this.x = x;
this.y = y;
this.vx = vx;
this.vy = vy;
this.r = r;
this.draw = function(){
ctx.beginPath();
ctx.fillStyle = '#FF0088';
ctx.arc(this.x, this.y, this.r, 0, 2*Math.PI, true);
ctx.fill();
};
this.move = function(){
this.x += this.vx;
this.y += this.vy;
if (this.x + this.r > canvas.width || this.x - this.r < 0){
this.vx *= -1;
}
if (this.y - this.r < 0){
this.vy *= -1;
}
if (this.y + this.r > canvas.height){
// alert("game over");
isPlaying = false;
$('#btn').text('REPLAY?').fadeIn();
}
};
this.checkCollision= function(paddle){
if ((this.y + this.r > paddle.y && this.y + this.r < paddle.y + paddle.h) &&
(this.x > paddle.x - paddle.w / 2 && this.x < paddle.x + paddle.w /2)){
this.vy *= -1;
score++;
if (score % 2 === 0){
this.vx *= 1.3;
paddle.w *= 0.9;
}
}
}
}
var Paddle = function(w, h){
this.w = w;
this.h = h;
this.x = canvas.width / 2;
this.y = canvas.height - 30;
this.draw = function(){
ctx.fillStyle = '#00AAFF';
ctx.fillRect(this.x - this.w / 2, this.y, this.w, this.h);
};
this.move = function(){
this.x = mouseX - $('#mycanvas').offset().left;
}
};
function rand(min, max){
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function init(){
score = 0;
isPlaying = true;
myPaddle = new Paddle(100, 10);
myBall = new Ball(rand(50, 250), rand(10, 80), rand(3, 8), rand(3, 8), 6);
scoreLabel = new Label(10, 25);
scoreLabel.draw('SCORE: ' + score);
}
function clearStage(){
ctx.fillStyle = '#AAEDFF';
ctx.fillRect(0, 0, canvas.width, canvas.height);
}
function update(){
clearStage();
scoreLabel.draw('SCORE: ' + score);
myPaddle.draw();
myPaddle.move();
myBall.draw();
myBall.move();
myBall.checkCollision(myPaddle);
timerId =setTimeout(function(){
update();
}, 30);
if(!isPlaying) clearTimeout(timerId);
}
$('#btn').click(function(){
$(this).fadeOut();
init();
update();
});
$('body').mousemove(function(e){
mouseX = e.pageX;
});
});
</script>
</body>
</html>