Главная » Статьи » Примеры

Поиск пути

Поиск пути

Вам надоело делать платформеры и аркады и захотелось сделать игру, над которой хочется поломать голову. Как на счет пошаговой стратегии? Великолепно! Вот только играть придется с самим собой.  Почему?  Ну  представьте - захотели вы заставить вашего противника перемещаться по клеткам, а как это сделать? Как объяснить ему где стены, а где можно пройти? Stencel по умолчанию таких поведений не предлагает. Но не надо отчаиваться, ведь в этот конструктор встроен Actionscript!
Не будем сходу ломать голову над сложными стратегиями поведения противника, начнем с простого - с волнового алгоритма поиска пути. Принцип работы этого алгоритма очень прост - от старта во все направления распространяется волна, причем каждая пройденная волной клетка помечается как «пройденная». Волна, в свою очередь, не может проходить через клетки, помеченные как «пройденные» или «непроходимые». Волна движется, пока не достигнет точки финиша или пока не останется непройденных клеток. Если волна прошла все доступные клетки, но так и не достигла клетки финиша, значит, путь от старта до финиша проложить невозможно. Если и это описание показалось сложным, то забежим сразу в конец и взглянем на то, что у нас получилось.

(Если нажать пробел, то можно увидеть чем заполнен наш массив)


Я решил пускать волну не от старта, а от финиша, на результате это никак не сказывается. Каждая следующая клетка от финиша получает число на единицу больше. Когда все поле заполняется нам остается лишь проверять по одной клетке с каждой из четырех сторон от нашего шарика и передвигать его в клетку с меньшим числом.
Обьясню почему пришлось прибегнуть к скриптам вместо блоков. К сожалению я не нашел ни одного блока, который бы выдавал мне информацию о нахождении тайлов на сцене (может быть я просто плохо искал). Вторая проблема - нету блоков с циклом for, хотя это и можно обойти, но при этом простой код превращается в цветное нагромождение. Скажу честно - программист я тот еще, но и Stencyl используется не для серьезных разроботок. Для меня главное что код работает. Все это вы можете посмотреть в исходнике, я же остановлюсь на нескольких моментах подробнее.
var i,ii:int;
for (ii = 0; ii < 20; ii++)
{    
    for (i = 0; i < 12; i++)
    {
    //заносим все тайлы в массив и заменяем их на -1
        _arrayTile[ii*20+i]=getTileAt(i,ii,1);
        if (_arrayTile[ii*20+i]!=null)   
        {
        _arrayTile[ii*20+i]=-1
        }
    else
        {
        _arrayTile[ii*20+i]=0
        }       
    }       
}

Для того, что бы получить доступ к созданному нами атрибуту из скрипта нужно лишь поставить перед ним знак подчеркивания  -  _arrayTile это созданный мной атрибут  arrayTile. getTileAt это функция, которая возвращает тайл в нужной ячейке на нужном слое. Я просто воспользовался тем, что в случае отсутствия тайла она возвращает null, соответственно всем содержащим тайлы ячейки я тут же присвоил значение -1. Так же я столкнулся с еще одной проблемой - я не смог заполнить двухмерный массив внутри цикла for. То есть игра собиралась без ошибок, но почему то работала не правильно. При этом в случае присвоения значений массиву вне цикла все работало. Так что я вышел из этой проблемы нехитрым способом - поместив двухмерный массив в одномерный, равный количеству всех ячеек матрицы.
В любом случае вы всегда можете доработать все это сами.

Категория: Примеры | Добавил: corax (25.12.2012)
Просмотров: 1802 | Теги: поиск пути, урок stencyl | Рейтинг: 5.0/1
Всего комментариев: 0
Имя *:
Email *:
Код *: