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