Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Алгоритм миникарты (http://www.flasher.ru/forum/showthread.php?t=211500)

Godwarlock 12.09.2015 21:16

Алгоритм миникарты
 
Всем привет. Возник вопрос по созданию мини карты, точнее каков должен быть её алгоритм? Как синхронизировать скорость передвижения по глобальной карте и отобразить пройденное(уменьшенное расстояние) на мини карте?

ZackMercury 12.09.2015 22:09

Вам MVC ни о чём не говорит?

Model. Данные об объектах на карте, игроке на карте и т.д.
View1. Сама карта.
View2. Мини-карта. Можно не показывать объекты на карте, можно не показывать игрока на карте, можно сделать это настраиваемым по клику по вьюшке.

Godwarlock 12.09.2015 22:25

Говорит, но причем здесь это?

ZackMercury 12.09.2015 22:30

Сама суть паттерна в том, что есть модель, а есть вьюшки, и их может быть неограниченное количество.
Модель представляет из себя базу данных, а вьюшки отображают данные визуально, и могут использовать при этом разные меры расстояния и спрайты.

Godwarlock 12.09.2015 23:25

Я так понимаю, нужно сгенерировать вторую карту, убрать к примеру в ней объекты, но оставить игрока, уменьшить до нужного размера контейнер этой самой карты. Но вопрос в том, что движение персонажа к примеру будет 5 пикселей за шаг и если на мини карте будет шаг персонажа в 5 пикселей её перекинет за маску.

neonoviiwolf 12.09.2015 23:40

найди соотношение карты и мини карты и на мини карте тоже двигай мини карту, а не персонажа, главное найди соотношение и всё будет норм

ZackMercury 13.09.2015 00:31

Godwarlock, если вас манит сделать именно так, то пожалуйста.
scaleX/scaleY, базисные оси тоже скейлятся, так что не переживайте за 5 пикселей.

Другой вопрос того, что это некрасиво, но если срочно надо, то и так сойдёт.
А если есть время разобраться - попробуйте паттерны с моделью и вьюшкой.

Это отделение логики с данными от вида.
Есть модель, которая хранит положения игроков и объектов и размеры карты.
Есть основной вид-карта, есть миникарта-дополнительный вид.
Обе берут данные об объектах из модели, и подписаны на события её изменения.
Модель при этом не хранит никакого экранного контента, чисто данные местоположения, к примеру, и названия айтемов.
Основной вид слушает события ввода и оповещает контроллер, а тот в свою очередь дёргает модель, а та диспатчит об изменении, и оба вида получают событие, что модель изменилась и обновляются.

Виды не должны ничего знать друг о друге.

Godwarlock 13.09.2015 01:28

А где тогда логика проводится?

ZackMercury 13.09.2015 09:59

Обычно в контроллере, но есть и другие подвиды шаблона, где логика находится в модели.
http://cs624828.vk.me/v624828630/4464c/CBhX54Udbqs.jpg

caseyryan 13.09.2015 10:36

Что-то я не понял каким боком сюда MVC относится вообще)
Ну, разве что передавать данные о положении карты и персонажа модели, а модель будет рассылать всем вьюшкам.
Но как я понял, вопрос то не в этом, а в том как вообще сделать мини карту, и чтобы персонаж на ней так же пропорционально располагался как и на большой.

Код для рассчета расстояний будет примерно таким. Допустим масштаб 1:20
Берем большую карту, и создаем на ее основе маленькую превьюшку

Код AS3:

// перед созданием превью надо скрыть всех персонажей и прочие игровые объекты с карты, допустим сделать сеттер hideGameObjects
map.hideGameObjects = true;
var scale:Number= 20;
var previewWidth:int = map.width / scale;
var previewHeight:int = map.height / scale;
var preview:Bitmap = new Bitmap(new BitmapData(previewWidth, previewHeight, true, 0x000000));
var mapX:int = map.x;
var mapY:int = map.y;
var mapScale:Number = map.scaleX;
map.scaleX /= scale;
map.scaleY = map.scaleX;
map.x = map.y = 0;
preview.bitmapData.draw(map, map.transform.matrix);
// возвращаем как было
map.x = mapX;
map.y = mapY;
map.scaleX = map.scaleY = mapScale;
// дальше ложим эту привьюшку в свой контейнер
previewContainer.addChild(preview);
// ну и, собственно рассчитываем положение персонажа в ней, тоже деля его на глобальный масштаб
// допустим данные о положении карты и персонажа присылает в это мини превью модель
preview.x = mapPositionX / scale;
preview.y = mapPositionY / scale;
// ну и так же для персонажа



Часовой пояс GMT +4, время: 13:10.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.