2016-01-14 1 views
0

Я пытаюсь разблокировать игру. У меня есть массив объектов, и я сделал столкновение границ. Но теперь я застрял в столкновении между объектами. Я сделал цикл над объектами в массиве, но он останавливается на последнем. Как я могу совершать проверку столкновений по каждому объекту каждый раз, когда я перемещаюсь с помощью выбранного объекта? Полный код здесь: http://foxfcb.sweb.cz/ Я новичок в программировании, поэтому, пожалуйста, будьте терпеливы.Несколько столкновений в холсте

canvas.addEventListener('mousemove', function (e) { 

    ... 

     var shapes = myState.shapes; 
     var l = shapes.length; 

     for (var i = 0; i < l; i++) { 

      var shape = myState.shapes[i]; 
      var selection = myState.selection; 

      // collision between objects 
      if (selection.x < (shape.x + shape.w) && (selection.x + selection.w) > shape.x && 
       selection.y < (shape.y + shape.h) && (selection.y + selection.h) > shape.y) { 
       myState.valid = true; //stop 
      } 
      // boundaries collision 
      else if (myState.selection.x < 0 || myState.selection.y < 0 || myState.selection.x + myState.selection.w > 600 || myState.selection.y + myState.selection.h > 600) { 
       myState.valid = true; //stop 
      } 

      else { 
       myState.valid = false; //moving 

      } 
     } 

    } 

ответ

1

Вы устанавливаете флаг valid, когда вы проверяете другие объекты.

Итак, вот ваше обнаружение столкновения как функция. Обратите внимание: я устанавливаю state = false один раз перед циклом, и если есть столкновение I break вне цикла, поскольку нет никакой точки, обнаруживающей другие столкновения, поскольку флаг равен true или false. Вы устанавливали флаг на false на всех, кроме последнего объекта, если вы обнаружили столкновение.

var textCollision = function(){ 
    var shapes, l, shape, selection, i; 
    shapes = myState.shapes; 
    l = shapes.length; 
    myState.valid = false; // assume no collision 
    for (i = 0; i < l; i++) { 
     shape = myState.shapes[i]; 
     selection = myState.selection; 
     if (selection.x < (shape.x + shape.w) && (selection.x + selection.w) > shape.x && 
      selection.y < (shape.y + shape.h) && (selection.y + selection.h) > shape.y) { 
      myState.valid = true; //stop 
      // there is no point testing any others as it will make no dif 
      break; // step out of the for loop. 
     } 
     // boundaries collision 
     else if (myState.selection.x < 0 || myState.selection.y < 0 || myState.selection.x + myState.selection.w > 600 || myState.selection.y + myState.selection.h > 600) { 
      myState.valid = true; //stop 
      // there is no point testing any others as it will make no dif 
      break; // step out of the for loop. 
     } 
    } 

} 

Перерыв.

Перерыв - это токен, зарезервированный для javascript, и используется для выхода из циклов и переключателей.

Для петли

for(i = 0; i < 10; i++){ 
    if(i === 2){ 
     break; // exit the loop at 2 
    } 
} 

В то время как петля

while(i < 10){ 
    if(i === 2){ 
     break; // exit out of the while loop 
    } 
} 

также делает то же самое на do{ }While() петель.

Разрыв только выходит из токового контура;

for(j = 0; j < 10; j++){ // j loop 
    for(i = 0; i < 10; i++){ // i loop 
     if(i === 2){ 
      break; // exit the i loop at 2 
     } 
    } 
    // the break moves execution to the first line after the loop it is in 
    // the j loop continues as normal 
} 

Перерыв также используется в операторах переключателей

function num(i){ 
    switch(i){ 
    case 1: 
     console.log("one"); 
     // no break token so execution continues inside the switch 
    case 2: 
     console.log("two"); 
    } 
} 
num(1); // outputs "one" "two" 

Чтобы предотвратить это использование break

function num(i){ 
    switch(i){ 
    case 1: 
     console.log("one"); 
     break; // break out of the switch 

    case 2: 
     console.log("two"); 
     // no point having a break here as it is at the end anyways 
    } 
    // break moves execution to here 
} 
num(1); // outputs "one" 
+0

Жаль, что я не писал раньше. Это отличная идея с перерывом, но есть еще одна ошибка. В массиве есть объект, с которым я действительно перемещаюсь. И для этого он переходит в состояние и перестает двигаться в самом начале. Мне нужно извлечь объект, я действительно перехожу из массива. Но я думаю, что смогу это сделать. Большое спасибо. Направьте свою помощь. –

+0

Хорошо, я сделал условие для своего массива, и он работает! :) if (фигуры [i]! == myState.selection) { ... } –