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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 06.04.2011, 01:06
Andrej вне форума Посмотреть профиль Отправить личное сообщение для Andrej Найти все сообщения от Andrej
  № 1  
Ответить с цитированием
Andrej

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

Доброго времени суток дорогие форумчане.Дело в том ,что AS 2 я не знаю,сразу учил с AS3.По одному примеру в интернете я решил попробовать сделать игру,но пример написан на AS2.В принципе все переделал как с мог.Но возникла такая проблема.До этого я использовал hitTestObject одного мувика с другим,например :
Код AS3:
if (klip1.hitTestObject(klip2)) {то......}
В принципе и тут я переделал,но это очень километрово писать код для каждого блока.А в примере автор использует массив с которого передает данные как я понял.Вобщем я с таким пока не сталкивался прошу помощи.Теперь по порядку.У нас есть герой (hero),он прыгает бегает и так далее, с этим ясно.Далее мы содаем блоки для него.Автор примера создает прямоугольник,все блоки в нем, а в кадре прямоугольника пишет _parent.addBox(this);.Далее такой код AS2:
Код AS1/AS2:
//половина ширины персонажа
var hhx = (hero.p1._x - hero.p3._x + hero.p1._width / 2 + hero.p3._width / 2) / 2;
//половина высоты персонажа
var hhy = (hero.p2._y - hero.p4._y + hero.p2._height / 2 + hero.p4._height / 2) / 2;
//массив с платформами
var boxes = [];
//каждая платформа при старте вызывает эту функцию и передаёт себя как параметр
addBox = function (obj) {
	boxes.push(obj);
}
 
checkHitPlatform = function(){
	//перебираем все платформы и проверяем пересечение с персонажем с учётом того,
	//в какую сторону он смотрит
	var i = boxes.length;
	while (i--) {
		var curB = boxes[i];
		if (curB.hitTest(hero.p1)) {
			//контакт справа
			if (hero._xscale > 0) {
				hero._x = curB._x - curB._width / 2 - hhx;
			} else {
				hero._x = curB._x + curB._width / 2 + hhx;
			}
		} else if (curB.hitTest(hero.p2)) {
			//контакт снизу
			jump = false;
			speedY = 0;
			hero._y = curB._y - curB._height / 2 - hhy;
		} else if (curB.hitTest(hero.p3)) {
			//контакт слева
			if (hero._xscale > 0) {
				hero._x = curB._x + curB._width / 2 + hhx;
			} else {
				hero._x = curB._x - curB._width / 2 - hhx;
			}
		} else if (curB.hitTest(hero.p4)) {
			//контакт сверху
			speedY = 0; // как вариант: speedY *= -1;
			hero._y = curB._y + curB._height / 2 + hhy;
		}
	}
}
Как в AS3 передать данные из этого прямоугольника.Спасибо.С уважением Андрей.

Старый 06.04.2011, 02:04
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 2  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Если нужно проверить только пересечение, то вполне хватит такой функции:
Код AS3:
function checkHitPlatform(){
	for(var i:int = 0; i < boxes.length; i++){
		if(hero.hitTestObject(boxes[i])){
			//ляляля
		}
	}
}
В вашем примере автор не просто проверяет пересечение героя с платформой. Внутри мувика-героя есть 4 мувика-зоны: левая, правая, верхняя и нижняя. Автор проверяет пересечение с каждой из этих зон, что позволяет адекватно среагировать: при пересечении слева и справа герой не может войти внутрь препятствия, при пересечении снизу он стоит на платформе, а не проваливается в нее, и при пересечении сверху (герой подпрыгнул и ударился головой о потолок) прыжок вверх прекращается и герой начинает падать вниз.

Мои телепатические скилы пока не позволяют точно установить, с чем именно вы не сталкивались и какой момент вам непонятен. Если вы уточните вопрос, я постараюсь дать необходимый вам ответ.
__________________
тонкий тролль, осеянный благодатью

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

Регистрация: Sep 2010
Сообщений: 49
GAIKER, спасибо за ответ.Да мне нужно не только пересечение,а именно так как вы сказали 4 мувика-зоны и пересечение с каждой,но там я дальше допишу это понятно.Попробую обьяснить,что именно мне непонятно.Строка в мувике с платформами
Код AS1/AS2:
_parent.addBox(this);
и вот эта функция

Код AS1/AS2:
 addBox = function (obj) {
	boxes.push(obj);
}
Обычно я обращаюсь к мувику либо по Instance,либо addChild.А вот как он тут не понял.Можно тут чуть подробнее.Допустим я сделал мувик, внего насавил платформ как в данном случае дальше...Спасибо.

Старый 06.04.2011, 15:04
olexandr вне форума Посмотреть профиль Отправить личное сообщение для olexandr Посетить домашнюю страницу olexandr Найти все сообщения от olexandr
  № 4  
Ответить с цитированием
olexandr
 
Аватар для olexandr

