婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > html5 迷宮游戲(碰撞檢測)實例一

html5 迷宮游戲(碰撞檢測)實例一

熱門標簽:百度地圖標注為什么總是封號 四川移動電銷外呼客戶管理系統 怎么做百度地圖標注 咸陽穩定外呼系統軟件 臨海地圖標注app 智能芯電話機器人 400開頭的電話好申請不 小朱地圖標注 地圖標注柱狀圖
游戲效果圖
 
通過鼠標拖拽在畫布上添加墻壁,通過方向鍵控制多邊形上下左右移動,遇到墻壁則無法前進。

需要解決的問題

鼠標按下,鼠標拖動,鼠標釋放事件的檢測
多邊形的繪制
墻壁的繪制
多邊形和墻壁的碰撞檢測(實質上是圓和線段的相交判斷)

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 = false;
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 (intersect(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('mousedown', start_wall, false);
canvas.addEventListener('mousemove', stretch_wall, false);
canvas.addEventListener('mouseup', finish_wall, false);
window.addEventListener('keydown', getkey_and_move, false);
draw_all();
}
function start_wall(ev)
{
var mx;
var my;
if (ev.layerX || ev.layerx == 0)
{
mx = ev.layerX;
my = ev.layerY;
}
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_motion = true;
everything.push(cur_wall);
draw_all();
}
function stretch_wall(ev)
{
if (in_motion)
{
var mx;
var my;
if (ev.layerX || ev.layerX == 0)
{
mx = ev.layerX;
my = ev.layerY;
}
else if (ev.offsetX || ev.offsetX == 0)
{
mx = ev.offsetX;
my = ev.offsetY;
}
cur_wall.fx = mx;
cur_wall.fy = my;
draw_all();
}
}
function finish_wall(ev)
{
in_motion = false;
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();
}
else
{
keyCode = event.keyCode;
event.preventDefault();
}
switch (keyCode)
{
case 37://left arrow
mypent.move(-unit, 0);
break;
case 38://up arrow
mypent.move(0, -unit);
break;
case 39://right arrow
mypent.move(unit, 0);
break;
case 40:
mypent.move(0, unit);
break;
default:
//window.removeEventListener('keydown', getkey_and_move, false);
}
draw_all();
}
function intersect(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;
}
else 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;
else
return false;
}
</script>
<body onLoad="init();">
<canvas id="canvas" width="900" height="350"></canvas>
</body>
</html>

難點

多邊形和線段碰撞檢測的方法
函數intersect()負責檢測多邊形和線段是否相交
記線段上一點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值就可以得到距離圓心最近的點

標簽:南平 黃石 陜西 公主嶺 山南 平頂山 黃石 平涼

