Движение объекта в пределах более чем одного экрана
Одной из первых задач, которые должен решить начинающий программист флэш игр – это то, как заставить героя (будь то космический корабль, воин или черепашка
) двигаться по экрану не только в пределах обозначенных разрешением монитора (например 1024х768), но и за ними.
Как же это сделать?
Давайте посмотрим на проблему со стороны. У нас есть герой, у нас есть экран монитора. Если герой перемещается в какую-либо сторону он неуклонно двигается к границе экрана, рано или поздно достигнет ее и скроется за ней. Но это недопустимо.
Следовательно, герой вообще не должен перемещаться, он должен стоять на месте. В то же время весь мир во круг него должен двигаться. Таким образом будет достигнута иллюзия перемещения героя по местности, намного превышающей размеры монитора.
Давайте посмотрим более подробно, как это можно реализовать с помощью Flash.
1. Добавляем экземпляр клипа героя на сцену, размещая его посередине экрана (в библиотеке должен быть клип с именем player).
1 | _root.attachMovie ("player", "player", 1, {_x:Stage.width / 2, _y:Stage.height / 2}); |
2. Добавляем экземпляр клипа локации на сцену. Это может быть просто пустой клип, к которому потом можно будет добавлять другие клипы, которые будут создавать атмосферу игрового уровня (например, если вы делаете космический экшн, можно будет добавить звезды, астероиды, планеты и прочие элементы).
1 | _root.attachMovie (“location”, “location”, 0); |
Обратите внимание: клип игрока расположен над клипом с локацией.
Теперь, когда у нас есть оба клипа на сцене, надо заставить двигаться клип с локацией, для создания иллюзии передвижения.
3. Давайте создадим объект game, в котором будем хранить все данные об игре:
1 2 3 4 5 6 | game = {}; game.player = {}; game.location = {}; game.player.clip = _root[“player”]; game.location.clip = _root[“location”]; game.player.speed = 1; |
Теперь, мы имеем удобные ссылки, которые можем использовать для обращения к клипам практически из любого места кода. А вот собственно и сам механизм передвижения клипа локации:
1 2 3 4 5 | public function moveLocationClip ():Void { game.location.clip._x += Math.cos (game.player.clip._rotation / RAD_DEG) * game.player.speed; game.location.clip._y += Math.sin (game.player.clip._rotation / RAD_DEG) * game.player.speed; } |
где: RAD_DEG – это константа, позволяющая переводить значение выраженное в радианах в градусы (RAD_DEG = 180 / Pi);
game.player.speed – скорость движения объекта (посмотрите, ранее мы присвоили этому свойству значение 1, т.е. скорость равна 1 пиксель / кадр);
game.player.clip._rotation – угол поворота клипа игрока на сцене, он определяет в какую сторону будет двигаться локация.
Поместив данную функцию в обработчик onEnterFrame мы добьемся того, что с наступлением каждого нового кадра, локация будет перемещаться по оси x и y в соответствии с углом поворота клипа игрока и его скорости.
Можете посмотреть что получилось здесь:
backgroundmoving
Пример .fla здесь:
backgroundmoving





Комментарии