Регистрация: Aug 2007
Адрес: Ukraine, Kyiv
Сообщений: 643
Отправить сообщение для olexandr с помощью ICQ Отправить сообщение для olexandr с помощью MSN Отправить сообщение для olexandr с помощью Skype™
это всего лишь добавление элемента в массив. что там может быть непонятно?
__________________
сайт, vk

Старый 06.04.2011, 15:37
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 5  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
Пойду от печки, т.е. от this.
This - это указатель на мувик, внутри которого исполняется код. Когда в коде идет работа со свойством или вызывается функция, то неявно подразумевается, что мы работаем с мувиком, внутри которого этот код написан, и поэтому this можно не писать.
Т.е. мы можем написать
Код AS3:
x = 100;
и мувик встанет на соответствующую координату. А можем написать
Код AS3:
this.x = 100;
и эффект будет точно такой же.
Но приколы начинаются в тот момент, когда мы решаем поработать с другим мувиком. Представим, что у нас есть мувик mcParent, внутри него лежит мувик mcChild, и мы пишем код в первом кадре mcParent. Нам нужно также сдвинуть mcChild на x=100. Пишем:
Код AS3:
mcChild.x = 100;
Теперь немного усложним задачу: в mcParent лежат мувики mcFoo, mcBar, mcZod, mcKux и mcLol. Код вырастет до такого:
Код AS3:
mcFoo.x = 100;
mcBar.x = 100;
mcZod.x = 100;
mcKux.x = 100;
mcLol.x = 100;
Код, написанный копипастом, вызывает воспоминания о массивах и циклах:
Код AS3:
var mcs:Array = [];
 
mcs.push(mcFoo);
mcs.push(mcBar);
mcs.push(mcZod);
mcs.push(mcKux);
mcs.push(mcLol);
 
for(var i:int = 0; i < mcs.length; i++){
    var mc:MovieClip = mcs[i];
    mc.x = 100;
}//for
Дальше - веселее. Теперь представим, что внутри mcParent валяется куча мувиков, и какие-то из них нужно сдвинуть на x=100, причем какие именно, mcParent не знает. Зато те мувики, которые нужно сдвинуть, знают о том, что mcParent должен их сдвинуть. Поэтому мы делаем финт ушами: пускай эти мувики сами рассказывают mcParent о том, что их нужно сдвинуть. Для этого пишем в mcParent до боли знакомый код:
Код AS3:
this.mcsToMove = [];
 
function addMc(mc:MovieClip){
    this.mcsToMove.push(mc);
}//addMc
 
function moveMcs(){
    for(var i:int = 0; i < mcsToMove.length; i++){
        var mc:MovieClip = mcsToMove[i];
        mc.x = 100;
    }//for
}//moveMcs
Плюс внутри каждого мувика, который нужно сдвинуть, пишем такой код:
Код AS3:
parent.addMc(this);
Эта строчка отрабатывает во всех мувиках, которые нужно сдвинуть. Каждый такой мувик обращается к mcParent и передает ему ссылку на себя самого. И каждый раз mcParent получает ссылку на мувик и заносит ее в свой массив mcsToMove. В итоге в этом массиве будут содержаться ссылки на все мувики, которые нужно сдвинуть. Теперь по этому массиву можно пройтись циклом, собственно сдвигая мувики - это произойдет при вызове moveMcs().

Ну и в качестве финального штриха меняем понятие "сдвинуть на x=100" на "проверить на столкновение с героем", и получаем искомое.
__________________
тонкий тролль, осеянный благодатью

Старый 06.04.2011, 21:11
Andrej вне форума Посмотреть профиль Отправить личное сообщение для Andrej Найти все сообщения от Andrej
  № 6  
Ответить с цитированием
Andrej

Регистрация: Sep 2010
Сообщений: 49
GAIKER, Спасибо за исчерпывающий ответ.Ну что такое this и parent это я знал.Не знал как работает команда push и всегда боялся как это правельно сказать подключаться из мувика глубже к функции другого мувика типа этого
Код AS3:
 parent.addMc(this);
(П.С правда тут у меня так сработало
Код AS3:
 MovieClip(parent).addMc(this);
),т.е писал отдельную функцию для каждого мувика.Но у меня стаж еще и года нету не все сразу.Спасибо тебе большое.С уважением Андрей.

Старый 06.04.2011, 22:23
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 7  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
push заносит элемент в конец массива http://help.adobe.com/en_US/FlashPla...ay.html#push()

MovieClip(parent) - это приведение parent к типу MovieClip, не путать с new MovieClip(parent);
Запись type(value) приводит value к типу type, либо выкидывает исключение, если приведение невозможно. Еще есть вариант value as type, такая конструкция тоже приводит тип, но если приведение невозможно, то она не выкидывает исключение, а просто возвращает null.

ЗЫ: Кнопочка "спасибо" находится над сообщением и выглядит как весы
__________________
тонкий тролль, осеянный благодатью

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

Регистрация: Sep 2010
Сообщений: 49
GAIKER,Нажмал на весы + добавил отзыв

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

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

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


 


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


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