Цитата:
Сообщение от caseyryan
Ты уже не новичок на этом форуме, а тему создал как новичок. Откуда нам знать что у тебя там за смещения и как они происходят?
Могу лишь предположить, что где-то есть привязка к ширине или высоте контейнера, которая меняется при добавлении чего-либо внутрь. Это решается банальным оверрайдом геттеров высоты и ширины.
Либо, второй вариант, у тебя неправильная математика
|
ну мне ещё учиться и учиться=)
математику я всё же склонен откинуть, т.к. при написании кода я столкнулся изначально с этим, пока работал только с Body, и учёл это. До сего момента всё оставалось в точности до пикселя
вот код с расчётом offset
отрывок кода - отдельный класс, в котором лежат общие переменные для всей игры

Код AS3:
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
вот класс offset

Код AS3:
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);
}
}
}
вот класс cover, там 2 копии заднего фона, которые я чередую

Код AS3:
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);
}
}
}
в самом Body

Код AS3:
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);
}
}
}
если в коде Cover сменить на

Код AS3:
cover1=cover2+=OptionsUnits.tempOffset;
то появляется неточность положения, за 1 минуту набегает до 20-30 пикселей в верх
п.с. я знаю, что не соблюдаю конвенцию, но прям не переношу нижнее подчёркивание, простите
Добавлено через 1 час 52 минуты
ещё момент, точка начала координат в cover1/2 находит в левом нижнем углу, хотя думаю это не должно мешать