|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
Нашёл непонятное поведение MovieClip.width
Доброго дня, нашёл непонятное поведение MovieClip.width, не могу понять почему так происходит. Что я хочу сделать: вывести на экран Line, которая символизирует дистанцию и по этой линии движется Ball, который показывает где вы находитесь. Я создаю вектор, пихаю в него одинаковых 4 DistanceLine (при прохождении этапа добавится следующий мувик и произойдёт перерасчёт положения героя, но до этого момента я ещё не добрался). И так добавили на сцену первый мувик-DistanceLine, добавляем Ball. Герой начал двигаться, так вот когда дистанция пройдена, по условию Ball должен остановится в конечной точки DistanceLine, но в место этого Ball продолжает движения. Опытным путём выяснил, что условие не срабатывает, т.к.vectorLine[0].width начинает увеличиваться в момент, когда Ball доходит до конца DistanceLine, и за пару секунд становится максимально возможным числом Number
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); } } } 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; } } |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Цитата:
У контейнеров НЕТ своих размеров. Ни у Спрайта, ни у Мувиклипа, ни даже у Стейдж. По сути они — лишь системы координат. Размер создает контент. Именно поэтому, например, у Стейдж есть width, но есть stageWidth. И это совершенно разные вещи: первый равен ширине всего контента Стейджа, а второй — это размер окна плеера, в котором демонстрируется ролик.
__________________
Reality.getBounds(this); |
|
|||||
.
|
Хы. Вот было бы круто всем контейнерам задавать а-ля stageWidth. Хочешь по контенту у любого спросить? Бери width. Хочешь задать контейнеру "stageWidth" -- задавай )
|
|
|||||
Цитата:
У меня так и сделано, есть базовый гуи Component с таким "stageWidth".
__________________
Дети не должны знать о своих родителях |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
а что должен этот stageWidth вернуть для контейнера? Его максимальные габариты?
|
|
|||||
undefined,
На его основе строится компонент. Кнопка растягивается, прогресс бар, форма. При использовании width, скалировалась бы матрица дисплей объекта, а stageWidth позволяет выполнить масштабирование вручную, как нужно. Задаются stageWidth вручную и не изменяются сами по себе. Каждый конкретный компонент может иметь свои stageWidth по умолчанию.
__________________
Дети не должны знать о своих родителях |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
Цитата:
|
|
|||||
Причин много:
1. Не интуитивное поведение. (Забудите либо сами, либо коллега не поймёт "что за фигня") 2. Теряется базовая функциональность width. 3. В некоторых фреймворках бажит. (Привет старлинг) 4. Не всегда нужна именно такая сигнатура метода, удобнее использовать uint, а не Number, по ряду причин. 5. Если переопределить только сеттер, то геттер будет по прежнему возвращать результат getBounds. Будет динамическое изменение свойства каждый кадр, в зависимости от контента. Это очень не удобно, особенно когда окна содержат анимацию, тени, фильтры или другие подобные штуки.
__________________
Дети не должны знать о своих родителях |
|
|||||
.
|
Я завел свойства baseWidth/baseHeight. Визуальный объект органично сбрасывает свои размеры к ним, когда ставишь scaleX/scaleY в единицу. Но для stage node пока оставил название stageWidh/stageHeight. Суть одно и тоже, но разуму флешера понятнее. И еще завел для визуальных объектов режим resizeMode: scale/no scale. В первом базовые размеры, а точнее, размеры AABB, которые задаются базовыми размерами, не изменяются, а во втором изменяются.
Ну да, обычные widh/height влияют только на масштабирование (scale). |
Часовой пояс GMT +4, время: 19:23. |
|
« Предыдущая тема | Следующая тема » |
|
|