版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、通过鼠标拖拽在画布上添加墙壁,通过方向键控制多边形上下左右移动,遇到墙壁则无法前进,下面为大家介绍下需要解决的问题及具体的实现代码,感兴趣的朋友可以学习下需要解决的问题鼠标按下,鼠标拖动,鼠标释放事件的检测多边形的绘制墙壁的绘制 多边形和墙壁的碰撞检测(实质上是圆和线段的相交判断)MYCode:代码如下:& lt;html >& lt;head ><title>迷宫&t;/title>& t;script>var can vas_width = 900;var can vas_h
2、eight = 350;var ctx;var canvas;var everyth ing =;var cur_wall;var wall_width;var wall_style = "rgb(200,0,200)"var walls =;var in_motio n = false;var unit = 10;function Toke n( sx, sy, rad, style_stri ng, n)this.sx = sx;this.sy = sy;this.rad = rad;this.draw = draw_toke n;this. n = n;this.a
3、ngle = (2 * Math.PI) / n;this.move = move_toke n;this.fill_style = style_stri ng;function draw_token() 绘制正 n 边形ctx.fill_style = this.fill_style;ctx.begi nPath();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.a ngle);for (i = 1; i
4、& It; this. n; i+)ctx.li neTo(this.sx + rad * Math.cos(i - 0.5) * this.a ngle), this.sy + rad * Math.s in (i - 0.5) * this.a ngle);ctx.fill();fun ctio n move_toke n( dx, dy)this.sx += dx;this.sy += dy;var i;var wall;for (i = 0; i & It; walls.le ngth; i+)wall = wallsi;if (in tersect(wall.sx,
5、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, styleStri ng)this.sx = sx;this.sy = sy;this.fx = fx;this.fy = fy;this.width = width;this.draw = draw_li ne;this.strokeStyle = styleStri ng;fun ctio n draw_li ne()ctx.li neWidt
6、h = this.width;ctx.strokeStye = this.strokeStyle;ctx.begi nPath();ctx.moveTo(this.sx, this.sy);ctx.lin eTo(this.fx, this.fy);ctx.stroke();/notevar mype nt = new Toke n(100, 100, 20, "rgb(0,0,250)", 5);everythi ng.push(mype nt);fun ctio n in it()can vas = docume nt.getEleme ntByld("ca
7、nvas");ctx = can vas.getC on text('2d');/notecan vas.addEve ntListe ner('mousedow n', start_wall, false);can vas.addEve ntListe ner('mousemove', stretch_wall, false);can vas.addEve ntListe ner('mouseup', fini sh_wall, false);win dow.addEve ntListe ner('keydow
8、 n', getkey_a nd_move, false); draw_all();function start_wall(ev)var mx;var my;if (evayerX | evayerx = 0)mx = evayerX;my = evayerY;else if (ev.offsetX | ev.offsetX = 0)mx = ev.offsetX;my = ev.offsetY;cur_wall = new Wall(mx, my, mx + 1, my + 1, wall_width, wall_style); in_motio n = true;everythi
9、ng.push(cur_wall);draw_all();fun ctio n stretch_wall(ev)if (in _motio n)var mx;var my;if (ev.layerX | ev.layerX = 0)mx = evayerX;my = evayerY;else if (ev.offsetX | ev.offsetX = 0)mx = ev.offsetX;my = ev.offsetY;cur_wall.fx = mx;cur_wall.fy = my;draw_all();fun ctio n fini sh_wall(ev)in_motio n = fals
10、e;walls.push(cur_wall);fun ctio n draw_all()ctx.clearRect(O, 0, can vas_width, can vas_height);var i;for (i = 0; i < everyth ing.len gth; i+)everythi ngi.draw();fun ctio n getkey_a nd_move(eve nt)var keyCode;if (eve nt = n ull)keyCode = win dow.eve nt.keyCode;wi ndow.eve nt.preve ntDefault();
11、elsekeyCode = eve nt.keyCode;eve nt.preve ntDefault();switch (keyCode)case 37:/left arrowmype nt.move (-un it, 0);break;case 38:/up arrowmype nt.move (0, -un it);break;case 39:/right arrowmype nt.move (un it, 0);break;case 40:mype nt.move(0, un it);break;default:/wi ndow.removeEve ntListe ner('k
12、eydow n', getkey_a nd_move, false); draw_all();function in tersect(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 & It; 0.0)t = 0.0;else if (t & gt; 1.0)t = 1.0;var dx1 = (sx + t * dx
13、) - cx;var dy1 = (sy + t * dy) - cy;var rt = dx1 * dx1 + dy1 * dy1;if (rt & It; rad * rad)return true;elsereturn false;& lt;/script >& t;body on Load="i nit();">& lt;ca nvas id="ca nvas" width="900" height="350"></ca nvas></body >& lt;/html>难点多边形和线段碰撞检测的方法函数intersect()负责检测多边形和线段是否相交记线段上一点 p(x,y)线段2个端点是(sx,sy)和(fx,fy)记dx=fx-sxdy=fy-syx和y可以表示如下x=sx+t*dxy=sy+t*dy要判断线段和多边形是否相交,转化为判断线段和多边形的
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吞咽患者的循证护理查房
- 电子教学课程设计
- 电子控制技术课程设计
- 电子商务系统课程设计
- 电子商务实训课程设计
- 2024【合同范本】辽宁省委托代销合同样本
- 电子信息应用课程设计
- 电器门改造施工方案
- 电商前沿课程设计
- 疼痛的护理措施
- 专题05 说明文阅读(必考题型梳理)50题-2023-2024学年八年级语文下学期期中专题复习(上海专用)(原卷版)
- 部编版七年级语文上册第五单元任务一体会人与动物的关系《猫》课件
- 医科大学2024年12月急危重症护理学作业考核试题答卷
- 提高脓毒性休克患者1h集束化措施落实率
- 环保设施运行维护方案
- 2024年贵州省高考生物真题试卷(含答案解析)
- 2024年新版人教精通版三年级英语上册单词带音标
- 辽宁省大连市2023-2024学年高三上学期双基测试(期末考试) 物理 含解析
- 期中测试卷-2024-2025学年统编版语文六年级上册
- 初中语文2024届中考修改病句选择题练习(共15道-附参考答案和解析)
- 中国大百科全书出版社 心理健康教育 五年级下册 15 成长中的我 教案
评论
0/150
提交评论