Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как отследить что машинка проехала 1,2,3 круга ? (http://www.flasher.ru/forum/showthread.php?t=155877)

djyamato 11.05.2011 22:43

Как отследить что машинка проехала 1,2,3 круга ?
 
Здравствуйте
есть у меня тайловая карта (двухмерный массив)

есть машинка, которая ездеет по ней. Проехать, естественно, может только по тем тайлам, у которых значение=1
Так вот, я не могу придумать как мне отследить событие проезда через финишный тайл (к примеру)
вот флэшка

P.S. машинка это MVC (взял урок из книжки OReilly ActionScript.3.0 Design Patterns, начиная со страницы 457) и немного переделал
Карта это Vew

-De- 11.05.2011 22:59

Отчертите стартовую (она же финишная) прямую (отрезок). Считайте сколько раз и в каком направлении она пересечена.

djyamato 11.05.2011 23:01

hitTest - ом ?

-De- 11.05.2011 23:02

Геометрией.

djyamato 11.05.2011 23:11

понятно, спасибо
и еще тогда у меня вопрос, а кому лучше следить за пересечением этого отрезка, машинке или карте ?

Dukobpa3 11.05.2011 23:29

Впринципе пофигу только если трасса закольцована то чекпоинт должен быть не один а несколько, и отслеживать порядок пересечения оных, а то если только финиш/старт - то можно будет обмануть пару раз не сходя со старта туда-сюда проехав.

-De- 11.05.2011 23:38

Явно логичнее карте. Кто у вас решает, какое следующее положение у машинки?

djyamato 11.05.2011 23:43

модель (Model) машинки решает куда она едет и не встречает ли препятствия

Добавлено через 1 минуту
Цитата:

Сообщение от Dukobpa3 (Сообщение 995507)
Впринципе пофигу только если трасса закольцована то чекпоинт должен быть не один а несколько, и отслеживать порядок пересечения оных, а то если только финиш/старт - то можно будет обмануть пару раз не сходя со старта туда-сюда проехав.

И правда, чуть назад со старта сдал, и вперед сразу - вот и пересечение

Dukobpa3 11.05.2011 23:54

Цитата:

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

-De- 12.05.2011 00:10

Цитата:

Сообщение от djyamato (Сообщение 995511)
модель (Model) машинки решает куда она едет и не встречает ли препятствия

Ну тогда в машинке) Смущает, что по сути карта нужна машинке и тогда уже в ней и хранить её, чо инкапсуляцию лишний раз трогать) По-моему врядли на бока с этим нарвётесь, хотя если нарвётесь, то будет очень показательный пример, на какие, напишите %)
Цитата:

Сообщение от djyamato (Сообщение 995511)
И правда, чуть назад со старта сдал, и вперед сразу - вот и пересечение

Два пересечения. Один раз - назад, -1 счётчик пройденных кругов, второй раз вперёд - +1, итого 0. Если туго с геометрией, то можно правда сделать три области/чекпоинта, чтоб обязательно сперва по одной проехался (хоть хиттестом проверять), потом по второй, потом по третьей и если потом по первой, то круг. Мне было бы лень области чекпоинта наносить)

Dukobpa3 12.05.2011 00:25

Цитата:

Смущает, что по сути карта нужна машинке.
Не обязательно.

например структура:
Главный контроллер - координирует всю движуху
- главная вью (карта) - перемещается по экрану в зависимости от положения машинки (она ж скорее всего не влезет в экран)
- главная модель (карта) - содержит в себе данные для отрисовки вью крты - текущие видимые тайлы к примеру, объекты на карте, прочая лабуда.
- контроллер машинки - координирует свою маленькую движуху, общается с контроллером-папой
-- модель машинки - скорость, параметры типа сколько топлива осталось и прочая
-- вью машинки - ну собственно вью, целая, разбитая, пыль из-под колес если быстро едет и в таком духе. Слушает события пользователя

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

-De- 12.05.2011 00:38

Тут какие будут новые координаты решает главный контроллер, а не машинка. Потому что когда он определил, что машинке можно ехать, он проверил, что всё ок с её новыми координатами, почему бы их и не определить ему тогда сразу (когда говорит "можно, рулите"), чего два раза считать.

djyamato 12.05.2011 00:39

да, нужно в контроллер машинки переносить логику принятия решений относительно действий после пересечения со стенами, пересечения финиша итд
А пересечение финиша я вот как могу сделать
В карте есть тайлы, которые используются для финиша
Код AS3:

