![]() |
|
||||||||||
|
|||||||
|
|
« Предыдущая тема | Следующая тема » |
| Опции темы | Опции просмотра |
|
![]() |
![]() |
|
|||||
|
Регистрация: Aug 2012
Сообщений: 297
|
Здравствуйте.
Цель: Сделать так, чтобы при движение уровня влево\вправо двигался фон влево\вправо, но с меньшей скоростью, так как ширина фона в два раза меньше, чем ширина уровня. Получится, что я увижу полностью весь уровень и полностью весь фон. Ширина фона: 2000px. Ширина уровня: 4000px. Ширины сцены: 400px. Мне это сделать удалось таким путём: У этого способа есть минус: Когда начало уровня находится у левого края сцены — начало фона тоже находится у левого края сцены, но если я делаю так, чтобы правый конец конец уровня находился у правого конца сцены, то правый конец фона не находится у правого конца сцены. Ему не хватает совсем чуть-чуть. Я это исправил путём увеличения ширины фона на 200px. Теперь сам вопрос: Как можно сделать так, чтобы фон двигался влево\вправо НО без системы увеличения\уменьшения координат? То есть не прямо задавать "b.x +-= 2", а другим способом: "b.x = какой-нибудь секретный алгоритм". |
|
|||||
|
Ничего секретного.
Элементарный способ. Задаёте точку в пространстве, указывающее положение "камеры": Далее смещаете всё что вам нужно относительно этой точки: Где: level - спрайт контейнер со всей графикой уровня. background - задний фон.
__________________
Дети не должны знать о своих родителях |
|
|||||
|
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Уровень проходит путь 4000 - 400 = 3600
Бэкграунд должен пройти 2000 - 400 = 1600 Коэфициент = 16/36 = 4/9 фон.х = уровень.х * 4 / 9
__________________
Reality.getBounds(this); |
|
|||||
|
Регистрация: Aug 2012
Сообщений: 297
|
Цитата:
|
|
|||||
|
Dip52,
Точка - это и есть "камера". Да, тупо двигая камеру, весь контент будет позицианироваться относительно её позиций. Не забудьте поместить все объекты в общий контейнер. Двигать нужно контейнер.
__________________
Дети не должны знать о своих родителях |
|
|||||
|
Регистрация: Aug 2012
Сообщений: 297
|
Цитата:
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); } } } } |
|
|||||
|
Двигать нужно камеру а не мир! Камера перемещается в мире:
Затем подписываетесь на событие энтер фрейма и каждый кадр позицианируете отображение мира относительно камеры:
__________________
Дети не должны знать о своих родителях |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 1,540
|
Цитата:
|
|
|||||
|
MikroAcse,
Нет не лучше. Координаты камеры могут меняться более 1 раза за кадр. Ею могут манипулировать разные объекты кода. И как вы определите событие изменения позиций камеры? Создать событие и подписать главный визуализатор на собственную камеру? Или дёргать internal метод оповещающий об изменений позиций? Вот и усложнили в 10 раз без надобности и с нулевым, если не отрицательным приростом производительности. У камеры есть x, y. Их могут менять все кому это нужно. Перед рендером каждого кадра, визуализатор считывает её позицию и отображает текущий мир соответственно.
__________________
Дети не должны знать о своих родителях |
|
|||||
|
Регистрация: Feb 2012
Сообщений: 1,540
|
Tails, нет, я не имел ввиду моментальное изменение. Я имел ввиду метод update(), который нужно вызвать после всех манипуляций.
Хотя да, лучше будет интерфрейм, который проверяет является ли _update == true и обновляет. |
![]() |
![]() |
Часовой пояс GMT +4, время: 14:56. |
|
|
« Предыдущая тема | Следующая тема » |
|
|