pavel gorlov
10.01.2008, 04:18
Добрый. Я очень давно не работал с флешем и
для меня было удивительно узнать о нововведениях в AS2 и AS3.
Разрабатываю движок-навигатор для карты своего города,
что-то среднее между flashearth.com и wikimapia.org.
Для начала опишу то, что я хочу от неё:
================================================
1. Тайлинг
2. Вращение карты вокруг точки (курсор или что-то ещё)
3. Зум относительно точки под курсором +/- (как в графических редакторах)
4. Зум выделеной области
5. Таскание Мышкой, даблклики и т.п.
6. Полёт из А в Б по прямой и по пути.
7. Поинты-отметки с "человеческим" поведением
8. Поиск маршрутов транспорта и поинтов-отметок.
================================================
Цели которые я поставил перед собой самые обычные и ничем не отличаются от аналогичных проектов. Моя наработка лежит тут (http://el-hosto.ru/map/).
Теперь я хочу спросить у вас, уважаемые флешеры, как на ваш взгляд (рационально или нет) я реализую свои задумки. Попунктно:
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
}
Вопрос о removeMovieClip: В релизе мои тайлы будут 1000*1000 пикселей. removeMovieClip() - удаляет из памяти jpg-data или нет? Если нет, то чем можно уничтожить объект с высвобождением памяти?
Вопрос о onMouseMove: При перемещение мышкой событие вызывается у всех тайлов! Вне зависимости расположен курсор над ним или нет. Почему так происходит? Какое событие необходимо использовать в случае если карта _MAP_ перемещается кем-то из вне, ведь тогда у тайлов не будет вызываться метод onMouseMove. Поидее нужен метод что то типа onEnterFrame, который бы постоянно проверял hitTest, но такой способ съедает много процессорного времени и тормозит.
Так же я понимаю что это не дело, сразу генерировать тайлы, тогда получается это псевдо тайлы. Но я так и не нашел внятной информации по тайлингу, кроме намёков на использование xml которое самособой разумеется.
2. Вращение карты вокруг точки (курсор или что-то ещё)
Тут у меня баян. В моём примере вращается _MAP_ и квадрат, _MAP_ вокруг своего верхнего края, квадрат — относительно собственного центра.
Вопрос о _rotation: каким образом можно устанавливать точку вращения объекту? есть идеи как это реализовано на flashearth.com?
3. Зум относительно точки под курсором +/- (как в графических редакторах)
Когда то я уже задавал этот вопрос (http://www.flasher.ru/forum/showpost.php?p=604378&postcount=1) на флешере и получил ответ (http://www.flasher.ru/forum/showpost.php?p=604408&postcount=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);
}
}
В моём случае после изменения расчет координат смещения происходит из уже изменненных _xscale _yscale, но одновременный твиниг не даёт нужного результата, а твиниг позиции по завершении изменения масштаба вызывает "дёрганье".
4. Зум выделеной области
Помню видел пример но так и неразобрался в нём, на данный момент
понимаю зум выделенной облати в двух действиях:
- переместить центр выделенной области в центр экрана;
- расчитать правильный _xscale, _yscale, для правильной трасформации;
При одновременном твиниге должно получиться достаточно гламурно ))
C перемещением в центр разобрался быстро, но расчёт коэф. scale непоборол до сих пор...
Может у кого есть пример такого?
5. Таскание Мышкой, даблклики и т.п.
Всё ок, кроме отсутствия "адекватного" алгоритма предотвращения выезжания за край экрана.
6. Полёт из А в Б по прямой и по пути.
Если по прямой, просто из А в Б, то тут нету никаких неясностей. А что если я хочу использовать путь, пусть это будет дорога, маршрут метро или просто линии. Может кто сталкивался с такой задачей? P.S. я имею виду тоже самое, как во флеше можно пустить объект во пути. Но как это сделать програмно незнаю...
7. Поинты-отметки с "человеческим" поведением.
Буду подгружать куски xml, парсить их и расставлять помера домов, единственной незнаю как поступить когда будет изменяться scale карты, как пересчитывать координаты. Есть примеры?
P.S. Заранее благодарю тех, у кого хватило терпения дочитать этот пост до конца :victory:
для меня было удивительно узнать о нововведениях в AS2 и AS3.
Разрабатываю движок-навигатор для карты своего города,
что-то среднее между flashearth.com и wikimapia.org.
Для начала опишу то, что я хочу от неё:
================================================
1. Тайлинг
2. Вращение карты вокруг точки (курсор или что-то ещё)
3. Зум относительно точки под курсором +/- (как в графических редакторах)
4. Зум выделеной области
5. Таскание Мышкой, даблклики и т.п.
6. Полёт из А в Б по прямой и по пути.
7. Поинты-отметки с "человеческим" поведением
8. Поиск маршрутов транспорта и поинтов-отметок.
================================================
Цели которые я поставил перед собой самые обычные и ничем не отличаются от аналогичных проектов. Моя наработка лежит тут (http://el-hosto.ru/map/).
Теперь я хочу спросить у вас, уважаемые флешеры, как на ваш взгляд (рационально или нет) я реализую свои задумки. Попунктно:
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
}
Вопрос о removeMovieClip: В релизе мои тайлы будут 1000*1000 пикселей. removeMovieClip() - удаляет из памяти jpg-data или нет? Если нет, то чем можно уничтожить объект с высвобождением памяти?
Вопрос о onMouseMove: При перемещение мышкой событие вызывается у всех тайлов! Вне зависимости расположен курсор над ним или нет. Почему так происходит? Какое событие необходимо использовать в случае если карта _MAP_ перемещается кем-то из вне, ведь тогда у тайлов не будет вызываться метод onMouseMove. Поидее нужен метод что то типа onEnterFrame, который бы постоянно проверял hitTest, но такой способ съедает много процессорного времени и тормозит.
Так же я понимаю что это не дело, сразу генерировать тайлы, тогда получается это псевдо тайлы. Но я так и не нашел внятной информации по тайлингу, кроме намёков на использование xml которое самособой разумеется.
2. Вращение карты вокруг точки (курсор или что-то ещё)
Тут у меня баян. В моём примере вращается _MAP_ и квадрат, _MAP_ вокруг своего верхнего края, квадрат — относительно собственного центра.
Вопрос о _rotation: каким образом можно устанавливать точку вращения объекту? есть идеи как это реализовано на flashearth.com?
3. Зум относительно точки под курсором +/- (как в графических редакторах)
Когда то я уже задавал этот вопрос (http://www.flasher.ru/forum/showpost.php?p=604378&postcount=1) на флешере и получил ответ (http://www.flasher.ru/forum/showpost.php?p=604408&postcount=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);
}
}
В моём случае после изменения расчет координат смещения происходит из уже изменненных _xscale _yscale, но одновременный твиниг не даёт нужного результата, а твиниг позиции по завершении изменения масштаба вызывает "дёрганье".
4. Зум выделеной области
Помню видел пример но так и неразобрался в нём, на данный момент
понимаю зум выделенной облати в двух действиях:
- переместить центр выделенной области в центр экрана;
- расчитать правильный _xscale, _yscale, для правильной трасформации;
При одновременном твиниге должно получиться достаточно гламурно ))
C перемещением в центр разобрался быстро, но расчёт коэф. scale непоборол до сих пор...
Может у кого есть пример такого?
5. Таскание Мышкой, даблклики и т.п.
Всё ок, кроме отсутствия "адекватного" алгоритма предотвращения выезжания за край экрана.
6. Полёт из А в Б по прямой и по пути.
Если по прямой, просто из А в Б, то тут нету никаких неясностей. А что если я хочу использовать путь, пусть это будет дорога, маршрут метро или просто линии. Может кто сталкивался с такой задачей? P.S. я имею виду тоже самое, как во флеше можно пустить объект во пути. Но как это сделать програмно незнаю...
7. Поинты-отметки с "человеческим" поведением.
Буду подгружать куски xml, парсить их и расставлять помера домов, единственной незнаю как поступить когда будет изменяться scale карты, как пересчитывать координаты. Есть примеры?
P.S. Заранее благодарю тех, у кого хватило терпения дочитать этот пост до конца :victory: