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

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

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

Регистрация: Jun 2014
Сообщений: 558
По умолчанию Нашёл непонятное поведение MovieClip.width

Доброго дня, нашёл непонятное поведение MovieClip.width, не могу понять почему так происходит. Что я хочу сделать: вывести на экран Line, которая символизирует дистанцию и по этой линии движется Ball, который показывает где вы находитесь. Я создаю вектор, пихаю в него одинаковых 4 DistanceLine (при прохождении этапа добавится следующий мувик и произойдёт перерасчёт положения героя, но до этого момента я ещё не добрался). И так добавили на сцену первый мувик-DistanceLine, добавляем Ball. Герой начал двигаться, так вот когда дистанция пройдена, по условию Ball должен остановится в конечной точки DistanceLine, но в место этого Ball продолжает движения. Опытным путём выяснил, что условие не срабатывает, т.к.vectorLine[0].width начинает увеличиваться в момент, когда Ball доходит до конца DistanceLine, и за пару секунд становится максимально возможным числом Number

Код AS3:
package classGame.objectGames.distanceLineAndBall
{
	import classGame.objectGames.distanceLineAndBall.elements.DistanceBall;
	import classGame.objectGames.distanceLineAndBall.elements.DistanceLine;
	import flash.display.Sprite;
	import flash.events.Event;
	import eventClass.UserEvent;
	import nape.phys.Body;
	import singleton.sWall.SWall;
	import singleton.speedWorld.SpeedWorldSingleton;
	import singleton.speedWorld.speedWorld.SpeedWorld;
 
	public class DistanceLineAndBall extends Sprite
	{
 
		private var vectorLine:Vector.<DistanceLine> = new Vector.<DistanceLine>;
		private var speedWorld:SpeedWorld;
		private var wall:Body
 
		public function DistanceLineAndBall()
		{
			speedWorld = SpeedWorldSingleton.getSpeedWorldSingleton.getSpeedWorld;
			wall = SWall.getSWall.getWallBody.getBody;
 
			for (var i:uint = 0; i < 4; ++i)
			{
				vectorLine.push(new DistanceLine);
			}
 
			this.addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private var distanceBall:DistanceBall = new DistanceBall();
 
		private function init(e:Event):void
		{
			this.removeEventListener(Event.ADDED_TO_STAGE, init);
			this.addEventListener(Event.REMOVED_FROM_STAGE, removeInit);
 
			stage.addEventListener(UserEvent.START_FLAG_1, userEvent);
		}
 
		//отвечает за колличество дистанций
		private var addLine:uint = 0;
 
		private function userEvent(e:UserEvent):void
		{
			switch (e.type)
			{
			case "startFlag1": 
				addVectorLine();
				positionBall();
				break;
			}
		}
 
		private function addVectorLine():void
		{
			if ((vectorLine[0].stage == null) && (stage.stage != null))
			{
				this.addChild(vectorLine[0]);
				vectorLine[0].y = stage.stageHeight * 0.98;
				vectorLine[0].x = stage.width * 0.1;
			}
		}
 
		private function positionBall():void
		{
			if (vectorLine[0].stage != null)
			{
				vectorLine[0].addChild(distanceBall);//вся магия здесь, в теории я просто хотел привязать координаты Ball к Line, чтобы Ball двигался относительно Line
				this.addEventListener(Event.ENTER_FRAME, updateBall);
			}
			else distanceBall.x = 0;
		}
 
		private function updateBall(e:Event):void
		{
			trace(vectorLine[0].width) // проблема проявилась тут, длинна мувика начинает почему-то расти
			switch (addLine)
			{
			case 0: 
				if (distanceBall.x < vectorLine[0].width)
					distanceBall.x = vectorLine[0].width * (Math.abs(wall.position.x - speedWorld.stage1Distance) / speedWorld.stage1Distance);
				else 
					distanceBall.x = vectorLine[0].width;
				break;
			}
		}
 
		private function removeInit(e:Event):void
		{
			this.removeEventListener(Event.REMOVED_FROM_STAGE, removeInit);
			stage.removeEventListener(UserEvent.START_FLAG_1, userEvent);
			this.removeEventListener(Event.ENTER_FRAME, updateBall);
			this.addEventListener(Event.ADDED_TO_STAGE, init);
		}
	}
}
я переписал код иначе
Код AS3:
		private function positionBall():void
		{
			if (vectorLine[0].stage != null)
			{
				this.addChild(distanceBall);
				trace(vectorLine[0].x);
				distanceBall.x = vectorLine[0].x;
				distanceBall.y = vectorLine[0].y;
				this.addEventListener(Event.ENTER_FRAME, updateBall);
			}
			else distanceBall.x = vectorLine[0].x;
		}
 
		private function updateBall(e:Event):void
		{
			switch (addLine)
			{
			case 0: 
				if (distanceBall.x < vectorLine[0].width + vectorLine[0].x)
					distanceBall.x = vectorLine[0].width * (Math.abs(wall.position.x - speedWorld.stage1Distance) / speedWorld.stage1Distance) + vectorLine[0].x;
				else
					distanceBall.x = vectorLine[0].width + vectorLine[0].x;
				break;
			}
		}
и всё заработало, но не могу понять, что же не так в первом варианте, почему .with сам начинает расти, хотя нигде в коде я его не трогаю, да и визуально линия не становится длиннее
Изображения
 

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Цитата:
//вся магия здесь
Естественно. Шар становится частью линии, и когда доходит до ее конца, часть шара (а может и весь, если его начало координат находится в топ-лефте, то есть вся его графика — в положительных координатах) "высовывается наружу". Таким образом клип "линия" становится длиннее, и движение продолжается.
У контейнеров НЕТ своих размеров. Ни у Спрайта, ни у Мувиклипа, ни даже у Стейдж. По сути они — лишь системы координат. Размер создает контент. Именно поэтому, например, у Стейдж есть width, но есть stageWidth. И это совершенно разные вещи: первый равен ширине всего контента Стейджа, а второй — это размер окна плеера, в котором демонстрируется ролик.
__________________
Reality.getBounds(this);

Старый 10.03.2016, 22:05
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 3  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Хы. Вот было бы круто всем контейнерам задавать а-ля stageWidth. Хочешь по контенту у любого спросить? Бери width. Хочешь задать контейнеру "stageWidth" -- задавай )
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Цитата:
Сообщение от dimarik Посмотреть сообщение
Хы. Вот было бы круто всем контейнерам задавать а-ля stageWidth. Хочешь по контенту у любого спросить? Бери width. Хочешь задать контейнеру "stageWidth" -- задавай )
А в чём сложность то?
У меня так и сделано, есть базовый гуи Component с таким "stageWidth".
__________________
Дети не должны знать о своих родителях

