суббота, 23 августа 2014 г.

Как я обучал своих врагов.

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



Немного технических подробностей. Первым делом, для достаточно комфортного решения данной задачи мне потребовалось переделать кодовую базу приложения. Для отображения спрайтов AndEngine использует одноимённый класс Sprite который имеет координаты расположения на экране. Для работы с объектами как с физическими телами Sprite может контролироваться PhysicsHandler с помощью которого можно задавать скорость объекта, ускорение, массу, прикладывать действие сил и  обнаруживать коллизии между объектами. Изначально, для контроля движения игровых объектов, например, препятствовать кораблю игрока вылетать за пределы экрана, я встраивал свой код в метод onManedgeUpdate() в котором влиял непосредственно на координаты объекта. Первой оптимизацией стала инкапсуляция этого кода в отдельный класс, так как иначе пришлось бы дублировать его для аналогичного поведения других врагов. После еще нескольких мелких улучшений кода, я принялся расширять поведение врагов.


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

UPD: Уже третий раз пишу об этом и порядком задолбался, а виной всему отсутствие нормальной синхронизации между приложением Blogger для Android и версией на сайте!

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


Вместо телепортации, я стал разворачивать корабли за экраном и отправлять обратно в бой. Таким образом, если игрок пропустит несколько врагов за левую сторону экрана, то они иразвернутся и смогут беспрепятственно расстреливать игрока. Такое поведение добавляет немного сложности и интересности геймплея. Но, забегая вперед, скажу, что это еще не финальный вариант, и чуть позже узнаем почему!


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


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


Последнее что я сделал, это объединил все эти методы в один класс, та образом, что их стало возможным комбинировать под разные задачи.

Ну вот и все! Я закончил эту многострадальную статью!) А завтра я поделюсь с Вам отличной новостью)

Комментариев нет:

Отправить комментарий