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

主頁 > 知識庫 > Html5 Canvas動畫基礎碰撞檢測的實現

Html5 Canvas動畫基礎碰撞檢測的實現

熱門標簽:智能電銷機器人被禁用了么 欣鼎電銷機器人 效果 高德地圖標注商戶怎么標 黃石ai電銷機器人呼叫中心 電話機器人技術 惡搞電話機器人 ok電銷機器人 如何查看地圖標注 地圖標注軟件打印出來

在Canvas中進行碰撞檢測,大家往往直接采用游戲引擎(Cocos2d-JS、Egret)或物理引擎(Box2D)內置的碰撞檢測功能,好奇的你有思考過它們的內部運行機制嗎?下面將針對基本的碰撞檢測技術進行講解:

1、基于矩形的碰撞檢測

所謂碰撞檢測就是判斷物體間是否發生重疊,這里我們假設討論的碰撞體都是矩形物體。下面示例中我們將創建兩個rect對象A和B(以下簡稱A,B),其中A位置固定,B跟隨鼠標移動,當A,B重疊時控制臺將提示intercect??!

1、創建Rect對象

這里我們新建Rect.js,建立Rect對象并為其添加原型方法draw,該方法將根據當前對象的屬性(位置、大小)繪制到傳入的畫布對象(context)中。

代碼如下 :

function Rect(x,y,width,height) {
    this.x = x;
    this.y = y;
    this.width = width;
    this.height = height;
}

Rect.prototype.draw = function(context){
    context.save();
    context.translate(this.x,this.y);
    context.fillRect(0,0,this.width,this.height);
    context.restore();
}

2、獲取鼠標位置

因為B需要跟隨鼠標移動所以我們需要檢測鼠標在畫布的當前位置。創建Capturemouse函數檢測鼠標在傳入的文檔節點(element)上的移動并返回一個mouse對象(其中包含了鼠標的x,y坐標)。

代碼如下:

function Capturemouse (element) {
    var mouse={x:null,y:null};
    element.addEventListener('mousemove',function (event) {
        var x, y;
        if(event.pageX || event.pageY){
            x = event.pageX;
            y = event.pageY;
        }else{
            x = event.clientX+document.body.scrollLeft+
                document.documentElement.scrollLeft;
            y = event.clientY+document.body.scrollTop+
                document.documentElement.scrollTop;
        }
        x -=element.offsetLeft;
        y -=element.offsetTop;
        mouse.x = x;
        mouse.y = y;
    },false);
    return mouse;
}

3、碰撞檢測

檢測A,B是否發生重疊,在討論是否發生重疊時我們可以先看看沒有重疊的四種情況,如下圖:

以下是對這四種狀態的判斷:

1、rectB.y+rectB.height < rectA.y
2、rectB.y > rectA.x +rectA.width
3、rectB.y > rectA.y + rectA.height
4、rectB.x+rectB.width < rectA.x

知道如何判斷沒有重疊的狀態,那發生重疊的狀態該如何判斷呢?沒錯“取反”!,我們創建函數Interaect并添加到Init.js中,該函數傳入兩個Rect對象參數,當兩Rect對象發生重疊將返回true。

代碼如下:

function Intersect(rectA,rectB) {
    return !(rectB.y+rectB.height < rectA.y || rectB.y > rectA.x +rectA.width ||
        rectB.y > rectA.y + rectA.height|| rectB.x+rectB.width < rectA.x)
}

4、動畫循環

新建animationjs,設置requestAnimationFrame()動畫函數。

在循環體中將做以下兩件事:

  • “清空”當前canvas中內容,為繪制下一幀做準備。
  • 檢測A,B是否發生重疊,若重疊則在控制臺輸出interact!??!
  • 檢測當前鼠標在canvas上的移動并將鼠標位置更新到B的位置屬性中。
  • 根據新的位置屬性重新繪制A,B(當然,A的位置不會更新但因為每次循環將清空canvas所以需要重新繪制)

代碼如下:

