html5中文学习网

您的位置: 首页 > html5教程 > 入门教程 » 正文

html5 迷宫游戏(碰撞检测)实例一_html5教程技巧

[ ] 已经帮助:人解决问题
点评:通过鼠标拖拽在画布上添加墙壁,通过方向键控制多边形上下左右移动,遇到墙壁则无法前进,下面为大家介绍下需要解决的问题及具体的实现代码,感兴趣的朋友可以学习下
游戏效果图 22jHTML5中文学习网 - HTML5先行者学习网
 22jHTML5中文学习网 - HTML5先行者学习网
通过鼠标拖拽在画布上添加墙壁,通过方向键控制多边形上下左右移动,遇到墙壁则无法前进。 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
需要解决的问题 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
鼠标按下,鼠标拖动,鼠标释放事件的检测 22jHTML5中文学习网 - HTML5先行者学习网
多边形的绘制 22jHTML5中文学习网 - HTML5先行者学习网
墙壁的绘制 22jHTML5中文学习网 - HTML5先行者学习网
多边形和墙壁的碰撞检测(实质上是圆和线段的相交判断) 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
MYCode: 22jHTML5中文学习网 - HTML5先行者学习网

复制代码
代码如下:
22jHTML5中文学习网 - HTML5先行者学习网
<html> 22jHTML5中文学习网 - HTML5先行者学习网
<head> 22jHTML5中文学习网 - HTML5先行者学习网
<title>迷宫</title> 22jHTML5中文学习网 - HTML5先行者学习网
<script> 22jHTML5中文学习网 - HTML5先行者学习网
var canvas_width = 900; 22jHTML5中文学习网 - HTML5先行者学习网
var canvas_height = 350; 22jHTML5中文学习网 - HTML5先行者学习网
var ctx; 22jHTML5中文学习网 - HTML5先行者学习网
var canvas; 22jHTML5中文学习网 - HTML5先行者学习网
var everything = []; 22jHTML5中文学习网 - HTML5先行者学习网
var cur_wall; 22jHTML5中文学习网 - HTML5先行者学习网
var wall_width; 22jHTML5中文学习网 - HTML5先行者学习网
var wall_style = "rgb(200,0,200)"; 22jHTML5中文学习网 - HTML5先行者学习网
var walls = []; 22jHTML5中文学习网 - HTML5先行者学习网
var in_motion = false; 22jHTML5中文学习网 - HTML5先行者学习网
var unit = 10; 22jHTML5中文学习网 - HTML5先行者学习网
function Token(sx, sy, rad, style_string, n) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
this.sx = sx; 22jHTML5中文学习网 - HTML5先行者学习网
this.sy = sy; 22jHTML5中文学习网 - HTML5先行者学习网
this.rad = rad; 22jHTML5中文学习网 - HTML5先行者学习网
this.draw = draw_token; 22jHTML5中文学习网 - HTML5先行者学习网
this.n = n; 22jHTML5中文学习网 - HTML5先行者学习网
this.angle = (2 * Math.PI) / n; 22jHTML5中文学习网 - HTML5先行者学习网
this.move = move_token; 22jHTML5中文学习网 - HTML5先行者学习网
this.fill_style = style_string; 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
function draw_token()//绘制正n边形 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
ctx.fill_style = this.fill_style; 22jHTML5中文学习网 - HTML5先行者学习网
ctx.beginPath(); 22jHTML5中文学习网 - HTML5先行者学习网
var i; 22jHTML5中文学习网 - HTML5先行者学习网
var rad = this.rad; 22jHTML5中文学习网 - HTML5先行者学习网
ctx.moveTo(this.sx + rad * Math.cos(-0.5 * this.angle), this.sy + rad * Math.sin(-0.5 * this.angle)); 22jHTML5中文学习网 - HTML5先行者学习网
for (i = 1; i < this.n; i++) 22jHTML5中文学习网 - HTML5先行者学习网
ctx.lineTo(this.sx + rad * Math.cos((i - 0.5) * this.angle), this.sy + rad * Math.sin((i - 0.5) * this.angle)); 22jHTML5中文学习网 - HTML5先行者学习网
ctx.fill(); 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
function move_token(dx, dy) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
this.sx += dx; 22jHTML5中文学习网 - HTML5先行者学习网
this.sy += dy; 22jHTML5中文学习网 - HTML5先行者学习网
var i; 22jHTML5中文学习网 - HTML5先行者学习网
var wall; 22jHTML5中文学习网 - HTML5先行者学习网
for (i = 0; i < walls.length; i++) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
wall = walls[i]; 22jHTML5中文学习网 - HTML5先行者学习网
if (intersect(wall.sx, wall.sy, wall.fx, wall.fy, this.sx, this.sy, this.rad)) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
this.sx -= dx; 22jHTML5中文学习网 - HTML5先行者学习网
this.sy -= dy; 22jHTML5中文学习网 - HTML5先行者学习网
break; 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
function Wall(sx, sy, fx, fy, width, styleString) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
this.sx = sx; 22jHTML5中文学习网 - HTML5先行者学习网
this.sy = sy; 22jHTML5中文学习网 - HTML5先行者学习网
this.fx = fx; 22jHTML5中文学习网 - HTML5先行者学习网
this.fy = fy; 22jHTML5中文学习网 - HTML5先行者学习网
this.width = width; 22jHTML5中文学习网 - HTML5先行者学习网
this.draw = draw_line; 22jHTML5中文学习网 - HTML5先行者学习网
this.strokeStyle = styleString; 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
function draw_line() 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
ctx.lineWidth = this.width; 22jHTML5中文学习网 - HTML5先行者学习网
ctx.strokeStye = this.strokeStyle; 22jHTML5中文学习网 - HTML5先行者学习网
ctx.beginPath(); 22jHTML5中文学习网 - HTML5先行者学习网
ctx.moveTo(this.sx, this.sy); 22jHTML5中文学习网 - HTML5先行者学习网
ctx.lineTo(this.fx, this.fy); 22jHTML5中文学习网 - HTML5先行者学习网
ctx.stroke(); 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
//note 22jHTML5中文学习网 - HTML5先行者学习网
var mypent = new Token(100, 100, 20, "rgb(0,0,250)", 5); 22jHTML5中文学习网 - HTML5先行者学习网
everything.push(mypent); 22jHTML5中文学习网 - HTML5先行者学习网
function init() 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
canvas = document.getElementById("canvas"); 22jHTML5中文学习网 - HTML5先行者学习网
ctx = canvas.getContext('2d'); 22jHTML5中文学习网 - HTML5先行者学习网
//note 22jHTML5中文学习网 - HTML5先行者学习网
canvas.addEventListener('mousedown', start_wall, false); 22jHTML5中文学习网 - HTML5先行者学习网
canvas.addEventListener('mousemove', stretch_wall, false); 22jHTML5中文学习网 - HTML5先行者学习网
canvas.addEventListener('mouseup', finish_wall, false); 22jHTML5中文学习网 - HTML5先行者学习网
window.addEventListener('keydown', getkey_and_move, false); 22jHTML5中文学习网 - HTML5先行者学习网
draw_all(); 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
function start_wall(ev) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
var mx; 22jHTML5中文学习网 - HTML5先行者学习网
var my; 22jHTML5中文学习网 - HTML5先行者学习网
if (ev.layerX || ev.layerx == 0) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
mx = ev.layerX; 22jHTML5中文学习网 - HTML5先行者学习网
my = ev.layerY; 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
else if (ev.offsetX || ev.offsetX == 0) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
mx = ev.offsetX; 22jHTML5中文学习网 - HTML5先行者学习网
my = ev.offsetY; 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
cur_wall = new Wall(mx, my, mx + 1, my + 1, wall_width, wall_style); 22jHTML5中文学习网 - HTML5先行者学习网
in_motion = true; 22jHTML5中文学习网 - HTML5先行者学习网
everything.push(cur_wall); 22jHTML5中文学习网 - HTML5先行者学习网
draw_all(); 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
function stretch_wall(ev) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
if (in_motion) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
var mx; 22jHTML5中文学习网 - HTML5先行者学习网
var my; 22jHTML5中文学习网 - HTML5先行者学习网
if (ev.layerX || ev.layerX == 0) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
mx = ev.layerX; 22jHTML5中文学习网 - HTML5先行者学习网
my = ev.layerY; 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
else if (ev.offsetX || ev.offsetX == 0) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
mx = ev.offsetX; 22jHTML5中文学习网 - HTML5先行者学习网
my = ev.offsetY; 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
cur_wall.fx = mx; 22jHTML5中文学习网 - HTML5先行者学习网
cur_wall.fy = my; 22jHTML5中文学习网 - HTML5先行者学习网
draw_all(); 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
function finish_wall(ev) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
in_motion = false; 22jHTML5中文学习网 - HTML5先行者学习网
walls.push(cur_wall); 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
function draw_all() 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
ctx.clearRect(0, 0, canvas_width, canvas_height); 22jHTML5中文学习网 - HTML5先行者学习网
var i; 22jHTML5中文学习网 - HTML5先行者学习网
for (i = 0; i < everything.length; i++) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
everything[i].draw(); 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
function getkey_and_move(event) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
var keyCode; 22jHTML5中文学习网 - HTML5先行者学习网
if (event == null) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
keyCode = window.event.keyCode; 22jHTML5中文学习网 - HTML5先行者学习网
window.event.preventDefault(); 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
else 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
keyCode = event.keyCode; 22jHTML5中文学习网 - HTML5先行者学习网
event.preventDefault(); 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
switch (keyCode) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
case 37://left arrow 22jHTML5中文学习网 - HTML5先行者学习网
mypent.move(-unit, 0); 22jHTML5中文学习网 - HTML5先行者学习网
break; 22jHTML5中文学习网 - HTML5先行者学习网
case 38://up arrow 22jHTML5中文学习网 - HTML5先行者学习网
mypent.move(0, -unit); 22jHTML5中文学习网 - HTML5先行者学习网
break; 22jHTML5中文学习网 - HTML5先行者学习网
case 39://right arrow 22jHTML5中文学习网 - HTML5先行者学习网
mypent.move(unit, 0); 22jHTML5中文学习网 - HTML5先行者学习网
break; 22jHTML5中文学习网 - HTML5先行者学习网
case 40: 22jHTML5中文学习网 - HTML5先行者学习网
mypent.move(0, unit); 22jHTML5中文学习网 - HTML5先行者学习网
break; 22jHTML5中文学习网 - HTML5先行者学习网
default: 22jHTML5中文学习网 - HTML5先行者学习网
//window.removeEventListener('keydown', getkey_and_move, false); 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
draw_all(); 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
function intersect(sx, sy, fx, fy, cx, cy, rad) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
var dx; 22jHTML5中文学习网 - HTML5先行者学习网
var dy; 22jHTML5中文学习网 - HTML5先行者学习网
var t; 22jHTML5中文学习网 - HTML5先行者学习网
var rt; 22jHTML5中文学习网 - HTML5先行者学习网
dx = fx - sx; 22jHTML5中文学习网 - HTML5先行者学习网
dy = fy - sy; 22jHTML5中文学习网 - HTML5先行者学习网
t = 0.0 - (((sx - cx) * dx + (sy - cy) * dy) / (dx * dx + dy * dy)); 22jHTML5中文学习网 - HTML5先行者学习网
if (t < 0.0) 22jHTML5中文学习网 - HTML5先行者学习网
{ 22jHTML5中文学习网 - HTML5先行者学习网
t = 0.0; 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
else if (t > 1.0) 22jHTML5中文学习网 - HTML5先行者学习网
t = 1.0; 22jHTML5中文学习网 - HTML5先行者学习网
var dx1 = (sx + t * dx) - cx; 22jHTML5中文学习网 - HTML5先行者学习网
var dy1 = (sy + t * dy) - cy; 22jHTML5中文学习网 - HTML5先行者学习网
var rt = dx1 * dx1 + dy1 * dy1; 22jHTML5中文学习网 - HTML5先行者学习网
if (rt < rad * rad) 22jHTML5中文学习网 - HTML5先行者学习网
return true; 22jHTML5中文学习网 - HTML5先行者学习网
else 22jHTML5中文学习网 - HTML5先行者学习网
return false; 22jHTML5中文学习网 - HTML5先行者学习网
} 22jHTML5中文学习网 - HTML5先行者学习网
</script> 22jHTML5中文学习网 - HTML5先行者学习网
<body onLoad="init();"> 22jHTML5中文学习网 - HTML5先行者学习网
<canvas id="canvas" width="900" height="350"></canvas> 22jHTML5中文学习网 - HTML5先行者学习网
</body> 22jHTML5中文学习网 - HTML5先行者学习网
</html> 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
难点 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
多边形和线段碰撞检测的方法 22jHTML5中文学习网 - HTML5先行者学习网
函数intersect()负责检测多边形和线段是否相交 22jHTML5中文学习网 - HTML5先行者学习网
记线段上一点p(x,y) 22jHTML5中文学习网 - HTML5先行者学习网
线段2个端点是(sx,sy)和(fx,fy) 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
dx=fx-sx 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
dy=fy-sy 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
x和y可以表示如下 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
x=sx+t*dx 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
y=sy+t*dy 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
要判断线段和多边形是否相交,转化为判断线段和多边形的外接圆是否相交 22jHTML5中文学习网 - HTML5先行者学习网
为此需要找到线段上离圆心o最近的一点p 22jHTML5中文学习网 - HTML5先行者学习网
如果|op|<圆的半径,则可以判断线段和圆相交。 22jHTML5中文学习网 - HTML5先行者学习网
否则不相交。22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
怎么找到线段上离圆心距离最近的点呢? 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
p点到o点的距离可以表示为 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
distance=sqrt((x-cx)*(x-cx)+(y-cy)*(y-cy)); 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
代入 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
x=sx+t*dx和y=sy+t*dy 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
可以得到distance是一个关于t的函数 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
对此函数求导 22jHTML5中文学习网 - HTML5先行者学习网
22jHTML5中文学习网 - HTML5先行者学习网
求出函数值为0时对应的t值就可以得到距离圆心最近的点22jHTML5中文学习网 - HTML5先行者学习网
(责任编辑:)
推荐书籍
推荐资讯
关于HTML5先行者 - 联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助