2017-02-05 2 views
0

저는 현재 슬라이딩 퍼즐 게임 인 새로운 플래시 게임을 개발 중입니다. 그러나 표준 슬라이딩 퍼즐 게임처럼 대부분의 조각이 정사각형 모양이 아니기 때문에 조각 사이의 충돌 감지가 훨씬 어려워집니다. 나는 Yellow L과 White L 조각 사이의 충돌 탐지를 프로그램하기로 결정했다. 각 조각은 50X50 정사각형으로 잘라진 100X100 사각형이다. 어쨌든 충돌 감지 기능을 제공하여 서로 겹칠 수 없습니까?(액션 스크립트 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 매트릭스와 같은 것을 사용할 수 있습니다. 모든 대상 셀이 비어 있으면 행렬을 검사해야합니다. – Organis

+0

방금 ​​지난 주에이 정확한 작업을 수행했습니다 (Tetris 구축). 몇 가지 작업이 필요하지만 마침내 강력한 셀 기반 클래스 세트가 작동합니다. 나는 그것이 "더 나은"선택이라고 생각한다. 내가 당신을 위해 약간의 코드를 게시하기를 원한다면 알려주십시오. –

+0

코드 게시는 저에게 도움이 될 것입니다. –

답변

0

테트리스 스타일 게임에서 사용하는 충돌 검사입니다. 내 Main.as 파일에 있습니다. 그냥 그렇게, 스프라이트를 확장하고 사각형 (광산 여기에 적용 할 필요가없는 몇 가지 케이크를 가지고 무

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); 
     } 
    } 

그리고 블록 클래스 :

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; 
    } 

내 조각 클래스의 생성자 나는 그것을 게시하지 않을 것이다).

마지막으로 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. 가 배열 블록 인스턴스를 포함하는 조각 클래스를 확인 스프라이트
  2. 를 확장하는 블록 클래스를 확인 당신이 선택한 모양.
  3. 관련 블록 조각들 사이의 충돌 검사를 실행합니다. 그것은 일할 수있는 것처럼

편집

이 보인다. 그러나 하나 이상의 질문이 있습니다 : checkCollision() 부울 반환하지만 그 불리언 함께 할? 부울이 참이면 객체를 교차시킬 수 없게하려면 어떻게해야합니까?

이렇게 구현했습니다. 물체가 서로 교차하도록 허용 한 다음 전화하십시오.

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

작동하는 것처럼 보입니다. 그러나 하나 이상의 질문이 있습니다 : checkCollision() 부울 반환하지만 그 불리언 함께 할? 부울이 참이면 객체를 교차시킬 수 없게하려면 어떻게해야합니까? –

+0

내 편집을 참조하십시오. 몇 초 안에 게시 할 예정입니다. –