2013-10-01 2 views
0

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

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

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, поэтому он не доступен для кликов.

Любая помощь будет принята с благодарностью.

ответ

0

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

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

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

+0

Я понимаю, что вы имеете в виду. Оцените пример, не относящийся к псевдокоду, но я могу попытаться выяснить это сам. –

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