Пусть линия привязывается к центру точки

Я делаю игру с сенсорным экраном, соединяющую точки, для моей стажировки в AS3, вот краткий пример моего игрового процесса:

  1. Пользователь выбирает уровень.
  2. Изображение / координаты с этого уровня загружаются, и изображение добавляется на сцену.
  3. Когда координаты точек загружены (XML), точки получают MovieClips (circlePointприлагается к ним. Все эти мувиклипы имеют уникальное значение (circlePoint.id) и MouseEvent.MOUSE_OVER слушатель, который стреляет clickPoint(), MovieClips получают в моем pointContainer,
  4. За моей мышью следует прямая линия, которая начинается с первой точки.
  5. Если мой gameCounter переменная такая же, как мувиклип idлиния будет привязана к точке, и после моей мыши начнется новая линия. Конечно, эта новая линия начинается с последней точки, которая была затронута.

Все это работает как шарм, но я сталкиваюсь с одной проблемой; если моя мышь сталкивается с MovieClip, линия привязывается к текущей позиции мыши. Эта позиция - угол моего circlePoint и я хочу, чтобы это был центр. Поэтому я решил позволить новой линии начинаться в центре текущей точки. Но предыдущая строка все еще находится на углу circlePoint а новый начинается в центре, выглядит не очень красиво. Я думал об уменьшении размера моих точек, но точки станут слишком маленькими для прикосновения, так как это игра с сенсорным экраном. Это то, что я написал до сих пор:

private function setStartPoint():void{
    mouseLines.push(new Sprite);
    stage.addChild(mouseLines[mouseLines.length-1]);
    holderX = pointContainer.getChildAt(0).x;
    holderY = pointContainer.getChildAt(0).y;
    stage.removeEventListener(MouseEvent.CLICK, setStartPoint);
    stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseFollower);
    stage.addEventListener(MouseEvent.CLICK, clickPoint);
}

setStartPoint() Функция срабатывает, когда все мувиклипы добавляются на сцену.

private function clickPoint(e:MouseEvent):void{
    if(gameCounter == e.target.id){
        holderX = e.target.x;
        holderY = e.target.y;
        mouseLines[mouseLines.length-1].graphics.lineTo(holderX, holderY);
        stage.removeEventListener(MouseEvent.MOUSE_MOVE, mouseFollower);

        gameCounter++;
        mouseLines.push(new Sprite);
        stage.addChild(mouseLines[mouseLines.length-1]);
        stage.addEventListener(MouseEvent.MOUSE_MOVE, mouseFollower);
    }
}

clickPoint() уволен MOUSE_OVER как указано выше.

private function mouseFollower(e:MouseEvent):void{
    mouseLines[mouseLines.length-1].graphics.clear();
    mouseLines[mouseLines.length-1].graphics.lineStyle(5,0x0000FF);
    mouseLines[mouseLines.length-1].graphics.moveTo(holderX, holderY);
    mouseLines[mouseLines.length-1].graphics.lineTo(mouseX, mouseY);
    mouseLines[mouseLines.length-1].mouseEnabled = false;
}

mouseFollower() функция рисует линию на MOUSE_MOVE, А также mouseEnabled конечно, установлен на false, поэтому он не кликабелен.

Любая помощь будет оценена.

1 ответ

Решение

Я чувствую, что то, что вы пытаетесь сделать здесь, сравнимо с рисованием произвольной формы в графической программе (такой как Photoshop). Поэтому я думаю, что вы делаете вещи сложными для себя. Вы можете просто иметь центр кругов как векторы и затем провести линию между ними. Тогда вы могли бы легко сказать что-то вроде.

private function mouseFollower(e:MouseEvent):void{
  if(e.Hittest){
    DrawLine(lastVector,curVector);
  }
}

(это псевдокод так.)

Другие вопросы по тегам