PDA

Просмотр полной версии : Из AS 2 в AS3 прошу помощи.


Andrej
06.04.2011, 01:06
Доброго времени суток дорогие форумчане.Дело в том ,что AS 2 я не знаю,сразу учил с AS3.По одному примеру в интернете я решил попробовать сделать игру,но пример написан на AS2.В принципе все переделал как с мог.Но возникла такая проблема.До этого я использовал hitTestObject одного мувика с другим,например :

if (klip1.hitTestObject(klip2)) {то......}

В принципе и тут я переделал,но это очень километрово писать код для каждого блока.А в примере автор использует массив с которого передает данные как я понял.Вобщем я с таким пока не сталкивался прошу помощи.Теперь по порядку.У нас есть герой (hero),он прыгает бегает и так далее, с этим ясно.Далее мы содаем блоки для него.Автор примера создает прямоугольник,все блоки в нем, а в кадре прямоугольника пишет _parent.addBox(this);.Далее такой код 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 передать данные из этого прямоугольника.Спасибо.С уважением Андрей.

Gaen
06.04.2011, 02:04
Если нужно проверить только пересечение, то вполне хватит такой функции:

function checkHitPlatform(){
for(var i:int = 0; i < boxes.length; i++){
if(hero.hitTestObject(boxes[i])){
//ляляля
}
}
}


В вашем примере автор не просто проверяет пересечение героя с платформой. Внутри мувика-героя есть 4 мувика-зоны: левая, правая, верхняя и нижняя. Автор проверяет пересечение с каждой из этих зон, что позволяет адекватно среагировать: при пересечении слева и справа герой не может войти внутрь препятствия, при пересечении снизу он стоит на платформе, а не проваливается в нее, и при пересечении сверху (герой подпрыгнул и ударился головой о потолок) прыжок вверх прекращается и герой начинает падать вниз.

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

Andrej
06.04.2011, 11:37
GAIKER, спасибо за ответ.Да мне нужно не только пересечение,а именно так как вы сказали 4 мувика-зоны и пересечение с каждой,но там я дальше допишу это понятно.Попробую обьяснить,что именно мне непонятно.Строка в мувике с платформами

_parent.addBox(this);


и вот эта функция


addBox = function (obj) {
boxes.push(obj);
}



Обычно я обращаюсь к мувику либо по Instance,либо addChild.А вот как он тут не понял.Можно тут чуть подробнее.Допустим я сделал мувик, внего насавил платформ как в данном случае дальше...Спасибо.

olexandr
06.04.2011, 15:04
это всего лишь добавление элемента в массив. что там может быть непонятно?

Gaen
06.04.2011, 15:37
Пойду от печки, т.е. от this.
This - это указатель на мувик, внутри которого исполняется код. Когда в коде идет работа со свойством или вызывается функция, то неявно подразумевается, что мы работаем с мувиком, внутри которого этот код написан, и поэтому this можно не писать.
Т.е. мы можем написать x = 100; и мувик встанет на соответствующую координату. А можем написать this.x = 100; и эффект будет точно такой же.
Но приколы начинаются в тот момент, когда мы решаем поработать с другим мувиком. Представим, что у нас есть мувик mcParent, внутри него лежит мувик mcChild, и мы пишем код в первом кадре mcParent. Нам нужно также сдвинуть mcChild на x=100. Пишем:
mcChild.x = 100;
Теперь немного усложним задачу: в mcParent лежат мувики mcFoo, mcBar, mcZod, mcKux и mcLol. Код вырастет до такого:

mcFoo.x = 100;
mcBar.x = 100;
mcZod.x = 100;
mcKux.x = 100;
mcLol.x = 100;

Код, написанный копипастом, вызывает воспоминания о массивах и циклах:

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 до боли знакомый код:

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


Плюс внутри каждого мувика, который нужно сдвинуть, пишем такой код:

parent.addMc(this);


Эта строчка отрабатывает во всех мувиках, которые нужно сдвинуть. Каждый такой мувик обращается к mcParent и передает ему ссылку на себя самого. И каждый раз mcParent получает ссылку на мувик и заносит ее в свой массив mcsToMove. В итоге в этом массиве будут содержаться ссылки на все мувики, которые нужно сдвинуть. Теперь по этому массиву можно пройтись циклом, собственно сдвигая мувики - это произойдет при вызове moveMcs().

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

Andrej
06.04.2011, 21:11
GAIKER, Спасибо за исчерпывающий ответ.Ну что такое this и parent это я знал.Не знал как работает команда push и всегда боялся как это правельно сказать подключаться из мувика глубже к функции другого мувика типа этого

parent.addMc(this);

(П.С правда тут у меня так сработало

MovieClip(parent).addMc(this);

),т.е писал отдельную функцию для каждого мувика.Но у меня стаж еще и года нету :) не все сразу.Спасибо тебе большое.С уважением Андрей.

Gaen
06.04.2011, 22:23
push заносит элемент в конец массива http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#push()

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

ЗЫ: Кнопочка "спасибо" находится над сообщением и выглядит как весы :)

Andrej
06.04.2011, 23:23
GAIKER,Нажмал на весы + добавил отзыв :)