




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、通過鼠標(biāo)拖拽在畫布上添加墻壁,通過方向鍵控制多邊形上下左右移動(dòng),遇到墻壁則無法前進(jìn),下面為大家介紹下需要解決的問題及具體的實(shí)現(xiàn)代碼,感興趣的朋友可以學(xué)習(xí)下需要解決的問題鼠標(biāo)按下,鼠標(biāo)拖動(dòng),鼠標(biāo)釋放事件的檢測多邊形的繪制墻壁的繪制 多邊形和墻壁的碰撞檢測(實(shí)質(zhì)上是圓和線段的相交判斷)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>難點(diǎn)多邊形和線段碰撞檢測的方法函數(shù)intersect()負(fù)責(zé)檢測多邊形和線段是否相交記線段上一點(diǎn) p(x,y)線段2個(gè)端點(diǎn)是(sx,sy)和(fx,fy)記dx=fx-sxdy=fy-syx和y可以表示如下x=sx+t*dxy=sy+t*dy要判斷線段和多邊形是否相交,轉(zhuǎn)化為判斷線段和多邊形的
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 個(gè)性化數(shù)學(xué)輔導(dǎo)計(jì)劃適用于五年級(jí)
- 手機(jī)調(diào)查報(bào)告調(diào)查報(bào)告7
- 2025年糧食、棉花、化肥等農(nóng)產(chǎn)品倉儲(chǔ)服務(wù)項(xiàng)目規(guī)劃申請(qǐng)報(bào)告模板
- 2025年B2B電子商務(wù)項(xiàng)目申請(qǐng)報(bào)告
- 2025年小學(xué)校本書香校園建設(shè)計(jì)劃
- 2025年中國量子計(jì)算機(jī)行業(yè)市場發(fā)展深度調(diào)查及投資戰(zhàn)略可行性報(bào)告
- 2025公司安全管理人員安全培訓(xùn)考試試題及完整答案【名校卷】
- 2024-2025新入職員工安全培訓(xùn)考試試題標(biāo)準(zhǔn)卷
- 2025年班組安全培訓(xùn)考試試題含答案【培優(yōu)B卷】
- 2025工廠員工安全培訓(xùn)考試試題及參考答案【預(yù)熱題】
- 《紅樓夢(mèng)》人物性格分析與情感描寫
- 農(nóng)業(yè)經(jīng)濟(jì)管理專業(yè)職業(yè)生涯規(guī)劃書
- 汽車起重機(jī)日常檢查維修保養(yǎng)記錄表
- 銀行特殊消費(fèi)者群體金融服務(wù)工作指引
- 說文解字全文
- 嬰兒氣道異物急救評(píng)分標(biāo)準(zhǔn)
- 執(zhí)業(yè)醫(yī)師X線讀片教學(xué)課件
- 工程安全生產(chǎn)事故報(bào)告處理制度
- 催乳師職業(yè)培訓(xùn)考試試題與答案
- 2023年一般行業(yè)主要負(fù)責(zé)人和安全管理人員考試復(fù)習(xí)題庫(含答案)
- 中國糖尿病患者的白內(nèi)障圍手術(shù)期防治策略專家共識(shí)(2020年)
評(píng)論
0/150
提交評(píng)論