![]() |
|
||||||||||
|
|||||
|
Регистрация: Dec 2013
Сообщений: 8
|
Как собственно такое реализовать? Вот мой код:
var pulya:Pulka=new Pulka(); //добавляем пулю var pulyaArr:Array = []; //массив пуль stage.addEventListener(MouseEvent.CLICK,addPulya); function addPulya(e:MouseEvent):void{ pulya.x=275; pulya.y=500; addChild(pulya); pulyaArr.push(pulya); Tweener.addTween(pulya, {x:mouseX,y:mouseY, time:1, transition:"linear"});//класс твинер для полета пули } |
|
|||||
|
Для того, чтобы пуля продолжала свое движение, нужно по двум точкам найти вектор перемещений. И просто перемещать объект вдоль этого вектора.
Есть клас Pulka (naming convention сохранил) package { import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; /** * ... * @author KumoKairo */ public class Pulka extends Sprite { private var movementVector:Point; public function Pulka(startPoint:Point, targetPoint:Point, speed:Number) { // Простая графика для отладки graphics.beginFill(0xFF0000); graphics.drawCircle(startPoint.x, startPoint.y, 15); graphics.endFill(); // Находим вектор перемещений. // Он задает направление движения movementVector = targetPoint.subtract(startPoint); // Нормируем его по скорости, его длина будет равна скорости movementVector.normalize(speed); addEventListener(Event.ADDED_TO_STAGE, onAddedToStage); } private function onAddedToStage(e:Event):void { removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage); // Таким образом в обработчике ENTER_FRAME stage не будет равно null addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function onEnterFrame(e:Event):void { this.x += movementVector.x; this.y += movementVector.y; // Здесь следует добавить проверку на выход за рамки экрана // И сообщать родителю о том, что пуля закончила свое передвижение // чтобы родитель мог удалить эту пулю из списка детей и удалить все ссылки // Не забудьте отписаться от события ENTER_FRAME } } } package { import flash.display.Sprite; import flash.events.Event; import flash.events.MouseEvent; import flash.geom.Point; /** * ... * @author KumoKairo */ public class Main extends Sprite { private var defaultStartPoint:Point; private var defaultSpeed:Number; public function Main():void { if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // Задаем значения точки отправки пули по умолчанию defaultStartPoint = new Point(275, 500); // И скорость по умолчанию defaultSpeed = 5; stage.addEventListener(MouseEvent.CLICK, onStageClick); } private function onStageClick(e:MouseEvent):void { // Как альтернатива - можно использовать e.stageX вместо mouseX var targetPoint:Point = new Point(e.stageX, e.stageY); // Здесь у вас будет массив и прочие приблуды var pulka:Pulka = new Pulka(defaultStartPoint, targetPoint, defaultSpeed); addChild(pulka); } } } |
|
|||||
|
[+4 06.05.14]
|
А не проще ли тем же ТвинМаксом это делать - зная начальную точку и конечную ( начальную даже знать не важно, это скорее важнее объекту генератору пули, в каком мсте генерится там и начальная, а клик мыши конечная, которую по твинмаксу и двигаем. ).
__________________
Марк Tween |
|
|||||
|
ТС написал что если твинером делать, то в конечной точке останавливается пуля, и это логично. Если твинером делать, то придется вычислять точку, которая находится за экраном, чтобы в случае чего пуля не останавливалась в точке, в которую нажали, а продолжала лететь дальше.
Да и потом, если делать твинером, то придется как-то вычислять время анимации, основанное на заданной скорости, чтобы у всех пуль была одинаковая скорость. А это сделать сложнее чем найти вектор перемещения и двигать пулю вдоль него. Может я конечно не знаю что-то про TweenMax, я с ним не работал Но у твинеров принцип действия в целом одинаковый должен быть, отсюда такие предположения)Тут принцип то простой, просто кода много из-за того что не в кадрах. |
|
|||||
|
Регистрация: Dec 2013
Сообщений: 8
|
классы классы, я не шарю в классах, можно без них? сколько пытался начать программировать грубо говоря дальше hello world не уходил, хотя учился на программиста, и вот решил опробовать флеш профешнл, мне понравилось.
как без классов сделать? я у меня есть пример готовый, где пуля летит но падает, тк. там еще и гравитация есть, но так и не получилось запихнуть в один слой, я делаю весь код в одном слое, и давайте не будем от том что я делаю неправильно или еще что то, можно просто переделать без классов, оч прошу |
|
|||||
|
Регистрация: Dec 2013
Сообщений: 8
|
вот пример приблизительно как мне надо, только чтобы все в одном файле было, все делал в один слой весь код даже ошибок не было, но не работает
|
|
|||||
|
Регистрация: Mar 2012
Адрес: г.Новосибирск
Сообщений: 381
|
ну вы же вот здесь пишите
а это и есть ничто иное как класс, точнее вы создаете экземпляр класса пули. а внутри класса пули вам нужно поместить 2 переменные: на сколько пикселей пуля смещается по х и по y а потом по энтерфрейму доставать пробегаться по массиву пуль, доставать из пули эти переменные и смещать пулю на них тоесть проекты надо сохранять в CS5 версию |
|
|||||
|
Регистрация: Dec 2013
Сообщений: 8
|
|
|
|||||
|
Регистрация: Dec 2013
Сообщений: 8
|
var pulya:MovieClip=new Pulka(); var pulyaArr:Array = []; //массив пуль var speed = 10; stage.addEventListener(MouseEvent.CLICK , clickListener); function clickListener(e:MouseEvent):void { pulya.x = 275; pulya.y = 500; addChild(pulya); pulyaArr.push(pulya); if (pulyaArr.length > 9) { removeChild(pulya); puh.gotoAndStop("puli"); } pulya.angle = Math.atan2(mouseX-pulya.x, mouseY-pulya.y); addEventListener(Event.ENTER_FRAME,fire) } function fire(e:Event):void { pulya.x += Math.sin( pulya.angle ) * speed; pulya.y += Math.cos( pulya.angle ) * speed; } Теперь вопрос как сделать так, чтобы пока пуля не скроется за границы, у меня окно 500х500, нельзя было выпустить следующую, ну и соответственно чтобы за границами окна пуля removeChild |
![]() |
![]() |
Часовой пояс GMT +4, время: 07:33. |
|
|
« Предыдущая тема | Следующая тема » |
|
|