function drawAnimation() {
    window.requestAnimationFrame(drawAnimation);
    context.clearRect(0, 0, canvas.width, canvas.height);
    if(Intersect(rectA,rectB)){
     console.log('interact!!!!');
    }
    if(mouse.x){
        rectB.x = mouse.x;
        rectB.y = mouse.y;
    }
    rectA.draw(context);
    rectB.draw(context);
}

3、初始化

新建Init.js ,獲取canvas元素并綁定鼠標移動檢測,初始化Rect對象A和B,最后開啟動畫循環。

代碼如下:

window.onload = function () {
    canvas = document.getElementById('collCanvas');
    context = canvas.getContext('2d');
    Capturemouse(canvas);
    rectA = new Rect(canvas.width/2,canvas.height/2,100,100);
    rectB = new Rect(100,100,100,100);
    drawAnimation();
}

2、基于圓形的碰撞檢測

說完矩形碰撞,我們再來聊聊圓形碰撞,同樣我們將創建兩個Circle對象A和B(以下簡稱A,B),其中A位置固定,B跟隨鼠標移動,當A,B重疊時控制臺將提示intercect!!

1、創建circle對象

function Circle(x,y,radius) {
    this.x = x;
    this.y = y;
    this.radius = radius;
}

Circle.prototype.draw = function(context){
    context.save();
    context.translate(this.x,this.y);
    context.beginPath();
    context.arc(0,0,this.radius,0,Math.PI*2,false);
    context.fill();
    context.restore();
}

2、檢測圓形碰撞

圓形間碰撞檢測可以簡單地通過兩圓心間距離與兩圓半徑之和的比較做判斷,當兩圓心距離小于兩圓半徑之和時則發生碰撞。

如下圖:

所以我們首先需要做的是計算出兩圓心間的距離,這里我們將用到兩點間的距離公式,如下:

當取得兩圓心間的距離之后將與兩圓半徑之和比較,如果距離小于半徑之和則返回true。

現在我們更新Interaect函數。

代碼如下:

function Intersect(circleA,circleB) {
    var dx = circleA.x-circleB.x;
    var dy = circleA.y-circleB.y;
    var distance = Math.sqrt(dx*dx+dy*dy);
    return distance < (circleA.radius + circleB.radius);
}

3、動畫循環

更新animation.js,這里我們替換Rect對象為Circle對象。

代碼如下:

function drawAnimation() {
    window.requestAnimationFrame(drawAnimation);
    context.clearRect(0, 0, canvas.width, canvas.height);
    if(Intersect(circleA,circleB)){
     console.log('interact!!!!');
    }
    if(mouse.x){
        circleB.x = mouse.x;
        circleB.y = mouse.y;
    }
    circleA.draw(context);
    circleB.draw(context);
}

4、初始化

更新Init.js ,初始化Circle對象A和B,最后開啟動畫循環。

代碼如下:

window.onload = function () {
    canvas = document.getElementById('collCanvas');
    context = canvas.getContext('2d');
    Capturemouse(canvas);
    circleA = new Circle(canvas.width/2,canvas.height/2,100);
    circleB = new Circle(100,100,100);
    drawAnimation();
}

3、基于矩形與圓形間的碰撞檢測

前面講解都是單一形狀間的碰撞檢測,下面我們將檢測矩形和圓形間的碰撞。

1、檢測碰撞

和矩形檢測一樣,我們先看看沒有發生碰撞的四種情況。

如下圖:

以下是對這四種狀態的判斷:

  • Circle.y + Circle.radius < Rect.y
  • Circle.x - Circle.radius > Rect.x + Rect.width
  • Circle.y - Circle.radius > Rect.y + Rect.height
  • Circle.x + Circle.radius < Rect.x

更新Interaect函數,將沒有重疊的狀態“取反”,向該函數傳入Rect對象和Circle對象,當Rect對象與Circle對象發生重疊將返回true。

代碼如下:

function Intersect(Rect,Circle) {
    return !(Circle.y + Circle.radius < Rect.y ||
             Circle.x - Circle.radius > Rect.x + Rect.width ||
             Circle.y - Circle.radius > Rect.y + Rect.height ||
             Circle.x + Circle.radius < Rect.x)
}

