婷婷综合国产,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
    欧美一区二区视频网站| 国产午夜精品理论片a级大结局| 99精品久久只有精品| 亚洲女同ⅹxx女同tv| 美国一区二区三区在线播放| 国产精品色眯眯| 精品国一区二区三区| 在线电影院国产精品| 93久久精品日日躁夜夜躁欧美| 久久99精品久久久| 懂色av噜噜一区二区三区av| 亚洲不卡在线观看| 亚洲综合区在线| 亚洲综合免费观看高清完整版在线| 中文字幕免费一区| 精品国产青草久久久久福利| 欧美成人一区二区三区片免费 | 欧美一区二区精品久久911| 在线看不卡av| 欧美日韩三级一区二区| 欧美性感一区二区三区| 欧美日韩专区在线| 欧美性一区二区| 欧美性受xxxx黑人xyx| 在线免费观看视频一区| 风间由美性色一区二区三区| 国产激情91久久精品导航 | 最新久久zyz资源站| 欧美刺激午夜性久久久久久久 | 久久色在线视频| 亚洲精品一区二区三区四区高清| 国产丝袜在线精品| 最新国产成人在线观看| 久久99热99| 国产精品自拍av| 久久99久久久欧美国产| 日本不卡在线视频| www.欧美亚洲| 艳妇臀荡乳欲伦亚洲一区| 这里只有精品99re| 日韩手机在线导航| 亚洲欧美日韩一区| 麻豆精品视频在线观看视频| 激情伊人五月天久久综合| 欧美一区二区三区视频免费播放| 一区二区三区四区不卡在线| 午夜精品国产更新| 国产一区二区女| 91美女在线观看| 欧美人狂配大交3d怪物一区| 亚洲图片你懂的| 美女视频一区在线观看| 成人国产精品免费观看| 这里是久久伊人| 成人一区二区三区在线观看| 欧美一级欧美三级| 午夜欧美视频在线观看| 色综合久久66| 亚洲欧美一区二区在线观看| 播五月开心婷婷综合| 国产精品卡一卡二| 懂色av噜噜一区二区三区av| 国产精品不卡在线| 欧美亚洲一区二区三区四区| 亚洲国产精品麻豆| 91极品视觉盛宴| 蜜臀av性久久久久蜜臀av麻豆 | 中文字幕日韩一区| 美女脱光内衣内裤视频久久网站 | 欧洲精品一区二区| 欧美中文字幕一区| 欧美xxxxxxxxx| 天天综合色天天综合色h| 91精彩视频在线| 日韩欧美在线观看一区二区三区| 国产精品国产三级国产aⅴ入口| 老司机免费视频一区二区三区| 欧美日精品一区视频| 337p日本欧洲亚洲大胆色噜噜| 天堂影院一区二区| 日韩西西人体444www| 久久av中文字幕片| 国产精品入口麻豆原神| 日本亚洲欧美天堂免费| 欧美性生活大片视频| 综合精品久久久| 成人app在线| 色综合久久综合| 国产精品的网站| 午夜在线成人av| 不卡视频在线看| 欧美va在线播放| 日本不卡的三区四区五区| 波多野结衣中文字幕一区二区三区| 欧美电视剧免费全集观看| 日韩影院免费视频| 欧美日韩高清在线播放| 亚洲精品国产精华液| 丰满少妇久久久久久久| 久久亚洲免费视频| 麻豆成人在线观看| 精品久久国产字幕高潮| 蜜桃av噜噜一区二区三区小说| 欧美片网站yy| 视频一区国产视频| 6080午夜不卡| 精品无码三级在线观看视频| 日韩欧美在线观看一区二区三区| 国内精品自线一区二区三区视频| 欧美不卡激情三级在线观看| 国产福利一区在线| 中文字幕不卡在线观看| 国产成人综合自拍| 91女厕偷拍女厕偷拍高清| 91麻豆蜜桃一区二区三区| aaa亚洲精品| www.亚洲激情.com| 色欧美片视频在线观看在线视频| 色综合久久九月婷婷色综合| 亚洲欧美偷拍卡通变态| 国产拍欧美日韩视频二区| 26uuu久久天堂性欧美| 亚洲欧美视频在线观看视频| 日韩欧美国产不卡| 亚洲蜜臀av乱码久久精品 | 日韩在线一二三区| 欧美成人激情免费网| 粉嫩av一区二区三区在线播放| 伊人色综合久久天天| 中文字幕一区二区在线播放| 亚洲国产成人一区二区三区| 精品99999| 免费久久99精品国产| 精品一区二区综合| 欧美在线影院一区二区| 久久夜色精品国产噜噜av| 亚洲国产成人午夜在线一区| 亚洲18色成人| 91女厕偷拍女厕偷拍高清| 欧美日韩一区不卡| 亚洲免费成人av| 91精品国产综合久久久久久久 | 中文字幕永久在线不卡| 日韩一区二区三区av| 色综合久久久久综合体桃花网| av中文一区二区三区| 欧美日韩国产三级| 高潮精品一区videoshd| 在线观看亚洲成人| 国产真实乱对白精彩久久| 久久久美女毛片| 精品视频一区二区不卡| 国产在线播放一区| 亚洲男同性恋视频| 26uuuu精品一区二区| 在线亚洲人成电影网站色www| 国产综合色视频| 一区二区三区欧美视频| 国产精品一区二区久激情瑜伽| 91麻豆高清视频| 国产午夜亚洲精品午夜鲁丝片 | 亚洲va国产天堂va久久en| 日韩成人午夜电影| 国产精品一区久久久久| 欧美刺激午夜性久久久久久久| 午夜欧美一区二区三区在线播放| 日本道色综合久久| 精品国产乱码久久久久久蜜臀| 欧美亚洲综合另类| 97久久人人超碰| 看国产成人h片视频| 日韩高清不卡在线| 亚洲福利视频一区| 亚洲www啪成人一区二区麻豆| 国产精品久久久一本精品| 国产三级精品视频| 欧美精品一区二区三区视频| 成人免费视频免费观看| 国产精品系列在线观看| 日本不卡一二三| 久久疯狂做爰流白浆xx| 天天av天天翘天天综合网| 亚洲va天堂va国产va久| 一区二区视频免费在线观看| 亚洲免费在线观看视频| 亚洲三级在线免费| 亚洲小少妇裸体bbw| 亚洲综合色视频| 亚洲一级电影视频| 一区二区三区四区激情 | 免费高清在线视频一区·| 蜜臀av一级做a爰片久久| 日本欧美加勒比视频| 九九国产精品视频| 日本一不卡视频| 久久se精品一区二区| 久久国产欧美日韩精品| 久久99国产精品成人| 国产精品夜夜爽| 欧美精品一区二区不卡|