游戏效果图
通过鼠标拖拽在画布上添加墙壁,通过方向键控制多边形上下左右移动,遇到墙壁则无法前进。
需要解决的问题
鼠标按下,鼠标拖动,鼠标释放事件的检测
多边形的绘制
墙壁的绘制
多边形和墙壁的碰撞检测(实质上是圆和线段的相交判断)
mycode:
复制代码 代码如下:
<html>
<head>
<title>迷宫</title>
<script>
var canvas_width = 900;
var canvas_height = 350;
var ctx;
var canvas;
var everything = [];
var cur_wall;
var wall_width;
var wall_style = “rgb(200,0,200)”;
var walls = [];
var in_motion = fal;
var unit = 10;
function token(sx, sy, rad, style_string, n)
{
this.sx = sx;
this.sy = sy;
this.rad = rad;
this.draw = draw_token;
this.n = n;
this.angle = (2 * math.pi) / n;
this.move = move_token;
this.fill_style = style_string;
}
function draw_token()//绘制正n边形
{
ctx.fill_style = this.fill_style;
ctx.beginpath();
var i;
var rad = this.rad;
ctx.moveto(this.sx + rad * math.cos(-0.5 * this.angle), this.sy + rad * math.sin(-0.5 * this.angle));
for (i = 1; i < this.n; i++)
ctx.lineto(this.sx + rad * math.cos((i – 0.5) * this.angle), this.sy + rad * math.sin((i – 0.5) * this.angle));
ctx.fill();
}
function move_token(dx, dy)
{
this.sx += dx;
this.sy += dy;
var i;
var wall;
for (i = 0; i < walls.length; i++)
{
wall = walls[i];
if (interct(wall.sx, wall.sy, wall.fx, wall.fy, this.sx, this.sy, this.rad))
{
this.sx -= dx;
this.sy -= dy;
break;
}
}
}
function wall(sx, sy, fx, fy, width, stylestring)
人教版高中数学教材
{
this.sx = sx;
this.sy = sy;
this.fx = fx;
this.fy = fy;
this.width = width;
this.draw = draw_line;
this.strokestyle = stylestring;
}
function draw_line()
{
ctx.linewidth = this.width;
ctx.strokestye = this.strokestyle;
ctx.beginpath();
ctx.moveto(this.sx, this.sy);
ctx.lineto(this.fx, this.fy);
ctx.stroke();
}
//note
var mypent = new token(100, 100, 20, “rgb(0,0,250)”, 5);
everything.push(mypent);
function init()
{
canvas = document.getelementbyid(“canvas”);
ctx = canvas.getcontext(‘2d’);
//note
canvas.addeventlistener(‘moudown’, start_wall, fal);
canvas.addeventlistener(‘moumove’, stretch_wall, fal);
canvas.addeventlistener(‘mouup’, finish_wall, fal);
window.addeventlistener(‘keydown’, getkey_and_move, fal);
draw_all();
}
function start_wall(ev)
{
var mx;
var my;
if (ev.layerx || ev.layerx == 0)
{
mx = ev.layerx;
my = ev.layery;
}
el if (ev.offtx || ev.offtx == 0)
{
mx = ev.offtx;
my = ev.offty;
}
cur_wall = new wall(mx, my, mx + 1, my +次北固山下次的意思 1, wall_width, wall_style);
in_motion = true;
everything.push(cur_wall);
draw_all();
}
function stretc今已亭亭如盖矣h_wall(ev)
{
if (in_motion)
{
var mx;
var my;
if (ev.layerx || ev.layerx == 0)
{
mx = ev.layerx;
my = ev.layery;
好二本大学}
el if (ev.offtx || ev.offtx == 0)
{
mx = ev.offtx;
my = ev.offty;
}
cur_wall.fx = mx;
cur_wall.fy = my;
draw_all();
}
}
function finish_wall(ev)
{
in_motion = fal;
walls.push(cur_wall);
}
function draw_all()
{
ctx.clearrect(0, 0, canvas_width, canvas_height);
var i;
for (i = 0; i < everything.length; i++)
{
everything[i].draw();
}
}
function getkey_and_move(event)
{
var keycode;
if (event == null)
{
keycode = window.event.keycode;
window.event.preventdefault();
}
el
{
keycode = event.keycode;
event.preventdefault();
}
switch (keycode)
{
ca 37://left arrow
mypent.move(-unit, 0);
break;
ca 38://up arrow
mypent.move(0, -unit);
break;
ca 39://right arrow
mypent.move(unit, 0);
break;
ca 40:
mypent.move(0, unit);
break;
default:
//window.removeeventlistener(‘keydown’, getkey_and_move, fal);
}
draw_all();
}
function interct(sx, sy, fx, fy, cx, cy, rad)
{
var dx;
var dy;
var t;
var rt;
dx = fx – sx;
dy = fy – sy;
t = 0.0 – (((sx – cx) * dx + (sy – cy) * dy石家庄铁道学院录取分数线) / (dx * dx + dy * dy));
if (t < 0.0)
{
t = 0.0;
}
el if (t > 1.0)
t = 1.0;
var dx1 = (sx + t * dx) – cx;
var dy1 = (sy + t * dy) – cy;
var rt = dx1 * dx1 + dy1 * dy1;
if (rt < rad * rad)
return true;
el
return fal;
}
</script>
<body onload=”init();”>
<canvas id=”canvas” width=”900″ height=”350″></canvas>
</body>
</html>
难点
多边形和线段碰撞检测的方法
函数interct()负责检测多边形和线段是否相交
记线段上一点p(x,y)
线段2个端点是(sx,sy)和(fx,fy)
记
dx=fx-sx
dy=fy-sy
x和y可以表示如下
x=sx+t*dx
y=sy+t*dy
要判断线段和多边形是否相交,转化为判断线段和多边形的外接圆是否相交
为此需要找到线段上离圆心o最近的一点p
如果|op|<圆的半径,则可以判断线段和圆相交。
否则不相交。
怎么找到线段上离圆心距离最近的点呢?
p点到o点的距离可以表示为
distance=sqrt((x-cx)*(x-cx)+(y-cy)*(y-cy));
代入
x=sx+t*dx和y=sy+t*dy
可以得到distance是一个关于t的函数
对此函数求导
求出函数值为0时对应的t值就可以得到距离圆心最近的点
本文发布于:2023-04-06 17:10:20,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/9a8febfbf1a2b6523faad05ec066414d.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:html5 迷宫游戏(碰撞检测)实例一.doc
本文 PDF 下载地址:html5 迷宫游戏(碰撞检测)实例一.pdf
留言与评论(共有 0 条评论) |