Форум 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=127658)

Zik. 20.07.2009 10:12

Как узнать переменную из другого класса?
 
В общем.
Есть два класса - Root и Block.
В руте я добавляю героя и блоки в список отображения и делаю герою движение.
В блоке я хочу проверять каждый блок на столкновение с героем.
Вот только хочу узнать как правильно брать переменную из другого класса (того же героя).
Раньше статиком пользовался, но понял, что это плохой стиль.
Код:

Код AS3:

package {
        import flash.display.MovieClip;
        import flash.events.KeyboardEvent;
        import flash.ui.Keyboard;
        import flash.events.Event;
 
        public class Root extends MovieClip        {
                var hero:Hero = new Hero(200, 60);
                public var indexBlock:Number = 0;
                public var arrayBlock:Array = [];
                public var speed:int = 5;
                public var powerGravity = 0;
                public var jump:Boolean = false;
                public var powerDown = 0.5;
                public var widthBlock:int = 30;
                public function Root():void {
                        addChild(hero);
                        stage.addEventListener(KeyboardEvent.KEY_DOWN, moveHero);
                        addEventListener(Event.ENTER_FRAME, checkHitTest);
                        addEventListener(Event.ENTER_FRAME, addGravity);
                        createWorld();
                }
                public function createWorld():void {
                        for (var i:int = 0; i < 10; i++) {
                                arrayBlock.push(new Block(widthBlock * i, 300));
                                addChild(arrayBlock[indexBlock]);
                                indexBlock++
                        }
                }
                public function addGravity(e:Event):void {
                        hero.y += powerGravity;
                        powerGravity += powerDown;
                }
                public function moveHero(e:KeyboardEvent):void {
                        if (e.keyCode == Keyboard.SPACE && (!jump)) {
                                jump = true;
                                powerGravity -= 7;
                                hero.y -= 3;
                                addEventListener(Event.ENTER_FRAME, addGravity);
                        }
                        if (e.keyCode == Keyboard.RIGHT) {
                                hero.x += speed;
                        }
                        if (e.keyCode == Keyboard.LEFT) {
                                hero.x -= speed;
                        }
                }
        }
 
}

Код AS3:

package {
        import flash.display.MovieClip;
        import flash.events.Event;
 
        public class Block extends MovieClip {
                public function Block(xPos:Number, yPos:Number):void {
                        this.x = xPos;
                        this.y = yPos;
                }
                public function checkHitTest(e:Event):void {
                        if (hero.hitTestObject(this.wallUp)) {
                                removeEventListener(Event.ENTER_FRAME, addGravity); // как мне здесь вообще удалить листенер из другого класса
                                powerGravity = 0; // как узнать переменную из другого класса
                                hero.y = (this.y - this.height / 2) - (hero.height / 2);
                                jump = false; // и эту тоже как узнать
                        } else {
                                addEventListener(Event.ENTER_FRAME, addGravity); // и это
                                jump = true; // и это
                        }
                        if (hero.hitTestObject(this.wallDown)) {
                                hero.y += 2;
                                powerGravity = 0; // и это
                        }
                        if (hero.hitTestObject(this.wallLeft)) {
                                hero.x = (this.x - (this.width / 2)) - (hero.width / 2);
                        }
                        if (hero.hitTestObject(this.wallRight)) {
                                hero.x = (this.x + (this.width / 2)) + (hero.width / 2);
                        }
                        /* и как вообще узнать героя???*/
                }
        }
 
}


marat_sa 20.07.2009 10:20

Если герой только один - то можешь использовать паттерн Singleton. Экземпляр будет уникален, приватен, и доступ к нему может быть осуществлен через статиковскую функцию... Но у тебя что-то... как-то... по-моему, неправильный подход к организации игры вцелом =)

Psycho Tiger 20.07.2009 10:36

Вроде решили же, что синглтон - антипаттерн.)
Передавай Block`y игрока в конструктор.

Alex Lexcuk 20.07.2009 10:43

>>Вот только хочу узнать как правильно брать переменную из другого класса (того же героя).

А get зачем? тогда.
Код AS3:

public function get position():Point{
    return new Point(hero.x, hero.y);
}


marat_sa 20.07.2009 11:25

> Вроде решили же, что синглтон - антипаттерн.)

О_о Я, смотрю, много пропустил...

switcher! 20.07.2009 11:30

пробовали сохранять this (т.е. ссылку на экземпляр класса Root) в свойстве экземпляра класса Block?
примерно вот так
Код AS3:

...
public class Root extends MovieClip        {
...
arrayBlock.push(new Block(widthBlock * i, 300));
arrayBlock[indexBlock].linkRoot = this;
addChild(arrayBlock[indexBlock]);
...
 
===================
 
//powerGravity = 0; // как узнать переменную из другого класса
this.linkRoot.powerGravity = 0;

как-то так. C той лишь разницей, что и Root, и Block нужно завернуть в интерфейс.
Подробнее об этом можно посмотреть здесь

crazyone 20.07.2009 19:09

Цитата:

> Вроде решили же, что синглтон - антипаттерн.)

О_о Я, смотрю, много пропустил...
Я как-то тоже. А что с синглтоном не так, можно подробнее?

marat_sa 20.07.2009 20:44

Видать объявили лжепаттерном и предали анафеме :D

iflamberg 20.07.2009 21:14

с пендосской википедии
Цитата:

It is also considered an anti-pattern by some people, who feel that it is overused, introducing unnecessary limitations in situations where a sole instance of a class is not actually required, and introduces global state into an application.
Цитата:

It should be noted that this pattern makes unit testing far more difficult[9], as it introduces Global state into an application.

Advocates of Dependency Injection would regard this as an anti pattern, mainly due to its use of private and static methods.

In a nod to the concept of 'Code Smells', this pattern has also been known as the Stinkleton pattern.

ripeLime 20.07.2009 21:27

В мейн классе:
stage.addChild(hero);

А в другом классе героя можно получить: new hero:Hero = stage.getChildAt(1) as Hero;
Конечно это не очень хорошо, т.к если кто-то в мейн классе случайно поменяет местами добавление в список отображение, то это приведёт к не очень приятным последсвиям, поэтому используйте stage.getChildByName().


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

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