Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 26.08.2013, 16:19
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 1  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
По умолчанию Координаты фона в зависимости от координат уровня

Здравствуйте.

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

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


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

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

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

Старый 26.08.2013, 16:23
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 2  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Ничего секретного.

Элементарный способ.
Задаёте точку в пространстве, указывающее положение "камеры":
Код AS3:
camera:Point = new Point(0, 0);
Далее смещаете всё что вам нужно относительно этой точки:
Код AS3:
level.x = -camera.x;
background.x = -camera.x * .2
Где:
level - спрайт контейнер со всей графикой уровня.
background - задний фон.
__________________
Дети не должны знать о своих родителях

Старый 26.08.2013, 16:33
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 3  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Уровень проходит путь 4000 - 400 = 3600
Бэкграунд должен пройти 2000 - 400 = 1600
Коэфициент = 16/36 = 4/9
фон.х = уровень.х * 4 / 9
__________________
Reality.getBounds(this);

Старый 26.08.2013, 16:57
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 4  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
Цитата:
Сообщение от Tails Посмотреть сообщение
Ничего секретного.

Элементарный способ.
Задаёте точку в пространстве, указывающее положение "камеры":
Код AS3:
camera:Point = new Point(0, 0);
Далее смещаете всё что вам нужно относительно этой точки:
Код AS3:
level.x = -camera.x;
background.x = -camera.x * .2
Где:
level - спрайт контейнер со всей графикой уровня.
background - задний фон.
Я не совсем понял. Я должен присвоить точке координаты камеры? Потом тупо двигать эту камеру?

Старый 26.08.2013, 17:50
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 5  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Dip52,
Точка - это и есть "камера".
Да, тупо двигая камеру, весь контент будет позицианироваться относительно её позиций. Не забудьте поместить все объекты в общий контейнер. Двигать нужно контейнер.
__________________
Дети не должны знать о своих родителях

Старый 29.08.2013, 11:11
Dip52 вне форума Посмотреть профиль Отправить личное сообщение для Dip52 Найти все сообщения от Dip52
  № 6  
Ответить с цитированием
Dip52

Регистрация: Aug 2012
Сообщений: 297
Цитата:
Сообщение от Tails Посмотреть сообщение
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);
			}
		}
	}
}
Сделал так, как вы сказали и вот что получилось. Самый нижний объект это предполагаемая сцена, чёрный объект это "информатор", который информирует где сейчас находится контейнер, который я двигаю.
Вложения
Тип файла: swf Движение фона.swf (1.4 Кб, 85 просмотров)

Старый 29.08.2013, 11:56
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 7  
Ответить с цитированием
Tails
 
Аватар для Tails

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Двигать нужно камеру а не мир! Камера перемещается в мире:
Код AS3:
camera.x += 5, camera.x -= 5;
Затем подписываетесь на событие энтер фрейма и каждый кадр позицианируете отображение мира относительно камеры:
Код AS3:
mainContainer.x = -camera.x;
background.x = -camera.x * 0.5;
__________________
Дети не должны знать о своих родителях

Старый 29.08.2013, 13:50
MikroAcse вне форума Посмотреть профиль Отправить личное сообщение для MikroAcse Найти все сообщения от MikroAcse
  № 8  
Ответить с цитированием
MikroAcse
 
Аватар для MikroAcse

Регистрация: Feb 2012
Сообщений: 1,540
Цитата:
атем подписываетесь на событие энтер фрейма и каждый кадр позицианируете отображение мира относительно камеры:
Лучше все таки по изменении позиции камеры.

Старый 29.08.2013, 14:10
Tails вне форума Посмотреть профиль Отправить личное сообщение для Tails Найти все сообщения от Tails
  № 9  
Ответить с цитированием
Tails
 
Аватар для Tails

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

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

Старый 30.08.2013, 00:36
MikroAcse вне форума Посмотреть профиль Отправить личное сообщение для MikroAcse Найти все сообщения от MikroAcse
  № 10  
Ответить с цитированием
MikroAcse
 
Аватар для MikroAcse

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

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:52.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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