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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 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()

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

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

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Цитата:
Код AS3:
	  function startl1():void{
 
		car.addEventListener(Event.ENTER_FRAME, ModifyCar);	
 
				stage.addEventListener(Event.ENTER_FRAME,corektirovka);
		   }
Вот это бред, в данном конкретном случае гораздо проще сделать одну подписку на энтерфрейм на стедж и не париться.

Цитата:
Код AS3:
		var masterDot={x:master.dotOut.x, y:master.dotOut.y};
 
		master.localToGlobal(masterDot);
		globalToLocal(masterDot);
Вот здесь masterDot должен иметь вполне конкретный тип Point, а не призрачный Object.

Глубже вникать не стал. С таким форматированием ас3 кода глаза сломать стремно.

Трейсы твои адекватные выдает, у тя трейлер и машина мувиклипы и есть насколько я понимаю. А то что какой-то там терм андефайнед, так было бы неплохо знать какой именно терм, а то по этому куску кода сложно сказать что там у тя андефайнед.
__________________
Кто к нам с чем для чего - тот у нас того от того.

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

Регистрация: Sep 2010
Сообщений: 49
По умолчанию Конкретно ошибка такова

TypeError: Error #1034: Type Coercion failed: cannot convert Object@11117331 to flash.geom.Point.
at truckas3_fla::MainTimeline/correctTrailer()
at truckas3_fla::MainTimeline/corektirovka()

строка : master.localToGlobal(masterDot);

Я вложил 2 файла .fla Один в AS2 второй в AS3 может так проще понять будет.
Вложения
Тип файла: zip twoversion.zip (63.7 Кб, 44 просмотров)

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

блогер
Регистрация: Oct 2010
Адрес: Киев
Сообщений: 1,678
Записей в блоге: 12
Отправить сообщение для Dukobpa3 с помощью Skype™
Прочел бы ответ мой сначала внимательно

Цитата:
Вот здесь masterDot должен иметь вполне конкретный тип Point, а не призрачный Object.
И не знаю как кто, а я бы за нетипизированне переменные руки отрывал

Добавлено через 6 минут
поменяй вот это:
Код AS3:
var masterDot={x:master.dotOut.x, y:master.dotOut.y};
на вот это:
Код AS3:
var masterDot:Point = new Point(master.dotOut.x, master.dotOut.y);
Будет без той ошибки о которой ты спрашиваешь. А глюки с координатами кузова сам исправляй, а то машина ездит а кузов отрывается и улетает куда-то...

Добавлено через 13 минут
Блин, всё-таки не сдержался)))

Менй вот этот блок целиком:
Код AS3:
var masterDot={x:master.dotOut.x, y:master.dotOut.y};
 
master.localToGlobal(masterDot);
globalToLocal(masterDot);
На вот этот:
Код AS3:
var masterDot:Point = new Point(master.dotOut.x, master.dotOut.y);
 
masterDot = master.localToGlobal(masterDot);
masterDot = globalToLocal(masterDot);
И было бы неплохо хоть литературку подчитать о тех методах которые используешь. localToGlobal/globalToLocal в ас3 работают немного не так как в ас2.
__________________
Кто к нам с чем для чего - тот у нас того от того.

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

Регистрация: Sep 2010
Сообщений: 49
Привет.Спасибо за ответ.НАсчет кузова,этя бы потом ковырял.А насчет поинта, я твой ответ видел,но вот просто напроста пока не проходил Да читаю я читаю потихоньку.Только вот больше методом тыка вечно почемуто,да терпения маловато...Спасибо еще раз.Добавил тебе хороший отзыв

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

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

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


 


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


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