![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Jan 2007
Сообщений: 13
|
Добрый. Я очень давно не работал с флешем и
для меня было удивительно узнать о нововведениях в AS2 и AS3. Разрабатываю движок-навигатор для карты своего города, что-то среднее между flashearth.com и wikimapia.org. Для начала опишу то, что я хочу от неё: ================================================ 1. Тайлинг 2. Вращение карты вокруг точки (курсор или что-то ещё) 3. Зум относительно точки под курсором +/- (как в графических редакторах) 4. Зум выделеной области 5. Таскание Мышкой, даблклики и т.п. 6. Полёт из А в Б по прямой и по пути. 7. Поинты-отметки с "человеческим" поведением 8. Поиск маршрутов транспорта и поинтов-отметок. ================================================ Цели которые я поставил перед собой самые обычные и ничем не отличаются от аналогичных проектов. Моя наработка лежит тут. Теперь я хочу спросить у вас, уважаемые флешеры, как на ваш взгляд (рационально или нет) я реализую свои задумки. Попунктно: 1. Тайлинг Описал класс _MAP_, который умеет создавать себя на главной сцене, отслеживать собственное перемещение, имеет метод move(x,y) который Tween'ами сдвигает this в нужную точку. При инициализации мувика _MAP_ внурти него по циклу создаются копии класса _TILE_ с присвоение им idx и idy. _TILE_ умеет следить за совим перемещением, и в зависимости от попадения в hit-область заданного мной объекта (в будущем - экрана) вызывает в себе метод build() который загружает в себя jpg (определяя его по idx и idy) или проверяет его на существование, во избежании перезагрузки тайла или вызывает free() выгружая картинку: _TILE_.prototype.build = function() {
this.createEmptyMovieClip("m", 0);
this["m"].loadMovie(String(this.idy)+String(this.idx)+".jpg");
this.exist = true; //йа существую
}
clear
_TILE_.prototype.free = function() {
this["m"].removeMovieClip()
this.exist = false; //йа умир
}
_TILE_.prototype.onMouseMove = function(){
var rx = this._parent._x + this._x; //йа по Х
var ry = this._parent._y + this._y; //йа по Y
this.d.text = this.idy+":"+this.idx;
if(this.hitTest(_rt)){ if(!this.exist) this.build(); } //Подгружаем jpg в тайл
else { this.free(); } //Выгружаем jpg
}
Вопрос о onMouseMove: При перемещение мышкой событие вызывается у всех тайлов! Вне зависимости расположен курсор над ним или нет. Почему так происходит? Какое событие необходимо использовать в случае если карта _MAP_ перемещается кем-то из вне, ведь тогда у тайлов не будет вызываться метод onMouseMove. Поидее нужен метод что то типа onEnterFrame, который бы постоянно проверял hitTest, но такой способ съедает много процессорного времени и тормозит. Так же я понимаю что это не дело, сразу генерировать тайлы, тогда получается это псевдо тайлы. Но я так и не нашел внятной информации по тайлингу, кроме намёков на использование xml которое самособой разумеется. 2. Вращение карты вокруг точки (курсор или что-то ещё) Тут у меня баян. В моём примере вращается _MAP_ и квадрат, _MAP_ вокруг своего верхнего края, квадрат — относительно собственного центра. Вопрос о _rotation: каким образом можно устанавливать точку вращения объекту? есть идеи как это реализовано на flashearth.com? 3. Зум относительно точки под курсором +/- (как в графических редакторах) Когда то я уже задавал этот вопрос на флешере и получил ответ. Потом поправил код под методы класса и всё было ок, но не в текущем проекте. Покрутите колёсико, увидете почему... _MAP_.prototype.onMouseWheel = function(d){
var s=this._xscale;
var mouseX=_xmouse;
var mouseY=_ymouse
var dx=(mouseX-this._x)/s;
var dy=(mouseY-this._y)/s;
var sx:Tween = new Tween(this, "_xscale", func, s, s+d, t,true);
var sy:Tween = new Tween(this, "_yscale", func, s, s+d, t,true);
sx.onMotionFinished = function() {
new Tween(this, "_x", func, this._x, mouseX-dx*_MAP_._xscale, t,true);
}
sy.onMotionFinished = function() {
new Tween(this, "_y", func, this._y, mouseY-dy*_MAP_._yscale, t,true);
}
}
4. Зум выделеной области Помню видел пример но так и неразобрался в нём, на данный момент понимаю зум выделенной облати в двух действиях: - переместить центр выделенной области в центр экрана; - расчитать правильный _xscale, _yscale, для правильной трасформации; При одновременном твиниге должно получиться достаточно гламурно )) C перемещением в центр разобрался быстро, но расчёт коэф. scale непоборол до сих пор... Может у кого есть пример такого? 5. Таскание Мышкой, даблклики и т.п. Всё ок, кроме отсутствия "адекватного" алгоритма предотвращения выезжания за край экрана. 6. Полёт из А в Б по прямой и по пути. Если по прямой, просто из А в Б, то тут нету никаких неясностей. А что если я хочу использовать путь, пусть это будет дорога, маршрут метро или просто линии. Может кто сталкивался с такой задачей? P.S. я имею виду тоже самое, как во флеше можно пустить объект во пути. Но как это сделать програмно незнаю... 7. Поинты-отметки с "человеческим" поведением. Буду подгружать куски xml, парсить их и расставлять помера домов, единственной незнаю как поступить когда будет изменяться scale карты, как пересчитывать координаты. Есть примеры? P.S. Заранее благодарю тех, у кого хватило терпения дочитать этот пост до конца ![]() |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
Для начала я бы вам порекомендовал писать хотя бы на AS2, а не прототипном AS1.
|
|
|||||
|
Modus ponens
|
Ну, поскольку официально раздел и по АС1 тоже... %)
(а кто-то тут еще и пинал себя пяткой в грудь, утверждая что АС2 - это недоязык, а АС1 - руль )Вобщем, ситуация следующая, чтобы иметь возможность явно высвободить память занятую картинкой - нужно пользоваться АС2 и компайлить под 8-й плеер минимум. Смотрим свойство BitmapData.dispose(); OnMouseMove - вызывается у всех клипов (т.как вызывается не зависимо от их положения и положения курсора относительно них). onRollOver - сигналит о вхождении курсора в зону занимаемую клипом, onRollOut - наоборот. Поменять точку регистрации невозможно - ток немного математики и пересчитывать координаты. Програмно задать траекторию для перемещения так, (как это делается в IDE) так же нельзя. Но, если сможете програмно нарисовать траекторию по опорным точкам, то проблем с твинами от одной точки до другой возникнуть не должно. Метки нет смысла перемещать, лучше просто скейлить, но так, чтобы они всегда были на одном месте. Еще пара замечаний: создавать больше 1 твина для анимации - лишнее. Парсить ХМЛ не надо, он и сам по-себе хорошо структурирован. ЗЫ. И все таки лучше переходить на АС3, если все равно такая куча проблем =)
__________________
Hell is the possibility of sanity |
|
|||||
|
Регистрация: Jan 2007
Сообщений: 13
|
wvxvw спасибо за ответ!
Цитата:
![]() |
|
|||||
|
Et cetera
Регистрация: Sep 2002
Сообщений: 30,787
|
pavel gorlov, даже на этом форуме есть информация по AS3.
|
![]() |
![]() |
Часовой пояс GMT +4, время: 12:24. |
|
|
« Предыдущая тема | Следующая тема » |
|
|