Показать сообщение отдельно
Старый 01.05.2011, 18:36
Andrej вне форума Посмотреть профиль Отправить личное сообщение для Andrej Найти все сообщения от Andrej
  № 1  
Ответить с цитированием
Andrej

Регистрация: Sep 2010
Сообщений: 49
По умолчанию Из AS 2 в AS3 levels в AS2 как сделать в AS3

Доброго времени суток.Есть код в AS2.0 (совсем не знаком) пытаюсь переделать в AS 3.0.На сцене 2 мувика trailer и car.В них 2 мувика сцепки в car dotOut в trailer dotIn.Ну и смысл мы ими управляем.Никак не могу понять функцию correctTrailer(slave, master) если трейсить trace(slave); выводится _level0.trailer,если же trace(master);то _level0.car, что мне не известно и тут тупик,что за левел и от куда берется.
Далее пишу код в AS 2.0 взятый из сети,пропуская функцию клавиатуры управление кнопками.
Код AS1/AS2:
 
 
speed = 0;
speedLimit = 8;
speedStep = .5;
rotLimit = 35;
rotStep = 3;
trailerRotLimit = 55 / 180 * Math.PI;
 
function move(){
	if(Math.abs(speed) > 0) {
		car._rotation += car.left._rotation * speed / car.left._x;
	}
	angle = car._rotation * Math.PI / 180;
	speedX = speed * Math.cos(angle);
	speedY = speed * Math.sin(angle);
	car._x += speedX;
	car._y += speedY;
 
 
}
 
function correctTrailer(slave, master){
 
	if(speed){
 
		//Пересчитываем точку в родительскую систему координат
		var masterDot = {x:master.dotOut._x, y:master.dotOut._y};
 
		master.localToGlobal(masterDot);
		globalToLocal(masterDot);
 
		var dx = masterDot.x - slave._x;
		var dy = masterDot.y - slave._y;
 
		//Угол между прицепом и машиной
		var aRad = Math.atan2(dy, dx);
 
		//Угол поворота самой машины
		var masterRotRad = master._rotation / 180 * Math.PI;
 
		//Разница между ними
		var dAngle = masterRotRad - aRad;
 
		//Коррекция перехода 180/-180 градусов
		if (dAngle > Math.PI) {
			dAngle = -Math.PI*2 + dAngle;
		} else if (dAngle < -Math.PI) {
			dAngle = Math.PI*2 + dAngle;
		}
		if(speed < 0) {
			//Выполняется только при движении назад
			//Ограничение на поворот и торможение из-за прицепа
			if(dAngle >= trailerRotLimit) {
				aRad = masterRotRad - trailerRotLimit;
				speed *= .8;
			} else if(dAngle <= -trailerRotLimit) {
				aRad = masterRotRad + trailerRotLimit;
				speed *= .8;
			}
 
			//Обратная связь на машину в результате торможения
			//Коэффициенты .5 и 3 подбираются вручную
			if(dAngle >= trailerRotLimit * .5) {
				master._rotation += speed / speedLimit * 3;
			} else if(dAngle <= -trailerRotLimit * .5) {
				master._rotation -= speed / speedLimit * 3;
			}
		}
 
		//Убираем паразитную скорость (погрешность округления чисел)
		if(Math.abs(speed) < speedStep && !Key.isDown(Key.DOWN)) {
			speed = 0;
		}
 
		//Поворачиваем прицеп к машине
		var a = aRad / Math.PI * 180;
		slave._rotation = a;
 
		//Пододвигаем прицеп чтобы была стыковка
		slave._x = masterDot.x - Math.cos(aRad) * slave.dotIn._x;
		slave._y = masterDot.y - Math.sin(aRad) * slave.dotIn._x;
 
	}
}
onEnterFrame = function() {
	move();
	correctTrailer(trailer, car);
	}
Далее пишу код в AS 3.0 который состряпал я,пропуская функцию клавиатуры управление кнопками.

Код AS3:
 
 
		var angle:Number=0;
	var speedX:Number=0;
	var speedY:Number=0;
