|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
странное поведение мувика, при смещении
Доброго! Помогите разобраться
Ковыряюсь с задним фоном и столкнулся со странной штукой. Мир у меня смещается, за отклонениеотвечает одна статическая переменная(offset) в игре. Все объекты, которые должны смещаться соответсвенно имеют к ней доступ. До сегодня это были Body из Nape и всё работало великолепно. Решил добавить задний фон, он соответственно тоже должен смещаться, ну вот незадача, накапливается погрешность в координатах со временем и задний фон уходит. НО ведь переменная одна для всех и Body не накапливают это погрешность. Так вот, если в итоге вместо напрямую писать Мувик.y +=offset, я беру тело Body, в котором есть смещение Body.position.y+=offset; а в классе мувика кину ссылку на него и напишу Мувик.y = Body.position.y, то погрешности нет - это таинственная магия мне не понятна, КАК так выходит? |
|
|||||
Ты уже не новичок на этом форуме, а тему создал как новичок. Откуда нам знать что у тебя там за смещения и как они происходят?
Могу лишь предположить, что где-то есть привязка к ширине или высоте контейнера, которая меняется при добавлении чего-либо внутрь. Это решается банальным оверрайдом геттеров высоты и ширины. Либо, второй вариант, у тебя неправильная математика
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
Цитата:
математику я всё же склонен откинуть, т.к. при написании кода я столкнулся изначально с этим, пока работал только с Body, и учёл это. До сего момента всё оставалось в точности до пикселя вот код с расчётом offset отрывок кода - отдельный класс, в котором лежат общие переменные для всей игры public static var lowHeight:int = 150;//минимальная высота для смещения public static var maxHeight:int = 1300; //максимальная высота смещения public static var allOffset:Number = 0; //общее смещение public static var tempOffset:Number = 0; //смещение за один frame package classesGame.offset { import classesGame.options.OptionsUnits; import ParentCommon; import classesGame.userEvent.UserEvent; import flash.events.Event; import nape.phys.Body; import singleton.sHero.SHero; public class Offset extends ParentCommon { private var _hero:Body = SHero.getSHero.getHero.getBody; public function Offset() { } override public function init(e:Event):void { super.init(e); this.addEventListener(Event.ENTER_FRAME, offset); stage.addEventListener(UserEvent.START_FLAG_1, startFlag1); } private function offset(e:Event):void { OptionsUnits.tempOffset = 0; if (OptionsUnits.allOffset < OptionsUnits.maxHeight) { if (_hero.position.y < OptionsUnits.lowHeight) { if (_hero.velocity.y < 0) { OptionsUnits.tempOffset = OptionsUnits.lowHeight - _hero.position.y; OptionsUnits.allOffset += OptionsUnits.tempOffset; _hero.position.y = OptionsUnits.lowHeight; } } else if ((_hero.velocity.y > 0) && (OptionsUnits.allOffset > 0)) { OptionsUnits.tempOffset = OptionsUnits.lowHeight - _hero.position.y; OptionsUnits.allOffset += OptionsUnits.tempOffset; _hero.position.y = OptionsUnits.lowHeight; } } if ((OptionsUnits.allOffset >= OptionsUnits.maxHeight) && (_hero.velocity.y >= 0)) { if (_hero.position.y > OptionsUnits.lowHeight) { OptionsUnits.tempOffset = OptionsUnits.lowHeight - _hero.position.y; OptionsUnits.allOffset += OptionsUnits.tempOffset; _hero.position.y = OptionsUnits.lowHeight; } } if (OptionsUnits.allOffset < 0)//здесь, если после смещения находится погрешность, она невелируется { OptionsUnits.tempOffset -= OptionsUnits.allOffset; OptionsUnits.allOffset = 0; } } private function startFlag1(e:UserEvent):void { OptionsUnits.allOffset = 0; } override public function removeInit(e:Event):void { super.removeInit(e); } } } package classesGame.cover { import classesGame.options.OptionsUnits; import classesGame.userEvent.UserEvent; import flash.events.Event; import nape.phys.Body; import singleton.sFloor.SFloor; public class Cover extends ParentCommon { public function Cover() { } private var cover1:cover_mc = new cover_mc(); private var cover2:cover_mc = new cover_mc(); override public function init(e:Event):void { super.init(e); stage.addEventListener(UserEvent.START_FLAG_1, userEvent); stage.addEventListener(UserEvent.START_FLAG_3, userEvent); stage.addEventListener(UserEvent.PAUSE, userEvent); stage.addEventListener(UserEvent.PLAY, userEvent); } private function userEvent(e:UserEvent):void { switch (e.type) { case "startFlag1": this.removeEventListener(Event.ENTER_FRAME, updateCover); startFlag1(); break; case "startFlag3": this.addEventListener(Event.ENTER_FRAME, updateCover); break; case "pause": this.removeEventListener(Event.ENTER_FRAME, updateCover); break; case "play": this.addEventListener(Event.ENTER_FRAME, updateCover); break; } } private function startFlag1():void { if (cover1.stage == null) { this.addChild(cover1); this.addChild(cover2); } cover1.y = stage.stageHeight; cover1.x = 0; cover2.y = stage.stageHeight; cover2.x = cover1.width; } private var bodyFloor:Body = SFloor.getSFloor.getFloor.getBody;//вот тут пришлось ввести ссылку на один из объектов body, ради того, чтобы смещение исчезло private function updateCover(e:Event):void { cover1.y = cover2.y = bodyFloor.position.y + 50;//тут следит за смещением Body cover1.x -= OptionsUnits.tempGameSpeed / 200; cover2.x -= OptionsUnits.tempGameSpeed / 200; if (cover1.x < -cover1.width) cover1.x = cover2.x + cover2.width; if (cover2.x < -cover2.width) cover2.x = cover1.x + cover1.width; } override public function removeInit(e:Event):void { super.removeInit(e); } } } package classesGame.addActionUnits { import classesGame.options.OptionsUnits; import ParentCommon; import flash.events.Event; import nape.phys.Body; import singleton.sFloor.SFloor; public class AddActionFloor extends ParentCommon { private var body:Body = SFloor.getSFloor.getFloor.getBody; public function AddActionFloor() { } override public function init(e:Event):void { super.init(e); this.addEventListener(Event.ENTER_FRAME, updateFloor); } private function updateFloor(e:Event):void { body.position.y += OptionsUnits.tempOffset; //сюда лишь передаётся offset за 1 frame } override public function removeInit(e:Event):void { super.removeInit(e); } } } то появляется неточность положения, за 1 минуту набегает до 20-30 пикселей в верх п.с. я знаю, что не соблюдаю конвенцию, но прям не переношу нижнее подчёркивание, простите Добавлено через 1 час 52 минуты ещё момент, точка начала координат в cover1/2 находит в левом нижнем углу, хотя думаю это не должно мешать |
|
|||||
Lorem ipsum
|
Поля x и y экранных объектов флэша округляются до 1/20, а у нейпа — нет.
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
нет, там же в коде прям в самом начале
выходит, придётся оставить привязку к нейпу? |
|
|||||
Lorem ipsum
|
Да, привязываться к нейпу здесь будет наиболее уместным.
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Oct 2006
Сообщений: 2,281
|
либо хранить координаты отдельно от свойств x,y дисплейОбжектов.
|
|
|||||
Lorem ipsum
|
Это беспроигрышный вариант. Просто здесь для того как раз нейп и подойдет, у него все точно.
__________________
Поймай яблоко 2! |
|
|||||
Регистрация: Jun 2014
Сообщений: 558
|
спасибо всем, оставлю привязку к нейпу, т.к. решение в 2 строчки кода будет самое разумное
|
Часовой пояс GMT +4, время: 09:19. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|