Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   видимость объектов сцены классами (http://www.flasher.ru/forum/showthread.php?t=182658)

pall92 30.07.2012 19:46

видимость объектов сцены классами
 
добрый день, очень надеюсь на вашу помощь.

Ситуация следующая: есть два класса Unit и Floor. каждый объект класса Floor добавляется конструтктором в статический массив этого класса.

Объект класса Unit каждый кадр обращается к функции класса Floor, которая пебирает все экзэмпляры Floor и проверяет пересекаются ли они одним из своих подобъектов(вложенные мувики) с объектом вызвавшим функцию(экземпляром Unit-а). все работало превосходно, но затем мне понадобилось добавить все объекты со сцены(экземпляры Unit и Floor) в отдельный муви клип.(map_mc предположим). после чего появилось обилие проблем с координатами( хотя поидеи я предусмотрел смещение сетки координат) и более того методы hitTestObject и hitTestPoint перестали работать.


приведу сокращенный код, думаю его хватит. если понадобится кину исхожник.

класс Unit
Код AS3:

package script_files
{
        import flash.display.MovieClip;
        import flash.events.Event;
        import flash.ui.Mouse;
        import flash.events.MouseEvent;
        import flash.display.Stage;
 
        public class Unit extends MovieClip
        {
 
 
//CONSTRUTOR               
                public function Unit()
                {
 
                        addEventListener(Event.ENTER_FRAME, Behavior);
 
                                // constructor code
                }
 
 
//BEHAVIOR main function, enter frame
                private function Behavior(e:Event):void
                {       
                        this.x += speed_x;
                        this.y += speed_y;
 
                        Floor.collision(this);
                }
}
}

класс Floor
Код AS3:

package script_files {
        import flash.display.MovieClip;
 
        public class Floor extends MovieClip
        {
 
 
                private static var FloorArr:Array = new Array();//статический массив флор
                public function Floor()
                {
                        Floor.FloorArr.push(this);//добавляем в массив каждый экземпляр
                        // constructor code
                }
                public static function collision(object:MovieClip)
                {
 
                        for(var i=0;i< FloorArr.length; i++)//перебираем все экземпляры
                        {
                                //перебираем все подобъекты [i]-экземпляра
                                if( FloorArr[i].collider_up.hitTestPoint(object.x,object.y) && object.speed_y > 0)
                                {       
 
                                        //действия
 
 
                                }
                                if( FloorArr[i].collider_down.hitTestPoint(object.x,object.y - object.height) && object.speed_y < 0)
                                {
 
 
                                                                        }
                                if( FloorArr[i].collider_left.hitTestObject(object) && object.speed_x > 0)
                                {
 
                                }
                                if( FloorArr[i].collider_right.hitTestObject(object) && object.speed_x < 0)
                                {
 
                                }
                        }
 
 
 
                }
 
        }
 
}


Isfet 31.07.2012 14:35

координаты всех объектов, добавленных в мувиклип теперь будут такие : map_mc.x+object.x, это чтобы привести их к глобальным.
Вообще правильно изначально привязывать координаты объекта не к координатам Stage, а к координатам класса (наследованного от спрайта или мувиклипа), в котором находятся все объекты, чтобы координаты были относительными.

pall92 31.07.2012 18:08

поясните про координаты класса пожалуйста..
и да.. как из класса в обратиться к map_mc, если класс находится в отдельном пакете? я немного запутался с этим. нужно импортировать какойто класс?

Isfet 31.07.2012 19:49

вы нарисовали экземпляр класса мувиклип вручную, дали ему имя map_mc.
а нужно в его свойствах прописать чтобы он наследовался не от мувиклипа, а от класса ,допустим, Map.
далее создаете класс Map.as
после этого все что вы пропишете в классе Map будет "влиять" на map_mc
допустим чтобы переместить map_mc на координаты (100,100) в конструкторе класса map
пишите this.x = 100;this.y = 100;
тоесть когда будет создаваться map_mc он будет брать все параметры из класса Map

pall92 31.07.2012 20:40

я наверно немного не правильно пояснил, не знаю.. или я не понимаю... дело не в координатах совсем. хотя спасибо за разъяснения - это может частично помочь) я не пойму как сделать вновь рабочим метод hitTest. странно, он должен был бы хотя бы выводить ошибку, что не находит какой-то из объектов. но нет. он считает что они не пересекаются. хотя оба объекта находятся в map_mc, визуально пересекаются, и оба находятся в приделах видимости метода.

gagaga 01.08.2012 01:16

использвание hittest - первый признак *****кода... по делу: вы зря тратите время. Лучше учитесь программировать, возложите всю математику и координатный гемор на готовый движок (например flashpunk). Я вам по личному опыту говорю, первые 2-3 проекта - в мусорную корзину, лучше сосрдоточтесь на архитектуре

Isfet 01.08.2012 04:45

мой совет такой, скачайте несколько исходников, и разберитесь как в них расположены классы, как что наследовать, что в чем размещать,как должны взаимодействовать классы, и почитайте побольше про ООП.

pall92 01.08.2012 07:32

это все конечно замечательно, и без сомнения справедливо. но я учусь в том числе и на практике. и у меня возник вполне конкретный вопрос. советов я вроде как не спрашивал.)

Добавлено через 19 минут
а за совет движка спасибо) хотя проблема все равно не решилась ибо дело не в физике.


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

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