var speedLimit:Number = 8;
var speedStep:Number = .5;
var rotLimit:Number = 35;
var rotStep:Number = 3;
		var trailerRotLimit:Number = 55 / 180 * Math.PI;
	var speed:Number=0;
	     var pressUp:Boolean = false;
		var pressDown:Boolean = false;
	      var pressLeft:Boolean = false;
            var pressRight:Boolean = false;
 
 
	  function startl1():void{
 
		car.addEventListener(Event.ENTER_FRAME, ModifyCar);	
 
				stage.addEventListener(Event.ENTER_FRAME,corektirovka);
		   }
 
 
		 function corektirovka(eFrame:Event)
        {
			correctTrailer (trailer, car);
		}
 
		function ModifyCar(eFrame:Event)
        {
 
			 if (pressLeft)
            { 
			if (car.lefts.rotation > - rotLimit) {
			car.lefts.rotation = car.rights.rotation -= rotStep;
		}
            }
			 else if (pressRight) {
		if (car.lefts.rotation < rotLimit) {
			car.lefts.rotation = car.rights.rotation += rotStep;
		}
	}
 
				if (pressUp) {
		speed += (speed < speedLimit)? speedStep : 0;
	} else if (pressDown) {
		speed += (speed > -speedLimit)? -speedStep : 0;
	} else {
		speed += (speed < 0)? speedStep : (speed > 0)? -speedStep : 0;
	}
 
				if(Math.abs(speed) > 0) {
		car.rotation += car.lefts.rotation * speed / car.lefts.x;
	}
	angle = car.rotation * Math.PI / 180;
	speedX = speed * Math.cos(angle);
	speedY = speed * Math.sin(angle);
	car.x += speedX;
	car.y += speedY;
 
 
 
				}
 
 
		function correctTrailer(slave, master){
 
 
	if(speed){
 
 
 
 
		var masterDot={x:master.dotOut.x, y:master.dotOut.y};
 
		master.localToGlobal(masterDot);
		globalToLocal(masterDot);
 
		var dx = masterDot.x - slave.x;
		var dy = masterDot.y - slave.y;
 
		//Угол между прицепом и машиной
		var aRad = Math.atan2(dy, dx);
 
		//Угол поворота самой машины
		var masterRotRad = master.rotation / 180 * Math.PI;
 
		//Разница между ними
		var dAngle = masterRotRad - aRad;
 
		//Коррекция перехода 180/-180 градусов
		if (dAngle > Math.PI) {
			dAngle = -Math.PI*2 + dAngle;
		} else if (dAngle < -Math.PI) {
			dAngle = Math.PI*2 + dAngle;
		}
		if(speed < 0) {
			//Выполняется только при движении назад
			//Ограничение на поворот и торможение из-за прицепа
			if(dAngle >= trailerRotLimit) {
				aRad = masterRotRad - trailerRotLimit;
				speed *= .8;
			} else if(dAngle <= -trailerRotLimit) {
				aRad = masterRotRad + trailerRotLimit;
				speed *= .8;
			}
 
			//Обратная связь на машину в результате торможения
			//Коэффициенты .5 и 3 подбираются вручную
			if(dAngle >= trailerRotLimit * .5) {
				master.rotation += speed / speedLimit * 3;
			} else if(dAngle <= -trailerRotLimit * .5) {
				master.rotation -= speed / speedLimit * 3;
			}
		}
 
		//Убираем паразитную скорость (погрешность округления чисел)
		if(Math.abs(speed) < speedStep && !pressDown) {
			speed = 0;
		}
 
		//Поворачиваем прицеп к машине
		var a = aRad / Math.PI * 180;
		slave.rotation = a;
 
		//Пододвигаем прицеп чтобы была стыковка
		slave.x = masterDot.x - Math.cos(aRad) * slave.dotIn.x;
		slave.y = masterDot.y - Math.sin(aRad) * slave.dotIn.x;
	}
}
 
 
	startl1();
Помогите плиз разобраться с функцией correctTrailer(slave, master),может даже кто подправить может.Если трейсю trace(slave);либо master в моем случае то получается и другой [object MovieClip].Ну и конечно же как только начинаю движение получаю результат:
TypeError: Error #1010: A term is undefined and has no properties.
at bigtruck/correctTrailer()
at bigtruck/corektirovka()

Все мозги уже себе запарил,собственными силами разобраться не получается.Большое спасибо.С уважением Андрей.