2、動畫循環

更新animation.js,這里我們將circle對象跟隨鼠標運動,并檢測與固定位置的rect對象的碰撞。

代碼如下:

function drawAnimation() {
    window.requestAnimationFrame(drawAnimation);
    context.clearRect(0, 0, canvas.width, canvas.height);
    if(Intersect(rect,circle)){
     console.log('interact!!!!');
    }
    if(mouse.x){
        circle.x = mouse.x;
        circle.y = mouse.y;
    }
    circle.draw(context);
    rect.draw(context);
}

3、初始化

更新Init.js ,初始化Circle對象和Rect對象,最后開啟動畫循環。

代碼如下:

window.onload = function () {
    canvas = document.getElementById('collCanvas');
    context = canvas.getContext('2d');
    Capturemouse(canvas);
    circle = new Circle(100,100,100);
    rect = new Rect(canvas.width/2,canvas.height/2,100,100);
    drawAnimation();
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

標簽:赤峰 金昌 聊城 中山 阿壩 萍鄉 盤錦 綏化

巨人網絡通訊聲明:本文標題《Html5 Canvas動畫基礎碰撞檢測的實現》,本文關鍵詞  Html5,Canvas,動畫,基礎,碰撞,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Html5 Canvas動畫基礎碰撞檢測的實現》相關的同類信息!
  • 本頁收集關于Html5 Canvas動畫基礎碰撞檢測的實現的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品福利一区| 91亚洲国产成人精品一区二三| 精品久久99ma| 不卡视频在线看| 日本不卡的三区四区五区| 欧美韩国日本综合| 久久久久久久久久久黄色| 日韩一级大片在线| 精品一区二区精品| 久久婷婷成人综合色| 国产精品乱码妇女bbbb| 欧美三级午夜理伦三级中视频| 琪琪久久久久日韩精品| 亚洲卡通动漫在线| 国产精品久久久久一区二区三区| 欧美三区在线观看| 色播五月激情综合网| 成人97人人超碰人人99| 成人黄色综合网站| 粉嫩绯色av一区二区在线观看| 蜜臀久久久久久久| 另类中文字幕网| 视频一区中文字幕| 亚洲亚洲人成综合网络| 樱花草国产18久久久久| 亚洲色欲色欲www| 国产亚洲精品免费| 中文字幕国产一区| 中文字幕在线观看一区| 久久久久久久久免费| 国产三级欧美三级日产三级99| 精品粉嫩aⅴ一区二区三区四区| 日韩一区二区三区在线| 欧美午夜电影在线播放| 欧美性受极品xxxx喷水| 欧美日韩在线免费视频| 欧美一区二区黄色| 日韩一区二区在线观看| 2023国产一二三区日本精品2022| 久久久久久久久久久久久久久99| 国产精品妹子av| 一区二区欧美视频| 日韩精品每日更新| 国产久卡久卡久卡久卡视频精品| 久久久久久97三级| 国产成人一级电影| 99久久精品国产一区二区三区| 国产精品一二三四| 欧美大片在线观看一区| 欧美在线一二三四区| 色婷婷国产精品久久包臀| 麻豆成人av在线| 欧美影院午夜播放| 日韩欧美激情四射| 欧美日韩久久久| 欧美日韩高清在线| 国产精品免费人成网站| 欧美精品亚洲一区二区在线播放| 午夜私人影院久久久久| 欧美三级日韩三级| 精品日韩成人av| 日本一区二区电影| 亚洲午夜精品网| 国产精品白丝jk白祙喷水网站| 色激情天天射综合网| 日韩欧美电影一区| 亚洲免费大片在线观看| 日韩精品一区第一页| aaa亚洲精品| 欧美大黄免费观看| 亚洲免费av高清| 国产在线精品一区二区三区不卡| 国产91精品精华液一区二区三区 | 欧美精品第一页| 日韩三级中文字幕| 一二三区精品视频| 成人视屏免费看| 精品国产免费一区二区三区四区| 亚洲v日本v欧美v久久精品| 成人教育av在线| 中文在线免费一区三区高中清不卡| 日本成人在线电影网| 欧美三级在线播放| 亚洲第一狼人社区| 欧美亚洲国产一区二区三区 | www.亚洲色图.com| 日韩一区二区电影| 日韩影院精彩在线| 在线精品观看国产| 综合激情网...| 成人av电影在线| 成人欧美一区二区三区黑人麻豆 | 色吧成人激情小说| 亚洲视频中文字幕| 色八戒一区二区三区| 国产精品久久久99| 国产一区久久久| 日韩精品在线看片z| 激情综合网av| 日本一区二区在线不卡| 国产成人av网站| 国产欧美精品一区二区三区四区| 国产九九视频一区二区三区| 91精品国产91久久久久久最新毛片| 午夜视频一区在线观看| 91福利资源站| 亚洲福利一区二区三区| 欧美日韩精品二区第二页| 性做久久久久久免费观看欧美| 欧美久久一二区| 奇米在线7777在线精品| 久久久青草青青国产亚洲免观| 国内成人免费视频| 国产精品大尺度| 91香蕉视频mp4| 亚洲成人av电影在线| 色综合天天综合狠狠| 亚洲国产综合视频在线观看| 欧美午夜精品免费| 亚洲国产欧美一区二区三区丁香婷| 欧美美女bb生活片| 日本视频一区二区| 国产亚洲精品7777| 99久久精品国产精品久久| 国内精品嫩模私拍在线| 久久综合久久久久88| 成人午夜伦理影院| 亚洲高清不卡在线| 久久久久成人黄色影片| 色综合久久久久综合体桃花网| 日韩理论在线观看| 北岛玲一区二区三区四区| 久久久久久电影| 久久精品国产亚洲高清剧情介绍| 久久综合精品国产一区二区三区| 99re热这里只有精品视频| 人人精品人人爱| 最新不卡av在线| 日韩三级免费观看| 91黄色在线观看| 成人性生交大片免费看中文| 天堂影院一区二区| 亚洲欧美国产77777| 久久日韩粉嫩一区二区三区| 777奇米成人网| 91久久久免费一区二区| 成人午夜电影小说| 韩国精品免费视频| 亚洲成av人片| 亚洲精品美国一| 日本一区免费视频| 久久久亚洲高清| 日韩美女在线视频| 欧美日韩不卡在线| 一本色道久久综合狠狠躁的推荐| 国产精品99久久久久久久vr| 亚洲图片一区二区| 亚洲天堂福利av| 欧美高清在线一区二区| 精品久久国产老人久久综合| 制服丝袜中文字幕一区| 欧美中文字幕亚洲一区二区va在线| 国产乱子轮精品视频| 蜜臀va亚洲va欧美va天堂| 爽好久久久欧美精品| 午夜激情久久久| 一区二区三区精品在线观看| 国产精品全国免费观看高清| 精品第一国产综合精品aⅴ| 日韩网站在线看片你懂的| 99久久99久久精品国产片果冻| 极品美女销魂一区二区三区免费| 免费美女久久99| 日本一不卡视频| 蜜臀精品久久久久久蜜臀| 久久99久久99精品免视看婷婷| 五月综合激情网| 日韩综合一区二区| 免费的国产精品| 另类小说图片综合网| 久久电影网电视剧免费观看| 经典三级视频一区| 成人黄色大片在线观看| 91女厕偷拍女厕偷拍高清| 91色婷婷久久久久合中文| 日本韩国一区二区| 欧美久久一区二区| 精品理论电影在线观看| 国产日韩高清在线| 国产精品短视频| 亚洲成人高清在线| 久久精品国产免费| 国产v日产∨综合v精品视频| 成人美女视频在线看| 色婷婷综合五月| 4438成人网| 国产日韩欧美制服另类| 中文字幕日韩一区二区| 亚洲成av人片观看| 国产精品自产自拍|