2017-02-13 1 views
0

Я пытаюсь создать флеш-игру, в которой есть обнаружение столкновения между игроком и стенами. Однако, когда я пытаюсь использовать Wall11.hitTestPoint(), я не могу добиться идеального обнаружения столкновения. Затем я решил использовать растровое изображение, но его сложно закодировать, потому что стена имеет неправильную форму (это не квадрат, прямоугольник, круг или обычная форма). Есть ли способ улучшить обнаружение столкновений со стенами?(ActionScript 3) Оптимизированная по пикселям обнаружение столкновений между стенами и игроком?

function checkCollision(_debug:Boolean = false):Boolean {   
     var bmd1:BitmapData = new BitmapData(Wall11.width, Wall11.height, true, 0); 
     var bmd2:BitmapData = new BitmapData(LevelOnePlayer.width, LevelOnePlayer.height, true, 0); 

     bmd1.draw(Wall11); 
     bmd2.draw(LevelOnePlayer); 

     if (_debug) { 
      var bmp:Bitmap = new Bitmap(bmd1); 
      bmp.x = Wall11.x; 
      bmp.y = Wall11.y; 
      addChild(bmp); 

      var bmp2:Bitmap = new Bitmap(bmd2); 
      bmp2.x = LevelOnePlayer.x; 
      bmp2.y = LevelOnePlayer.y; 
      addChild(bmp2); 
     } 
     if(bmd1.hitTest(new Point(Wall11.x, Wall11.y), 255, bmd2, new Point(LevelOnePlayer.x, LevelOnePlayer.y), 255)) 
     return true; 
     if (!_debug) { 
      bmd1.dispose(); 
      bmd2.dispose(); 
     } 
     return false; 
    }  
+0

Пожалуйста, объясните, почему hitTestPoint (с последним аргументом shapeFlag = true) не работает для вас? – Organis

+0

Независимо от того, что я установил, стена всегда обнаруживает столкновение, когда игрок находится слишком близко или слишком далеко от стены. Я не знаю, как установить столкновение в точку, где мне нужна точка столкновения. –

+0

Опять же, чтобы это исключить. Используете ли вы флаг формы и формы? Кроме того, вы используете координаты сцены для точки или локальных координат? – Organis

ответ

0

Это основы материала hitTestPoint.

package 
{ 
    import flash.geom.Point; 

    import flash.events.Event; 

    import flash.display.Shape; 
    import flash.display.Sprite; 
    import flash.display.StageAlign; 
    import flash.display.StageScaleMode; 

    import flash.text.TextField; 
    import flash.text.TextFormat; 
    import flash.text.TextFormatAlign; 

    public class HitTest extends Sprite 
    { 
     private var textArea:TextField; 
     private var Circle:Shape; 
     private var Box:Shape; 

     public function HitTest() 
     { 
      if (stage) onStage(); 
      else addEventListener(Event.ADDED_TO_STAGE, onStage); 
     } 

     private function onStage(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, onStage); 

      stage.scaleMode = StageScaleMode.NO_SCALE; 
      stage.showDefaultContextMenu = false; 
      stage.align = StageAlign.TOP_LEFT; 
      stage.stageFocusRect = false; 

      addShapes(); 
      addLabel(); 
      onFrame(); 

      // Call it every frame to keep things updated. 
      addEventListener(Event.ENTER_FRAME, onFrame); 
     } 

     private function onFrame(e:Event = null):void 
     { 
      // Place graphics to the center of the stage. 
      x = stage.stageWidth >> 1; 
      y = stage.stageHeight >> 1; 

      // Lets detect collision with the circle. 
      var aPoint:Point = new Point(); 

      // Take local mouse coordinates within the target shape. 
      aPoint.x = Circle.mouseX; 
      aPoint.y = Circle.mouseY; 

      // Convert them into the root coordinates - it is the ONLY correct way. 
      // Comment the next 2 lines to see how local coordinates fail to work. 
      aPoint = Circle.localToGlobal(aPoint); 
      aPoint = root.globalToLocal(aPoint); 

      // Hit test the point against shape. 
      // Set the last parameter to false to see hitTest against the shape bounding box. 
      var aHit:Boolean = Circle.hitTestPoint(aPoint.x, aPoint.y, true); 

      textArea.text = aHit? "! HIT !": "NO HIT"; 
     } 

     private function addShapes():void 
     { 
      Circle = new Shape(); 
      Circle.graphics.lineStyle(2, 0x000000, 1); 
      Circle.graphics.beginFill(0xCC99FF, 1); 
      Circle.graphics.drawCircle(0, 0, 50); 
      Circle.graphics.endFill(); 

      Box = new Shape(); 
      Box.graphics.lineStyle(0, 0xCCCCCC, 1); 
      Box.graphics.drawRect(-50, -50, 100, 100); 

      addChild(Box); 
      addChild(Circle); 
     } 

     private function addLabel():void 
     { 
      textArea = new TextField(); 

      textArea.x = 10; 
      textArea.y = 10; 
      textArea.width = 70; 
      textArea.height = 20; 

      textArea.border = true; 
      textArea.wordWrap = false; 
      textArea.multiline = true; 
      textArea.selectable = true; 
      textArea.background = true; 
      textArea.mouseEnabled = false; 

      var aFormat:TextFormat; 

      aFormat = textArea.getTextFormat(); 
      aFormat.font = "_typewriter"; 
      aFormat.size = 12; 
      aFormat.bold = true; 
      aFormat.align = TextFormatAlign.CENTER; 

      textArea.setTextFormat(aFormat); 
      textArea.defaultTextFormat = aFormat; 

      stage.addChild(textArea); 
      textArea.text = "NO HIT"; 
     } 
    } 
} 
+0

Извините, что я не ответил через месяц. В любом случае, спасибо за вашу помощь. Для меня это не совсем понятно: что означает Circle.mouseX? –

+0

@GaryLuKOTH Локальные координаты мыши в системе координат круга. Пожалуйста, прочитайте http://stackoverflow.com/questions/6062209/flash-as3-understanding-localtoglobal и http://www.emanueleferonato.com/2010/06/22/understanding-as3-localtoglobal-method/ для лучшего понимания. – Organis

+0

Спасибо. Теперь я понимаю, как работает ваш код. Теперь мне просто нужно знать, как найти обнаружение столкновения между разными формами, помимо мыши. –

Смежные вопросы