矩形的碰撞检测(模仿俄罗斯方块)

  以前一直以为玄之又玄的碰撞检测算法,其实也不过是一些加减法。看来还是写的太少,大多时候只是停留在望而止步的层次。

矩形的碰撞检测原理就是两个矩形的x值+宽度和y值+高度的各种比较。

function(c1,c2{
    return !{
                     b1.x + b1.w < b2.x ||
                     b1.y + b1.h < b2.y ||
                     b2.x + b2.w < b1.x ||
                     b2.y + b2.h < b1.y
                }     

  意思就是矩形1的x加上矩形1的宽度是否小于矩形2的x,这样就能检测到当矩形1在矩形2的左边的时候,两个矩形在水平方向上是否有重叠;垂直方向同理,把x改为y,宽度改为高度即可。

  碰撞检测的原理搞清楚了之后其他的就是小意思了,利用动画帧即可做出方块下落的动画。  

  完整代码如下:

<!DOCTYPE html>
<html lang="en">

    <head>
        <meta charset="UTF-8">
        <title>碰撞检测</title>
        <style type="text/css">
            canvas{
                border: 1px solid #ccc;
            }
        </style>
    </head>

    <body>
        <canvas id="cav" width="300" height="300"></canvas>

        <script>
        /*通过调整方块的y轴位置而不断下落,如果到了画布的底部或者碰撞到了其他方块则停止下落,这是矩形的碰撞检测*/

            var cav = document.getElementById("cav"),
                ctx = cav.getContext(‘2d‘);

            var rects = [],//把方块存储起来
                speed = 2;//下落速度

            //方块的初始化
            function rectInit(x, y, width, height) {
                this.x = x;
                this.y = y;
                this.w = width;
                this.h = height;
            }

            //创建方块
            function createRect() {
                var x = cav.width * Math.random(),
                    y = 0;

                var rect = new rectInit(x, y, 30, 30);
                rects.push(rect);
                return rect;
            }

            //一开始先创建一个方块
            var oRect = new rectInit(cav.width / 2, 0, 30, 30);
            rects.push(oRect);

            //方块下落动画
            function animate() {
                ctx.clearRect(0, 0, cav.width, cav.height);

                //如果没有到底部
                if(oRect.y < cav.height-oRect.h){
                    oRect.y += speed;
                }
                else{//到了底部后停止下落
                    oRect.y = cav.height-oRect.h;

                    oRect = createRect();//再度创建一个方块
                }
                ctx.fillStyle = ‘#f00‘;

                //循环数组里存储的方块
                rects.forEach(function(r,i){
                    if(oRect !== r && collision(oRect,r)){
                    //    console.log(‘碰撞成功‘);
                        oRect.y = r.y - oRect.h;
                        oRect = createRect();
                    }

                    ctx.fillRect(r.x,r.y,r.w,r.h);
                });

                requestAnimationFrame(animate);
            }

            animate();

            //矩形的碰撞检测
            function collision(c1, c2) {
                return !(c1.x + c1.w < c2.x ||
                    c1.y + c1.h < c2.y ||
                    c2.x + c2.w < c1.x ||
                    c2.y + c2.h < c1.y
                );
            }
        </script>
    </body>

</html>
时间: 2024-10-08 09:58:25

矩形的碰撞检测(模仿俄罗斯方块)的相关文章

【COCOS2DX-游戏开发之三六】圆与未旋转矩形的碰撞检测(上篇)

我们以cocos2dx lua脚本来说明,原理才是重点 检测圆和矩形碰撞,首先要找到矩形上离圆的中心点最近的点 if circle.x < box.x then cx = box.x end 如果圆在矩形的左边,离着圆中心点最近的矩形上的点在矩形的左边边界上 elseif circle.x > box.x + box.width then cx = box.x + box.width 如果圆的中心点在矩形的右边,离着圆中心点最近的矩形上的点在矩形的右边边界上 else cx = circle.

圆形与矩形的碰撞检测--Mr.Ember

圆形与矩形的碰撞检测--Mr.Ember 已知:圆形半径和坐标* 矩形四个点坐标* 判断是否相交 先去找出矩形上离圆心最近的点,判断该点的距离是否小于圆半径,若小于半径,则为碰撞. let closestPoint = {x:0, y:0}; 约定圆形和矩形的类: //圆形 function Circle(x,y,r) { this.r = r; this.x = x; this.y = y; } //矩形 function Rect(ul,ur,dl,dr) { this.x = ul.x;

javascript中矩形的碰撞检测---- 计算碰撞部分的面积

今天在做一个拖拽改变元素排序的东西的时候,在做被拖动元素同时碰撞到两个元素时,究竟应该与哪个元素交换位置的问题上,纠结到崩溃,实在是想不到别的办法去做了,只能去想办法计算碰撞的面积. 这应该不是最合适的办法,具体怎样更合适,后续发现了再补上吧. 先说从妙味课堂里听到的九宫格判断碰撞检测的方法 如图,左侧的橙色箭头所指的线,是蓝色矩形右边和黑色矩形左边的距离,如果蓝色矩形右边的左边小于黑色矩形的左边,则两个矩形不可能发生碰撞,不可能发生碰撞的范围如图蓝色线条圈住的范围. 同样的道理,可以判断另外4

圆形和矩形的碰撞检测

首先来说明一下核心思想 无非是三种状态: 1.圆心在矩形中 2.圆心在矩形外,但在其某一边的侧面 3.圆心在矩形外.不再某一边的侧面 圆心在矩形中的情况十分好处理,这里就不说了. 下面来说一下2.3情况的核心应对思路: 首先,拿到矩形的四个顶点. 算出圆心到四个顶点分别的距离. 给距离从小到大排一下序. 取其中两个最小距离的点,求出圆心到这两点之间直线(或延长线)上最短距离的那个点. 重点来了: 这时候要看这个点是在两点之间,还是在这条直线的延长线上.如果是之间,就是情况2.再延长线上就是3.

旋转矩形碰撞检测 OBB方向包围盒算法

在cocos2dx中进行矩形的碰撞检测时需要对旋转过的矩形做碰撞检查,由于游戏没有使用Box2D等物理引擎,所以采用了OBB(Oriented bounding box)方向包围盒算法,这个算法是基于SAT(Separating Axis Theorem)分离轴定律的. 分离轴定律:两个凸多边形物体,如果我们能找到一个轴,使得两个在物体在该轴上的投影互不重叠,则这两个物体之间没有碰撞发生,该轴为Separating Axis.也就是说两个多边形在所有轴上的投影都发生重叠,则判定为碰撞:否则,没有

圆与矩形碰撞检测

圆与矩形的碰撞检测,假设矩形中心点v0, 上边中心点v1, 右边中心点v2, 圆心v, 圆半径r, 矩形半宽w1, 矩形半高h1,.v0为矩形的坐标系原点,(v0,v2)为矩形坐标系x轴,(v0,v1)为矩形坐标系y轴,圆心到矩形y轴距离为w2, 圆心到矩形x轴距离为h2,如图所示: 根据图示可以很容易的写出圆与矩形的碰撞检测算法: 圆与矩形碰撞检测

零基础HTML5游戏制作教程 第5章 碰撞检测

第5章 碰撞检测 几乎所有的游戏都需要碰撞检测.比如<贪吃蛇>,你需要检测蛇的前端是不是已经碰到了它的尾巴:比如<俄罗斯方块>,你需要检查方块是不是已经碰到了底部:比如<英雄联盟>,你需要判断adc的子弹或魔法是不是已经碰到了对方. 其实要做好碰撞检测是很难的,尤其是对于3d游戏或者图形复杂的2d游戏来说. 当然,对于简单图形来说,碰撞检测还是比较容易的,本章将分别介绍圆形的碰撞检测,矩形的碰撞检测,以及逻辑碰撞检测. 一,圆形碰撞检测 圆形间碰撞检测的原理是最简单的,

矩形旋转碰撞,OBB方向包围盒算法实现

如何进行2D旋转矩形的碰撞检测,可以使用一种叫OBB的检测算法(Oriented bounding box)方向包围盒.这个算法是基于SAT(Separating Axis Theorem)分离轴定律的.而OBB不仅仅是计算矩形的碰撞检测,而是一种算法模型.简单解释一下概念,包围盒和分离轴定律. 包围盒:是根据物体的集合形状,来决定盒子的大小和方向,这样可以选择最紧凑的盒子来代表物体.见下图 黑色的就是包围盒,可以是凸多边形,最贴近检测物体即可. 分离轴定律:两个凸多边形物体,如果我们能找到一个

“等一下,我碰!”——常见的2D碰撞检测

转自:https://aotu.io/notes/2017/02/16/2d-collision-detection/ 在 2D 环境下,常见的碰撞检测方法如下: 外接图形判别法 轴对称包围盒(Axis-Aligned Bounding Box),即无旋转矩形. 圆形碰撞 圆形与矩形(无旋转) 圆形与旋转矩形(以矩形中心点为旋转轴) 光线投射法 分离轴定理 其他 地图格子划分 像素检测 下文将由易到难的顺序介绍上述各种碰撞检测方法:外接图形判别法 > 其他 > 光线投射法 > 分离轴定理