Просмотр полной версии : полет пули в сторону клика
zhdanoff
13.12.2013, 13:00
Как собственно такое реализовать? Вот мой код:
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"});//класс твинер для полета пули
}
подключил класс твинер, но мне кажется можно намного проще, и при этом если через этот класс делать то пуля останавливается в месте клика, а мне нужно чтобы дальше летела и за пределами окна удалялась и еще я массив создал, только вот не догоняю как сделать так, чтобы пули кончались
KumoKairo
13.12.2013, 17:23
Для того, чтобы пуля продолжала свое движение, нужно по двум точкам найти вектор перемещений. И просто перемещать объект вдоль этого вектора.
Есть клас 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);
}
}
}
Обратите внимание на комментарии - я не описывал удаление пули с экрана и отписку от событий
А не проще ли тем же ТвинМаксом это делать - зная начальную точку и конечную ( начальную даже знать не важно, это скорее важнее объекту генератору пули, в каком мсте генерится там и начальная, а клик мыши конечная, которую по твинмаксу и двигаем. ).
KumoKairo
13.12.2013, 17:55
ТС написал что если твинером делать, то в конечной точке останавливается пуля, и это логично. Если твинером делать, то придется вычислять точку, которая находится за экраном, чтобы в случае чего пуля не останавливалась в точке, в которую нажали, а продолжала лететь дальше.
Да и потом, если делать твинером, то придется как-то вычислять время анимации, основанное на заданной скорости, чтобы у всех пуль была одинаковая скорость. А это сделать сложнее чем найти вектор перемещения и двигать пулю вдоль него.
Может я конечно не знаю что-то про TweenMax, я с ним не работал :) Но у твинеров принцип действия в целом одинаковый должен быть, отсюда такие предположения)
Тут принцип то простой, просто кода много из-за того что не в кадрах.
zhdanoff
16.12.2013, 15:05
классы классы, я не шарю в классах, можно без них? сколько пытался начать программировать грубо говоря дальше hello world не уходил, хотя учился на программиста, и вот решил опробовать флеш профешнл, мне понравилось.
как без классов сделать? я у меня есть пример готовый, где пуля летит но падает, тк. там еще и гравитация есть, но так и не получилось запихнуть в один слой, я делаю весь код в одном слое, и давайте не будем от том что я делаю неправильно или еще что то, можно просто переделать без классов, оч прошу
zhdanoff
16.12.2013, 16:20
вот пример приблизительно как мне надо, только чтобы все в одном файле было, все делал в один слой весь код даже ошибок не было, но не работает
ну вы же вот здесь пишите
var pulya:Pulka=new Pulka(); //добавляем пулю
а это и есть ничто иное как класс, точнее вы создаете экземпляр класса пули.
а внутри класса пули вам нужно поместить 2 переменные: на сколько пикселей пуля смещается по х и по y
а потом по энтерфрейму доставать пробегаться по массиву пуль, доставать из пули эти переменные и смещать пулю на них
тоесть
pulya.x+=pulya.moveX;
pulya.y+=pulya.moveY;
проекты надо сохранять в CS5 версию
zhdanoff
17.12.2013, 10:30
проекты надо сохранять в CS5 версию
а какая разница? я сохраняю .fla cs6
alexcon314
17.12.2013, 11:28
я сохраняю .fla cs6
Угу, открывайте, как хотите, уважаемые. Если у вас нет cs6 - это ваши проблемы.
zhdanoff
17.12.2013, 14:01
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;
}
Проблема решена, нашел у вас на форуме, мне на другом предлагали такие коды километровые, а вся задача в 5 строчек .
Теперь вопрос как сделать так, чтобы пока пуля не скроется за границы, у меня окно 500х500, нельзя было выпустить следующую, ну и соответственно чтобы за границами окна пуля removeChild
Akopalipsis
17.12.2013, 14:09
нельзя было выпустить следующую,
Создайте пермеменную _isShot:Boolean и вместе с созданием экземпляра класса пули, выставляйте значение в true. Получится, что если в данный момент пуля ещё летит, то создать новый экземпляр не получится. И проверяйте в EnterFrame координаты пули, если они больше сцены, то удаляйте пулю и isShot ставьте в false.
function fire(e:Event):void
{
pulya.x += Math.sin( pulya.angle ) * speed;
pulya.y += Math.cos( pulya.angle ) * speed;
if(stage && (pulya.x < 0 || pulya.x > stage.stageWidth || pulya.y < 0 || pulya.y > stage.stageHeight)){
//todo отписаться от полёта пули и удалить со сцены
}
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.