Обнаружение столкновений Javascript генерирует больше, чем должно быть - PullRequest
0 голосов
/ 03 мая 2019

Я создаю простую игру на javascript, в которой весло должно ловить дождевые блоки. При столкновении оценка должна увеличиться на 1, но в моем случае оценка увеличивается на 12.

Я совершенно уверен, что обнаружение столкновений происходит, потому что блок исчезает, когда он касается весла, и у меня есть console.log, чтобы показать мне, что произошло столкновение.

Мой код обнаружения столкновения

var spawnRate = 1500;
    var spawnRateOfDescent = 2;
    var lastSpawn = -10;
    var objects = [];
    var startTime = Date.now();
    var score =0;

    function spawnRandomObject() {
    
        var t;

        if (Math.random() < 0.50) 
        {
            t = "red";
        } 
        else 
        {
            t = "blue";
        }
   
        var object = {      
            type: t, 
            x: Math.random() * (canvas.width - 30) + 15,
            y: 100,
            r: 8,
            status: 1 
        }
         
       objects.push(object);
    }


    function animate() 
    {
        var time = Date.now();    
        if (time > (lastSpawn + spawnRate)) {
            lastSpawn = time;
            spawnRandomObject();
        }

        var paddleLeft=paddleX;
        var paddleRight=paddleX+paddleWidth;
        var paddleTop=paddleY;
        var paddleBottom=paddleY+paddleHeight;
      
        for (var i = 0; i < objects.length; i++) 
        {

            var object = objects[i];
            object.y += spawnRateOfDescent;

            if (object.status == 1){ //only draw the ball if the status is 1
            ctx.beginPath();
            ctx.arc(object.x, object.y, object.r, 0, Math.PI * 2);
            ctx.closePath();
            ctx.fillStyle = object.type;
            ctx.fill();
            }

            var objectTop=object.y-object.r;
            var objectBottom=object.y+object.r;
            var objectLeft=object.x-object.r;
            var objectRight=object.x+object.r;

            
            if (objectRight>paddleX && objectLeft<paddleX+paddleWidth && objectBottom>paddleY && objectTop<paddleY+paddleHeight)
            {
                object.status = 0; 
                console.log("collision");
                score = score +1;
            }
        }
    }

1 Ответ

0 голосов
/ 03 мая 2019

В следующем фрагменте кода вы добавляете счет:

            if (objectRight>paddleX && objectLeft<paddleX+paddleWidth && objectBottom>paddleY && objectTop<paddleY+paddleHeight)
            {
                object.status = 0; 
                console.log("collision");
                score = score +1;
            }

Я вижу, вы устанавливаете status объекта на 0. Вы можете использовать это в условии:

            if (objectRight>paddleX && objectLeft<paddleX+paddleWidth && objectBottom>paddleY && objectTop<paddleY+paddleHeight && object.status === 1)
            {
                object.status = 0; 
                console.log("collision");
                score++;
            }

Имейте в виду, что вы не удаляете объект из массива.

...