public function get mapData():Object
                {
                        var retObject:Object=new Object();
                        retObject.tiles=mapArray;
                        retObject.tileBounds=new Rectangle(0,0,80,80);
                        retObject.param_0_Speed=0;
                        retObject.param_1_Speed=1;
                        retObject.param_2_Speed=0.95;
                        retObject.finishTiles=[{c:3,r:2},{c:3,r:3}];
                        return retObject;
                }

в машинку (MODEL) подается прямоугольник, высчитанный из данных финиша у карты
модель машинки спрашивает у вью машинки прямоугольник машинки я я получу пересечение или нет этих 2х прямоугольников

-De-, или Вы имели ввиду не такую геометрию ?

Dukobpa3 12.05.2011 00:42

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

-De- 12.05.2011 00:50

Я имел в виду два отрезка - финишная черта и соединяющий предыдущее и следующее положение машинки. Вот смотрим, на их пересечение и в каком направлении оно, если есть.
http://users.livejournal.com/_winnie/152327.html
- вот как такое делать. Направление пересечения, если я ничего не напутал (а тут могу) будет сидеть в знаке seg1_line2_start (а также в seg1_line2_end, seg2_line1_start и seg2_line1_end, просто надо понять, если оно больше 0, то это вперёд или назад %)

Добавлено через 24 минуты
Dukobpa3, для уменьшения связанности заставлять контроллер машинки пересчитывать? А если оно таки сколлайдилось?
Кстати, похоже, что таки если машинок больше 1, то таки на машинке это дело не разрулить нормально, нужен кто-то сверху, карта или контроллер её/главный. Кстати, это вообще сверхдурная задача, рекомендуется физ. двиг взять.
djyamato, у вас в коде магические числа. Это может даже похуже нарушения инкапсуляции. Потом не найдёте, что за что отвечает и что данное число обозначает. Простой тест на то, что число не магическое - если чтоб его поменять надо 'переписать всё нафик' или жить в другой вселенной, то число - не магическое. Если это какие-то размеры или скорость - вбить их в константы/переменные, не использовать напрямую.

Dukobpa3 12.05.2011 02:12

Ну так реализаций море может быть.

К тому же если по правильному (а карта как говорилось выше - тайловая) то есть проходимые тайлы, есть непроходимые.

То можно что-то придумать чтоб в модели машинки хранилось девять тайлов - сама машинка и вокруг нее.
Тогда и главный контроллер разгрузить можно.

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

Там по сути не просчет будет а тупо сравнение - есть координаты тайла, поглядеть на проходимость/непроходимость, всё.

Добавлено через 1 минуту
К тому же ты сам написал что нужен кто-то "выше" вот этим "выше" и есть главный контроллер.

-De- 12.05.2011 03:15

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

Хранить (и обновлять постоянно, вот не было чем заняться) тайлы вокруг - не уменьшает связность! Машинка-шпион сможет обьехать всё поле и узнать инфу о всех актуальных тайлах! Не хотите подумать, как запретить ей это? =)) Может, пересоздавать её почаще, чтоб лишнего не знала - это уменьшит связность =))

Если есть кто-то выше, то он и определяет положение машинки. Сама она ничего потом не пересчитывает, вот о чём этот дурной спор %)

Dukobpa3 12.05.2011 03:37

как вариант можно машинку вообще без контроллера оставить;) Сделать ее сугубо суб-вью))) Тогда и спор наш иссякнет. С одним контроллером и думать нечего кто чего считать будет ;)

Опять же повторюсь, вариантов реализаций может быть море. А спор действительно ни о чем.

djyamato 12.05.2011 13:25

это в модели машинки, впоследствии, это перенеслось бы во вшнешний хмл как настройка машинки
Код AS3:

protected var minSpeed:Number=0;
                protected var maxSpeed:Number=4;
                protected var carInitMaxSpeed:Number=4;
 
                protected var maxRotation:int=360;
 
                protected var nRotation:Number;
                protected var rotationAtSpeedKoeff:Number=1;
                protected var ptLoc:Point;
                protected var carColor:uint;
 
                private var speedObject:Object=new Object();
                private var angleObject:Object=new Object();
 
 
                private static const speedUpValue:Number=0.1;
                private static const speedDownValue:Number=-0.05;
 
                private static const steerLeftAngle:Number=-0.075;
                private static const steerRightAngle:Number=0.075;
 
                private var speedDownTweenDuration:Number=4;
                private var angleToZeroTweenDuration:Number=1;

да нет вроде никаких магических чисел

По поводу физ движка, это верно, я так и сделаю, хотелось хоть немного самому пошшупать.
А для этой задачи какой лучше взять двиг ? box2D? Или что-нибудь другое ?


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

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