Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Координаты фона в зависимости от координат уровня (http://www.flasher.ru/forum/showthread.php?t=203014)

Dip52 26.08.2013 16:19

Координаты фона в зависимости от координат уровня
 
Здравствуйте.

Цель: Сделать так, чтобы при движение уровня влево\вправо двигался фон влево\вправо, но с меньшей скоростью, так как ширина фона в два раза меньше, чем ширина уровня. Получится, что я увижу полностью весь уровень и полностью весь фон.

Ширина фона: 2000px.
Ширина уровня: 4000px.
Ширины сцены: 400px.


Мне это сделать удалось таким путём:

Код AS3:

//l = уровень.
//b = фон.
 
l.x +-= 2;
b.x +- = 2;

У этого способа есть минус: Когда начало уровня находится у левого края сцены — начало фона тоже находится у левого края сцены, но если я делаю так, чтобы правый конец конец уровня находился у правого конца сцены, то правый конец фона не находится у правого конца сцены. Ему не хватает совсем чуть-чуть. Я это исправил путём увеличения ширины фона на 200px.

Теперь сам вопрос: Как можно сделать так, чтобы фон двигался влево\вправо НО без системы увеличения\уменьшения координат? То есть не прямо задавать "b.x +-= 2", а другим способом: "b.x = какой-нибудь секретный алгоритм".

Tails 26.08.2013 16:23

Ничего секретного.

Элементарный способ.
Задаёте точку в пространстве, указывающее положение "камеры":
Код AS3:

camera:Point = new Point(0, 0);

Далее смещаете всё что вам нужно относительно этой точки:
Код AS3:

level.x = -camera.x;
background.x = -camera.x * .2

Где:
level - спрайт контейнер со всей графикой уровня.
background - задний фон.

Wolsh 26.08.2013 16:33

Уровень проходит путь 4000 - 400 = 3600
Бэкграунд должен пройти 2000 - 400 = 1600
Коэфициент = 16/36 = 4/9
фон.х = уровень.х * 4 / 9

Dip52 26.08.2013 16:57

Цитата:

Сообщение от Tails (Сообщение 1144789)
Ничего секретного.

Элементарный способ.
Задаёте точку в пространстве, указывающее положение "камеры":
Код AS3:

camera:Point = new Point(0, 0);

Далее смещаете всё что вам нужно относительно этой точки:
Код AS3:

level.x = -camera.x;
background.x = -camera.x * .2

Где:
level - спрайт контейнер со всей графикой уровня.
background - задний фон.

Я не совсем понял. Я должен присвоить точке координаты камеры? Потом тупо двигать эту камеру?

Tails 26.08.2013 17:50

Dip52,
Точка - это и есть "камера".
Да, тупо двигая камеру, весь контент будет позицианироваться относительно её позиций. Не забудьте поместить все объекты в общий контейнер. Двигать нужно контейнер.

Dip52 29.08.2013 11:11

Вложений: 1
Цитата:

Сообщение от Tails (Сообщение 1144801)
Dip52,
Точка - это и есть "камера".
Да, тупо двигая камеру, весь контент будет позицианироваться относительно её позиций. Не забудьте поместить все объекты в общий контейнер. Двигать нужно контейнер.

Движение фона.swf   (1.4 Кб)


Код AS3:

package
{
        import flash.events.KeyboardEvent;
        import flash.ui.Keyboard;
        import flash.display.MovieClip;
        import flash.ui.Keyboard;
        import flash.geom.Point;
        public class Moved extends MovieClip
        {
                public function Moved()
                {
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDown);
                }
                private function sc(speed:Number):void
                {
                        mainContainer.x -= speed;
                        var camera:Point = new Point(mainContainer.x,mainContainer.y);
                        mainContainer.l.x = -camera.x
                        mainContainer.b.x = -camera.x * .2
                }
                private function keyDown(event:KeyboardEvent):void
                {
                        var k = event.keyCode;
                        if(k == Keyboard.LEFT)
                        {
                                sc(-1);
                        }
                        if(k == Keyboard.RIGHT)
                        {
                                sc(1);
                        }
                }
        }
}

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

Tails 29.08.2013 11:56

Двигать нужно камеру а не мир! Камера перемещается в мире:
Код AS3:

camera.x += 5, camera.x -= 5;

Затем подписываетесь на событие энтер фрейма и каждый кадр позицианируете отображение мира относительно камеры:
Код AS3:

mainContainer.x = -camera.x;
background.x = -camera.x * 0.5;


MikroAcse 29.08.2013 13:50

Цитата:

атем подписываетесь на событие энтер фрейма и каждый кадр позицианируете отображение мира относительно камеры:
Лучше все таки по изменении позиции камеры.

Tails 29.08.2013 14:10

MikroAcse,
Нет не лучше. Координаты камеры могут меняться более 1 раза за кадр. Ею могут манипулировать разные объекты кода. И как вы определите событие изменения позиций камеры? Создать событие и подписать главный визуализатор на собственную камеру? Или дёргать internal метод оповещающий об изменений позиций? Вот и усложнили в 10 раз без надобности и с нулевым, если не отрицательным приростом производительности.

У камеры есть x, y. Их могут менять все кому это нужно. Перед рендером каждого кадра, визуализатор считывает её позицию и отображает текущий мир соответственно.

MikroAcse 30.08.2013 00:36

Tails, нет, я не имел ввиду моментальное изменение. Я имел ввиду метод update(), который нужно вызвать после всех манипуляций.
Хотя да, лучше будет интерфрейм, который проверяет является ли _update == true и обновляет.


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

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