Старый 10.03.2016, 22:53
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 5  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
а что должен этот stageWidth вернуть для контейнера? Его максимальные габариты?

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
undefined,
На его основе строится компонент. Кнопка растягивается, прогресс бар, форма.
При использовании width, скалировалась бы матрица дисплей объекта, а stageWidth позволяет выполнить масштабирование вручную, как нужно.

Задаются stageWidth вручную и не изменяются сами по себе. Каждый конкретный компонент может иметь свои stageWidth по умолчанию.
__________________
Дети не должны знать о своих родителях

Старый 11.03.2016, 00:24
undefined вне форума Посмотреть профиль Отправить личное сообщение для undefined Найти все сообщения от undefined
  № 7  
Ответить с цитированием
undefined

Регистрация: Oct 2006
Сообщений: 2,281
Цитата:
На его основе строится компонент. Кнопка растягивается, прогресс бар, форма.
А почему бы просто не переопределить сеттер width?

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

блогер
Регистрация: Dec 2008
Адрес: г. Чебоксары
Сообщений: 2,259
Записей в блоге: 6
Цитата:
Сообщение от undefined Посмотреть сообщение
А почему бы просто не переопределить сеттер width?
Причин много:
1. Не интуитивное поведение. (Забудите либо сами, либо коллега не поймёт "что за фигня")
2. Теряется базовая функциональность width.
3. В некоторых фреймворках бажит. (Привет старлинг)
4. Не всегда нужна именно такая сигнатура метода, удобнее использовать uint, а не Number, по ряду причин.
5. Если переопределить только сеттер, то геттер будет по прежнему возвращать результат getBounds. Будет динамическое изменение свойства каждый кадр, в зависимости от контента. Это очень не удобно, особенно когда окна содержат анимацию, тени, фильтры или другие подобные штуки.
__________________
Дети не должны знать о своих родителях

Старый 11.03.2016, 22:58
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 9  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Я завел свойства baseWidth/baseHeight. Визуальный объект органично сбрасывает свои размеры к ним, когда ставишь scaleX/scaleY в единицу. Но для stage node пока оставил название stageWidh/stageHeight. Суть одно и тоже, но разуму флешера понятнее. И еще завел для визуальных объектов режим resizeMode: scale/no scale. В первом базовые размеры, а точнее, размеры AABB, которые задаются базовыми размерами, не изменяются, а во втором изменяются.
Ну да, обычные widh/height влияют только на масштабирование (scale).
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

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

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

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


 


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


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