Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Объекты в массиве, hitTestPoint() (http://www.flasher.ru/forum/showthread.php?t=178004)

Mkey 13.04.2012 01:44

Объекты в массиве, hitTestPoint()
 
Cделано следующие
Этот код в кадре мувиклипа обьекта, с которым сверяется столкновение.
Этих "обджектов" в основном мувиклипе много.
Код AS3:

var vrBox:MovieClip=parent as MovieClip;
vrBox.addObj(this);

Далее
в основном мувиклипе.
Если нажал кнопку Keyboard.Down,сверяем есть ли обьек внизу на координатах x_next,y_next, где
x_next,y_next это координаты,куда будет двигаться объект.
oktake- переменная отвечает за то, можно ли двигать героя в те координаты.
В общем в массиве objects есть 36 элементов, столько же сколько и на экране.
Код AS3:

........
var objects:Array = new Array();
function addObj(obj)
{
    objects.push(obj);
}
///////////////////////////////////
for(var i:int=0;i<objects.length;i++){
                        trace(objects[i]);
                        if(objects[i].hitTestPoint(x_next,y_next,true))
                        {oktake=1;trace("LOL");
                        }.........

В итоге проверка не пашет вообще, столкновение показывает ложь, когда объект уже стоит на этих объектах.
Значения массива
...
[object Breack_3]
[object Breack_3]
[object Breack_3]
[object Breack_3]
...
Я так понимаю это все один и тот же объект? Я не правильно записал в массив? Как быть? Подскажите!

Wolsh 13.04.2012 03:06

Цитата:

Я так понимаю это все один и тот же объект?
Нет, все верно, "Breack_3" это имя класса объекта. Если хотите уточнить экземпляры, надо давать им имя (.name) и трейсить его))
Так по такому коду трудно сказать где ошибка (мой компилятор бы такое сразу выплюнул не прожевав).
Поставьте уже строгий режим компиляции, может и ошибку обнаружите?
Ну и давайте переходите уже на темную сторону, у нас есть Классы и Интерфейсы!

Добавлено через 13 минут
Цитата:

В итоге проверка не пашет вообще, столкновение показывает ложь, когда объект уже стоит на этих объектах.
Ну а точка регистрации объекта точно находится внизу? То есть, (x_next, y_next) действительно пересекается с экземплярами Breack_3, или объект только визуально их перекрывает, а точка регистрации у него в верхнем левом углу и на Breack_3 не попадает? Сделайте трейсы координат экземпляров Breack_3 и точки (x_next, y_next) и сравните, есть ли пересечение на самом деле.

Mkey 13.04.2012 12:07

Так, появились вопросы:
..как дать объектам имена? Использовать какой то счетчик? У меня в массиве вообще что хранится? Адрес к объекту или просто имя.
... Может я не понимаю принципы работы hitTestPoint? Он выдает значение тру, когда указанные координаты принадлежат объекту массива? Разве не так?
P.S. До меня просто не доходит, как упрощают жизнь классы, что в С++, что и в ПХП, тема пройдена но для меня не понятна.
З.ы.ы Может есть какая та другая альтернатива моему способу?

Wolsh 13.04.2012 13:05

Цитата:

Я не правильно записал в массив?
А нам то откуда знать, Вы же не показали код)) То есть функция, которая добавляет некий obj в массив (непонятно зачем отдельная функция с одним действием, ну да ладно, допустим это по совету Боба Мартина))). Но как и где она вызывается, как и где создаются эти кирпичи – нам ведь не показано. Обычно это происходит в каком-то цикле, где создаются новые или перебираются существующие объекты. В каждом витке цикла рассматривается объект, здесь ему можно дать имя, если нужно. Итератор цикла вполне себе счетчик, имя можно задавать как obj.name = "ex_" + i;
В массиве хранятся ссылки на объекты ("адреса", да).
Цитата:

Может я не понимаю принципы работы hitTestPoint? Он выдает значение тру, когда указанные координаты принадлежат объекту массива? Разве не так?
Так. Вопрос только в том, действительно ли ваши координаты принадлежат этим объектам и хитТест врет, или же координаты точки на самом деле мимо. К тому же системы координат могут не совпадать, если ваши кирпичи(?) лежат в отдельном контейнере, а точку Вы задаете в координатах стейджа или другого контейнера.
p.S. Мы не телепаты. Тем более нарисовать во Flash IDE можно такое, что точка регистрации будет за тридевять земель от визуальной формы объекта. Тогда как бы они не пересекались визуально, точка то не будет принадлежать визуальным формам.

Mkey 13.04.2012 17:28

Код AS3:

var objects:Array = new Array();
function addObj(obj)
{
    objects.push(obj);
}

Вот та функция, если присмотреться, то она есть выше.
Структура написания:
Сцена->Level 1(тут функции движения главного объекта, для кого идет проверка, так же заданы функции переменные и прочее)->Блок(Стена)(В нем написана функция var vrBox:MovieClip=parent as MovieClip;
vrBox.addObj(this);
)
Делается все по примерам "Xitri", там правда на АС2, но вот пытаюсь на АС3 перевести.
Ну сейчас все будем проверять

MikroAcse 13.04.2012 17:37

Код AS3:

var objects:Array = [];
function addObj(obj:Object)
{
    objects.push(obj);
}

Код AS3:

trace(objects[0].name);


Mkey 13.04.2012 17:44

%) Все заработало! Трасе рулит блин:)
Одна из координат просто не задавалась, т.е. равна 0, и фсе.
Спасибо за помощь.


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

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