巨人網絡通訊聲明:本文標題《html5 迷宮游戲(碰撞檢測)實例一》,本文關鍵詞  html5,迷宮,游戲,碰撞,檢測,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《html5 迷宮游戲(碰撞檢測)實例一》相關的同類信息!
  • 本頁收集關于html5 迷宮游戲(碰撞檢測)實例一的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    懂色一区二区三区免费观看| 中文字幕第一区| 777精品伊人久久久久大香线蕉| 中文字幕免费在线观看视频一区| 国产成人午夜高潮毛片| 在线视频一区二区免费| 亚洲午夜精品一区二区三区他趣| 老司机精品视频一区二区三区| 91女神在线视频| 国产精品资源站在线| 午夜影院久久久| 欧美一区二区三区免费| 日韩精品一区二区三区中文不卡| 中文字幕一区日韩精品欧美| 日韩精品中文字幕一区二区三区| 色婷婷av一区二区三区之一色屋| 国产成人免费高清| 床上的激情91.| 国产尤物一区二区| 国产伦精品一区二区三区免费迷| 日本亚洲三级在线| 国产黑丝在线一区二区三区| 国产人伦精品一区二区| 久久久久久久精| 日本一区免费视频| 亚洲欧美日韩小说| 国产精品久久三| 亚洲欧美一区二区视频| 日韩av在线免费观看不卡| 五月天婷婷综合| 国产一本一道久久香蕉| 91在线观看美女| 91精品国产91热久久久做人人| 欧洲精品中文字幕| 精品视频在线免费看| 337p粉嫩大胆噜噜噜噜噜91av | 日韩视频一区二区在线观看| 亚洲国产成人av| 欧美色综合网站| 亚洲精品一卡二卡| 黄色日韩三级电影| 亚洲成人福利片| 日韩欧美一区二区三区在线| 色综合久久中文字幕| 在线不卡a资源高清| 日韩欧美成人一区| 成人精品视频一区二区三区 | a4yy欧美一区二区三区| 成人黄色大片在线观看| 大胆欧美人体老妇| 国产日韩v精品一区二区| 国产亚洲成年网址在线观看| 99在线精品观看| 色偷偷成人一区二区三区91| 欧美另类z0zxhd电影| 中文字幕一区二区三| 欧美男生操女生| 国产亚洲欧洲一区高清在线观看| 日本va欧美va精品发布| 7777精品伊人久久久大香线蕉的| 日韩美女视频一区二区在线观看| 亚洲成人三级小说| 91啦中文在线观看| 亚洲欧美成人一区二区三区| 99re热这里只有精品视频| 中文字幕日韩一区二区| 福利一区二区在线观看| 国产精品免费av| 日本乱人伦aⅴ精品| 免费看黄色91| 亚洲精品免费在线| 91久久一区二区| 一个色综合av| 国产亚洲欧美日韩俺去了| 99视频一区二区| 成人性生交大片免费看中文网站| 久久99精品网久久| www.av精品| 精品国产sm最大网站| 国产精品一区二区无线| 久久精品国产在热久久| 床上的激情91.| 99久久精品国产毛片| 国产一二精品视频| 欧美亚洲精品一区| 国产日韩欧美制服另类| 国产精品传媒入口麻豆| 中文字幕一区二区三区在线观看| 久久久久久免费| 国产亚洲一区二区三区四区| 国产亚洲精品7777| 亚洲一区电影777| 国产大陆亚洲精品国产| 91亚洲精华国产精华精华液| 99国产一区二区三精品乱码| 国产91丝袜在线观看| 国产不卡视频在线播放| 91啪亚洲精品| 蜜桃av一区二区| 高清成人在线观看| 6080国产精品一区二区| 精品日产卡一卡二卡麻豆| 国产亚洲精品aa| 激情文学综合插| 色综合天天综合网天天狠天天| 精品人在线二区三区| 国产999精品久久| 制服丝袜亚洲色图| 91麻豆国产自产在线观看| 91精品国产乱码久久蜜臀| 欧美性大战久久| 久久久久九九视频| 国产成人午夜高潮毛片| 国产精品免费视频观看| 国产精品羞羞答答xxdd| 亚洲一区二区成人在线观看| 日韩精品久久理论片| 亚洲综合一区二区三区| 久久尤物电影视频在线观看| 青娱乐精品在线视频| 亚洲人午夜精品天堂一二香蕉| 国产三区在线成人av| 色悠久久久久综合欧美99| 不卡一二三区首页| 欧美日韩一区成人| 色婷婷av一区二区三区软件| 国产成人高清视频| 久久99久久久久久久久久久| 国产欧美日韩不卡| 久久久久久久久久久黄色| 欧美日本免费一区二区三区| 欧美一区二区三区的| 欧美国产成人在线| 国产精品短视频| 国产精品色噜噜| 日韩精品成人一区二区在线| 欧美精品一区二区久久久| 国产一区不卡视频| 一区二区三区在线免费观看| 亚洲综合色丁香婷婷六月图片| 国产专区欧美精品| 欧美激情一区二区三区在线| 麻豆精品视频在线| 日本不卡中文字幕| 91久久国产最好的精华液| 欧美日韩在线三级| 国产精品亚洲视频| 亚洲精品综合在线| 国产亚洲欧洲997久久综合| 麻豆精品视频在线| 欧美色综合网站| 欧美电影免费观看高清完整版在| 亚洲日本青草视频在线怡红院| 一区二区三区在线影院| 国产一区二区免费看| 一区二区三区日韩精品| 国产福利不卡视频| 色婷婷亚洲综合| 久久精品男人天堂av| 日韩免费一区二区| 艳妇臀荡乳欲伦亚洲一区| 日韩成人av影视| 91一区二区在线| 成人午夜电影小说| 夜夜爽夜夜爽精品视频| 91精品国产免费久久综合| 欧美色精品在线视频| 欧美三级电影在线看| 国产福利一区二区| 国产精品成人网| 午夜一区二区三区视频| 国产日韩综合av| 日韩毛片一二三区| 色哟哟在线观看一区二区三区| 久久精品视频在线免费观看| 欧美日韩成人一区二区| 精品久久久久久综合日本欧美| 日韩中文字幕一区二区三区| 日韩专区一卡二卡| 欧美日韩免费高清一区色橹橹| 91成人国产精品| 亚洲午夜久久久久久久久久久| 国产亚洲美州欧州综合国| 日韩高清电影一区| 日韩欧美国产麻豆| 午夜视频一区二区| 日韩经典中文字幕一区| 精品久久久久久亚洲综合网| 成人综合婷婷国产精品久久| 国产精品看片你懂得 | 国产91精品欧美| 国产成人在线观看| 亚洲一区二区三区在线播放| 欧美日韩免费一区二区三区| 欧美艳星brazzers| 欧美精品一区视频| 欧美一区二区三级| 在线日韩av片| 成人午夜视频网站| 欧美丝袜丝交足nylons图片|