Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Из AS 2 в AS3 прошу помощи. (http://www.flasher.ru/forum/showthread.php?t=153603)

Andrej 06.04.2011 01:06

Из 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 передать данные из этого прямоугольника.Спасибо.С уважением Андрей.

Gaen 06.04.2011 02:04

Если нужно проверить только пересечение, то вполне хватит такой функции:
Код AS3:

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 мувика-зоны и пересечение с каждой,но там я дальше допишу это понятно.Попробую обьяснить,что именно мне непонятно.Строка в мувике с платформами
Код AS1/AS2:

_parent.addBox(this);

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

Код AS1/AS2:

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

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

olexandr 06.04.2011 15:04

это всего лишь добавление элемента в массив. что там может быть непонятно?

Gaen 06.04.2011 15:37

Пойду от печки, т.е. от 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" на "проверить на столкновение с героем", и получаем искомое.

Andrej 06.04.2011 21:11

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

 parent.addMc(this);

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

 MovieClip(parent).addMc(this);

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

Gaen 06.04.2011 22:23

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.

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

Andrej 06.04.2011 23:23

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


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

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