http://jsfiddle.net/DkNb4/
首先基本的canvas api 要掌握
var canvas = document.getElementById(‘canvas‘);
var x = 50;
var y = 50;
var dx = 2;
var dy = 4;
var WIDTH;
var HEIGHT;
var ctx;
var paddlex;
var paddleh;
var paddlew;
var a;
var rectee = {w:60,h:10,data:[{
x:10,
y:10
},{
x:80,
y:10
},{
x:150,
y:10
},{
x:220,
y:10
},{
x:10,
y:30
},{
x:80,
y:30
},{
x:150,
y:30
},{
x:220,
y:30
}]};
function init_paddle() {
paddlex = WIDTH / 2;
paddleh = 10;
paddlew = 75;
}
function init() {
ctx = canvas.getContext("2d");
WIDTH = 300;
HEIGHT = 300;
canvas.addEventListener("mousemove",mouseMove)
a = setInterval(draw, 10);
}
function mouseMove (e) {
var rect = e.currentTarget.getBoundingClientRect();
var gravityPoint = {
x: e.clientX - rect.left,
y: e.clientY - rect.top
};
paddlex = gravityPoint.x - 30;
}
function circle(x,y,r) {
ctx.beginPath();
ctx.arc(x, y, r, 0, Math.PI*2, true);
ctx.closePath();
ctx.fill();
}
function rect(x,y,w,h) {
ctx.beginPath();
ctx.rect(x,y,w,h);
ctx.closePath();
ctx.fill();
}
function clear() {
ctx.clearRect(0, 0, WIDTH, HEIGHT);
}
function checkCollide(){
for (var i = 0; i < rectee.data.length ; i++) {
if (x <= (rectee.data[i].x + 60) && x >= (rectee.data[i].x) && rectee.data[i].y <= y && y <= (rectee.data[i].y + 10)) {
rectee.data.splice(i,1);
dy = -dy;
}
}
}
function draw() {
clear();
circle(x, y, 10);
rect(paddlex, 290, paddlew, paddleh);
for (var i = 0; i < rectee.data.length ; i++) {
rect(rectee.data[i].x, rectee.data[i].y, rectee.w, rectee.h);
}
if (rectee.data.length == 0) {
clearInterval(a);
alert("success!");
}
checkCollide();
if ((x + dx) > WIDTH || (x + dx) < 0 ) {
dx = -dx;
}
if ((y + dy) < 0) {
dy = -dy;
} else if ((y + dy) >= 290) {
if ((x + dx) >= paddlex && (x + dx) <= (paddlex + paddlew)) {
dy = -dy;
} else {
clearInterval(a);
alert("error!");
}
}
x += dx;
y += dy;
}
init();
init_paddle();
每一项的初始值必须定义在外部,这样可以实时修改他们的信息。
首先 画一个圆
function circle(x,y,r) {
ctx.beginPath();
ctx.arc(x, y, r, 0, Math.PI*2, true);
ctx.closePath();
ctx.fill();
}
然后画托板
function rect(x,y,w,h) {
ctx.beginPath();
ctx.rect(x,y,w,h);
ctx.closePath();
ctx.fill();
}
然后让小球,也就是刚才画的圆形,不断移动。
思路就是setInterval方法每次画出小球的位置,然后调用clearRect来清除上一次的内容。
再次期间每次改变小球的位置,x y 的值就可以了。
然后判断当x 或者 y在临界边缘时,反弹,也就是代码里的 dx 和 dy取反就OK了。
if ((x + dx) > WIDTH || (x + dx) < 0 ) {
dx = -dx;
}
if ((y + dy) < 0) {
dy = -dy;
} else if ((y + dy) >= 290) {
if ((x + dx) >= paddlex && (x + dx) <= (paddlex + paddlew)) {
dy = -dy;
} else {
clearInterval(a);
alert("error!");
}
}
x += dx;
y += dy;function mouseMove (e) {
var rect = e.currentTarget.getBoundingClientRect();
var gravityPoint = {
x: e.clientX - rect.left,
y: e.clientY - rect.top
};
paddlex = gravityPoint.x - 30;
}
ok接下啦就是让被撞的方块消失。
function checkCollide(){
for (var i = 0; i < rectee.data.length ; i++) {
if (x <= (rectee.data[i].x + 60) && x >= (rectee.data[i].x) && rectee.data[i].y <= y && y <= (rectee.data[i].y + 10)) {
rectee.data.splice(i,1);
dy = -dy;
}
}
}
很简单吧!
完!
Canvas制作 撞球游戏 简单易学,布布扣,bubuko.com
原文:http://blog.csdn.net/u012844719/article/details/20646427