Поведение перекрестного сопротивления для игры - PullRequest
0 голосов
/ 27 декабря 2011

Я хочу создать блочную игру, где вы можете перетаскивать блоки. Я ищу самое дружелюбное поведение. Он должен двигаться только горизонтально или вертикально, и только на 1 позицию блока. Он должен защелкнуться (легко добраться до нужного целевого положения), потому что вы не можете отпустить его посередине (между блоками). Он должен вести себя как кнопка переключения iPhone, но в крест. Я попытался сделать это, проверив угол мыши к исходному положению блока, чтобы проверить, в каком направлении он должен двигаться. Я хочу, чтобы он всегда двигался через центр (исходное положение). Я имею в виду; он не может анимироваться из левого положения в верхнее, сначала он должен анимироваться в центр.

Блоки выровнены по левому верхнему углу, и между блоками есть промежуток.

Каков наилучший способ сделать это? Drag behavior game example

UPDATE:
Это мой текущий код. В настоящее время он перемещается в направлении, но не анимируется в точку.

package nl.stroep.games.behaviors 
{
    import flash.display.DisplayObject;
    import flash.events.Event;
    import flash.events.MouseEvent;
    import flash.geom.Point;
    import nl.stroep.games.boxgame.Setting;
    /**
     * Target dragging behavior
     * @author Mark Knol
     */
    public class CrossDragBehavior 
    {
        private static const HALF_PI:Number = Math.PI / 2;
        private static const QUART_PI:Number = HALF_PI / 2;

        private var _target:DisplayObject;
        private var _targetPosition:Point;

        public function CrossDragBehavior(target:DisplayObject) 
        {
            _target = target;

            _target.addEventListener(MouseEvent.MOUSE_DOWN, handleMouse);
            _target.stage.addEventListener(MouseEvent.MOUSE_UP, handleMouse);
        }

        private function handleMouse(e:MouseEvent):void 
        {
            switch(e.type)
            {
                case MouseEvent.MOUSE_DOWN:
                {
                    _targetPosition = new Point(_target.x, _target.y);
                    _target.addEventListener(Event.ENTER_FRAME, update);
                    update(null);
                    break;
                }
                case MouseEvent.MOUSE_UP:
                {
                    _target.removeEventListener(Event.ENTER_FRAME, update);
                    break;
                }
            }
        }

        private function update(e:Event):void 
        {
            var mouseX:Number = _target.parent.mouseX;
            var mouseY:Number = _target.parent.mouseY;

            var dx:Number = mouseX - _targetPosition.x;
            var dy:Number = mouseY - _targetPosition.y;
            var angle:Number = Math.atan2(dy, dx);

            //trace(angle);

            var directionX:int = 0;
            var directionY:int = 0;

            if (dx * dx + dy * dy > Setting.BLOCK_WIDTH * Setting.BLOCK_WIDTH) // minimum distance before snap
            {
                if (angle < 0 * HALF_PI - QUART_PI) { directionX = 0; directionY = -1; }
                else if (angle < 1 * HALF_PI - QUART_PI) { directionX = 1; directionY = 0; }
                else if (angle < 2 * HALF_PI - QUART_PI) { directionX = 0; directionY = 1; }
                else if (angle < 3 * HALF_PI - QUART_PI) { directionX = -1; directionY = 0; }
                else { directionX = 1; directionY = 0; }
            }

            _target.x = _targetPosition.x + (directionX * (Setting.BLOCK_WIDTH + Setting.BLOCK_DISTANCE))
            _target.y = _targetPosition.y + (directionY * (Setting.BLOCK_HEIGHT + Setting.BLOCK_DISTANCE))
        }

        public function set target(value:DisplayObject):void 
        {
            _target = value;
        }

    }

}

1 Ответ

1 голос
/ 27 декабря 2011

Лучший способ сделать это, вероятно, то, что вам, возможно, придется выяснить самостоятельно.

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

Я непонять каждый аспект вашей игры ...

  "cause you cannot release it in the middle" //middle of what, of the cross?
  "I want it always to go move to the center." // how's that possible?
  "It should only move horizontal or vertical, and 1 block position only"
  "It should kinda behave like an iPhone switch button, but in a cross"

Лично я нахожу все эти строки запутанными.Как это может быть в кресте, если он движется только на один блок?

Если оставить в стороне эти проблемы, можно начать с создания класса Block.

Что для этого нужно сделать?

- Move Up   
- Move Down   
- Move Left   
- Move Right   

здесь у вас есть возможность реализовать один метод или метод для каждого движения.Ваш выбор:)

Если вы знаете, куда уходит Блок, то легко сделать его быстрым.При использовании метода твининга вам просто нужны точка назначения, функция задержки и функция замедления, чтобы сделать его плавным.

Направления тоже не слишком сложны, при перемещении мыши вы можете легко вычислить направление, когда выесть направление, у вас есть пункт назначения.Если у вас есть пункт назначения, у вас есть метод.

Итак, чтобы подвести итог, некоторые свойства и методы вашего класса Block могут иметь ...

  private var left:int = 0;
  private var right:int = 1;
  private var top:int = 2;
  private var down:int = 3;

  private var tweenDelay:Number = .5;

  // event listeners
  private function mouseDownListener(event:MouseEvent):void{};
  private function mouseUpListener(event:MouseEvent):void{};
  private function mouseMoveListener(event:MouseEvent):void{};

  //get a couple of coordinates, feed them to the method & 
  //return an int (or a String )
  private function getDirection(params:Object):int;

  private function tweenBlock( direction:String ):void{}

Добавьте несколько логических значений вчтобы ограничить движения вашего блока, или использовать прямоугольник, чтобы не выходить за пределы.Вуаля!:)

Возможно, я забыл или пропустил некоторые вещи, но это должно помочь вам начать.

С другой стороны, если вы уже знаете все вышеперечисленное и застряли, пожалуйста, сообщите намточно в чем проблема, и может быть возможно быть более полезным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...