Home > Создание Flash игр > Движение объекта в пределах более чем одного экрана

Движение объекта в пределах более чем одного экрана

Февраль 3rd, 2009

Одной из первых задач, которые должен решить начинающий программист флэш игр – это то, как заставить героя (будь то космический корабль, воин или черепашка ;) ) двигаться по экрану не только в пределах обозначенных разрешением монитора (например 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 в соответствии с углом поворота клипа игрока и его скорости.

Можете посмотреть что получилось здесь:

The Flash plugin is required to view this object.


backgroundmoving
Пример .fla здесь:
backgroundmoving

Создание Flash игр ,

  1. No comments yet.
  1. No trackbacks yet.