传感器2

演示

源代码

window.onload = function () {
    var w, h, canvas, ctx, world, circleBody, sensorSize = 1.4, inactiveColor = 'green';
    var sensors = [];
    
    init();
    requestAnimationFrame(animate);
    
    function init() {
        // 初始化画布
        canvas = document.getElementById("renderCanvas");
        w = canvas.width;
        h = canvas.height;
        ctx = canvas.getContext("2d");
        ctx.fillStyle = 'green';
        
        // 初始化物理引擎
        world = new p2.World({ gravity: [0, 0] });
        
        // 添加一个圆
        circleShape = new p2.Circle({ radius: 0.3 });
        circleBody = new p2.Body({ mass: 1 });
        circleBody.damping = 0;
        circleBody.addShape(circleShape);
        circleBody.color = 'red';
        world.addBody(circleBody);
        
        // 添加四个正方形传感器
        for (var i = 0; i < 4; i++) {
            sensorShape = new p2.Box({ width: sensorSize, height: sensorSize });
            sensorShape.sensor = true;
            var pos = [sensorSize / 2, sensorSize / 2];
            if (i == 1) {
                pos[0] *= -1;
            } else if (i == 2) {
                pos[1] *= -1;
            } else if (i == 3) {
                pos[0] *= -1;
                pos[1] *= -1;
            }
            sensorBody = new p2.Body({
                position: pos
            });
            sensorBody.damping = 0;
            sensorBody.addShape(sensorShape);
            sensorBody.active = false;
            world.addBody(sensorBody);
            sensors.push(sensorBody);
        }
        world.on("beginContact", function (event) {
            for (var i = 0; i < sensors.length; i++) {
                var s = sensors[i];
                if (event.bodyA == s || event.bodyB == s) {
                    s.active = true;
                }
            }
        });
        world.on("endContact", function (event) {
            for (var i = 0; i < sensors.length; i++) {
                var s = sensors[i];
                if (event.bodyA == s || event.bodyB == s) {
                    s.active = false;
                }
            }
        });
    }
    
    function drawObjects(ctx) {
        // 绘制传感器
        for (var i = 0; i < sensors.length; i++) {
            ctx.fillStyle = sensors[i].active ? 'red' : 'green';
            ctx.fillRect(
              sensors[i].position[0] - sensorSize / 2,
              sensors[i].position[1] - sensorSize / 2,
              sensorSize,
              sensorSize
            );
        }
        // 绘制圆形
        ctx.fillStyle = 'blue';
        ctx.beginPath();
        ctx.arc(circleBody.position[0], circleBody.position[1], circleShape.radius, 0, 2 * Math.PI);
        ctx.fill();
    }
    
    function render() {
        ctx.clearRect(0, 0, w, h);
        ctx.save();
        ctx.translate(w / 2, h / 2);
        ctx.scale(50, -50);
        drawObjects(ctx);
        ctx.restore();
    }
    
    var lastTime, timeStep = 1 / 60, maxSubSteps = 5;
    
    // 动画循环
    function animate(time) {
        requestAnimationFrame(animate);
        var dt = lastTime ? (time - lastTime) / 1000 : 0;
        dt = Math.min(1 / 10, dt);
        lastTime = time;
        circleBody.position[0] = 1 * Math.cos(world.time);
        circleBody.position[1] = 1 * Math.sin(world.time);
        // 进行物理模拟
        world.step(timeStep, dt, maxSubSteps);
        // 绘制场景
        render(time);
    }
 }

发布时间:2016/12/18 下午3:39:57  阅读次数:4690

2006 - 2024,推荐分辨率 1024*768 以上,推荐浏览器 Chrome、Edge 等现代浏览器,截止 2021 年 12 月 5 日的访问次数:1872 万 9823 站长邮箱

沪 ICP 备 18037240 号-1

沪公网安备 31011002002865 号