2017-02-05 15 views
0

В настоящее время я работаю над новой Flash-игрой, которая представляет собой раздвижную игру-головоломку. Тем не менее, большинство частей не имеют форму квадратов, как в стандартной разворачивающейся головоломке, что делает обнаружение столкновения между кусками намного сложнее. Я решил попытаться запрограммировать обнаружение столкновения между желтым L и куском белого L, каждый из которых представляет собой квадраты 100X100 с квадратом 50X50, отделенным от угла. Есть ли способ дать им обнаружение столкновений, чтобы они не могли пересекаться друг с другом?(ActionScript 3.0) Обнаружение столкновений для перетаскиваемых объектов?

var YellowLClicked: Boolean=false; 

addEventListener(Event.ENTER_FRAME,onEnterFrameHandler); 
YellowL.addEventListener(MouseEvent.MOUSE_DOWN, dragYellowL); 
YellowL.addEventListener(MouseEvent.MOUSE_UP, DoNotdragYellowL); 
YellowL.addEventListener(MouseEvent.ROLL_OUT, DoNotdragYellowL); 

function dragYellowL(e:MouseEvent): void{ 
    YellowLClicked=true; 
} 
function DoNotdragYellowL(e:MouseEvent): void{ 
    YellowLClicked=false; 
} 
function onEnterFrameHandler(e:Event): void{ 
    if(YellowLClicked){ 
      YellowL.startDrag(); 
    } else YellowL.stopDrag(); 

    //Can you help with this code here? 
    if(YellowL.hitTestObject(WhiteL)) trace("true"); else trace(false); 
} 
+1

Два варианта. Вы можете использовать некоторую 2D-физическую структуру, которая позволяет вам сталкиваться с любыми фигурами, которые вы хотите, или можете использовать что-то вроде 2D-матрицы Tetris, где любая форма занимает список ячеек, определяемых положением и поворотом фигуры, и если вы хотите переместить фигуру должны проверить матрицу, если все ячейки назначения свободны. – Organis

+0

Я только что сделал это на прошлой неделе (построил Тетрис). Это требует некоторой работы, но у меня наконец появился классный класс классов, основанный на ядре. Я думаю, что это «лучший» вариант. Дайте мне знать, если вы хотите, чтобы я опубликовал немного кода для вас. –

+0

Проводка кода будет работать для меня. –

ответ

0

Это проверка столкновения, которую я использую в своей игре в стиле тетриса. Он находится в моем файле Main.as.

private function checkCollision(f:GameField):Boolean{ 
     var p:Piece = f.activePiece; 
     var a:Array = f.blockArray; 
     for (var j:int = 0; j < p.numChildren; j++){ 
      var b:Block = p.getChildAt(j) as Block; 
      // check walls, your will probably have four instead of 3 
      if (b.hitTestObject(f.leftWall) || b.hitTestObject(f.rightWall) || b.row + b.rowLocal >= f._rows){ 
       return true; 
      } 
     } 
     // check all the blocks in f.blockArray 
     for (var i:int = 0; i < a.length; i++){ 
      // check the moving PIECE against all other BLOCKS 
      if (p.hitTestObject(a[i])){ 
       // check every child of the PIECE (these will be the blocks) 
       for (var j:int = 0; j < p.numChildren; j++){ 
        // excluding the BLOCKS in the moving PIECE 
        if (p.getChildAt(j).parent != a[i].parent){ 
         var b:Block = p.getChildAt(j) as Block; 
         // finally, BLOCK vs BLOCK collision check 
         if (b.hitTestObject(a[i])){ 
          return true; 
         } 
        } 
       } 
      } 
     } 
     return false; 
    } 

Это конструктор для моего класса Кусок:

public function Piece(f:GameField,shape:Array,color:uint) 
    { 
     makeGrid(); 
     f.addChild(this); 
     // the shape array passed to this constructor is shown at the end of my post 
     _shape = shape; 
     addBlocks(f,shape,color); 
    } 

    private function addBlocks(f:GameField, shape:Array, color:uint):void{ 
     _shape = shape; 
     for (var i:int = 0; i < shape.length; i++){ 
      var b:Block = new Block(color); 

      // this uses the Array passed as var "shape" to tell where the block will be in relation to the center of rotation of the Piece instance 
      b.rowLocal = shape[i].y+2; 
      b.columnLocal = shape[i].x+2; 

      // this tells the brick its starting column and row are 
      b.row = -2; 
      b.column = 3; 

      // this is the sum of the local and global coordinates 
      b.y = (b.rowLocal + b.row) * Main.UNIT_SIZE; 
      b.x = (b.columnLocal + b.column) * Main.UNIT_SIZE; 

      // put the block on the display list 
      addChild(b); 

      // add the block to the array to use for collision checks in the Main doc 
      f.blockArray.push(b); 
     } 
    } 

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

И, наконец, вызов конструктора Piece и пример массива формы, который передается ему.

 var newP:Piece = new Piece(f, arr, color); 

и форма массива:

 _shapeArray = [ 
     {shape:new Array(new Point (-2, 0), new Point (-1, 0), new Point (0, 0), new Point (1, 0)),color:_colorArray[0]}, // I 
     {shape:new Array(new Point (-1, -1), new Point (-1, 0), new Point (0, 0), new Point (0, -1)),color:_colorArray[1]}, // O 
     {shape:new Array(new Point (-2, -1), new Point (-1, -1), new Point (-1, 0), new Point (0, 0)),color:_colorArray[2]}, // Z 
     {shape:new Array(new Point (-2, 0), new Point (-1, 0), new Point (-1, -1), new Point (0, -1)),color:_colorArray[3]}, // S 
     {shape:new Array(new Point (-2, 0), new Point (-1, 0), new Point (0, 0), new Point (-2, -1)),color:_colorArray[4]}, // J 
     {shape:new Array(new Point (-2, 0), new Point (-1, 0), new Point (0, 0), new Point (0, -1)),color:_colorArray[5]}, // L 
     {shape:new Array(new Point (-2, 0), new Point (-1, 0), new Point (0, 0), new Point (-1, -1)),color:_colorArray[6]} // T 
     ]; 

Резюмируя:

  1. сделать класс блок, который расширяет Sprite
  2. сделать класс кусок, который содержит экземпляров блоков, расположенных в форму, которую вы выбираете.
  3. Запустите проверку столкновения между соответствующими кусками блоков.

редактировать

Это выглядит, как он может работать. Однако у меня есть еще один вопрос: checkCollision() возвращает логическое значение, но что я делаю с этим логическим? Если логическое значение true, как мне сделать объекты неспособными пересечь?

Вот как я это реализовал. Разрешить объектам пересекать друг друга, а затем звонить

if (checkCollision(f)) { 
    // check collision returned true 
    // so reverse the last move 
    // before finishing this game loop 
} 
+0

Похоже, это может сработать. Однако у меня есть еще один вопрос: checkCollision() возвращает логическое значение, но что я делаю с этим логическим? Если логическое значение true, как мне сделать объекты неспособными пересечь? –

+0

См. Мое редактирование. Будет опубликован в течение нескольких секунд –