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

St.Anger 21.12.2011 20:06

Обратится из класса к объекту на сцене
 
Здравствуйте! есть класс для героя, и обьект "pl" который находится на сцене.

При выполнении выводит ошибку

d.as, Line 85 1120: Обращение к несуществующего свойства pl.

подскажите пожалуйста как можно решить эту задачу
вот собственно сам код:

Код AS3:

package hero{
        import flash.display.*;
        import flash.events.*;
        public class d extends MovieClip {
 
                var nywton=10;
                var grav:Number=5;
                var jumping:Boolean=false;
                var jumpPow:Number=0;
 
                public function d() {
                        stage.addEventListener(KeyboardEvent.KEY_DOWN,okd);
                        stage.addEventListener(Event.ENTER_FRAME,oef);
                }
 
                public function okd(evt:KeyboardEvent):void {
                        if (evt.keyCode==38) {
                                if (jumping!=true) {
                                        jumpPow=-50;
                                        jumping=true;
                                }
                        }
                }
                public function oef(evt:Event):void {
                        if (jumping) {
                                this.y+=jumpPow;
                                jumpPow+=grav;
                                if (this.hitTestObject(pl)) {
                                        jumping=false;
                                }
                        }
                        if (!(this.hitTestObject(pl)) && !(jumping)) {
                                this.y+=nywton;
                        }
                }
        }
}


dimarik 21.12.2011 20:23

Ссылку на "объект pl" еще нужно получить. "pl", по всей видимости, есть значение поля "name" у какого-то визуального объекта, брошенного на timeline во время редактирования. Вы бы сначала получили бы ссылку на него

Код AS3:

private const _plObject:DisplayObject = super.getChildByName('pl');

а потом бы можно и обратиться
Код AS3:

super.hitTestObject(_plObject);


St.Anger 22.12.2011 00:21

Простите за нубский вопрос, но правильно лия использовал ваш совет?
Код AS3:

package hero{
        import flash.display.*;
        import flash.events.*;
        public class d extends MovieClip {
                private const _plObject:DisplayObject=super.getChildByName('pl');
                var nywton=10;
                var grav:Number=5;
                var jumping:Boolean=false;
                var jumpPow:Number=0;
 
                public function d() {
                        stage.addEventListener(KeyboardEvent.KEY_DOWN,okd);
                        stage.addEventListener(Event.ENTER_FRAME,oef);
                        super.hitTestObject(_plObject);
                }
 
                public function okd(evt:KeyboardEvent):void {
 
                        if (evt.keyCode==38) {
                                if (jumping!=true) {
                                        jumpPow=-50;
                                        jumping=true;
                                }
                        }
                }
 
                public function oef(evt:Event):void {
                        if (jumping) {
                                this.y+=jumpPow;
                                jumpPow+=grav;
                                if (this.hitTestObject(_plObject)) {
                                        jumping=false;
                                }
                        }
                        if (!(this.hitTestObject(_plObject)) && !(jumping)) {
                                this.y+=nywton;
                        }
                }
        }
}

при этом trace выдаёт:
TypeError: Error #2007: Параметр hitTestObject не должен быть равен нулю.

MAPUTO 22.12.2011 02:12

Если пытаться из описания класса обращаться к копиям объектов по их именам - всегда будут ошибки. Нужно проверить "pl" - это инстанс нейм или что?

Я в подобном случае делал немного иначе.
В классе Main создал два контейнера для двух типов объектов (у меня их было много)
Перебирая все объекты в этих контейнерах - делается проверка на хиттест.
Найдя нужный объект - достаточно сделать на него ссылку (см. var someOBJ=BULET.getChildAt(k); someOBJ.life=0; ) и можно обращаться к его свойствам.

Код AS3:

package {
        import flash.display.*;
        import flash.events.*;
 
        public class Main extends MovieClip {
                var i;
                var k;
                var ENEMY:Sprite = new Sprite();
                var BULET:Sprite = new Sprite();
                var en01 = new enemyX();
                var en02 = new enemyX();
                var en03 = new enemyX();
 
 
                public function Main() {
                        addChild(ENEMY);
                        addChild(BULET);
                        //ENEMY******************
                        this.en01.x=200;
                        this.en01.y=200;
                        ENEMY.addChild(en01);
                        this.en02.x=600;
                        this.en02.y=100;
                        ENEMY.addChild(en02);
                        this.en03.x=300;
                        this.en03.y=400;
                        ENEMY.addChild(en03);
                        //ENEMY******************
 
                        addEventListener(Event.ENTER_FRAME, B_E);
                }
 
                public function B_E(e) {
                        for (i=0; i<ENEMY.numChildren; i++) {
                                for (k=0; k<BULET.numChildren; k++) {
                                        if (ENEMY.getChildAt(i).hitTestObject(BULET.getChildAt(k))) {
                                                var someOBJ=BULET.getChildAt(k);
                                                someOBJ.life=0;
                                        }
                                }
                        }
                }
        }
}


St.Anger 22.12.2011 16:31

MAPUTO Спасибо разобрался!


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

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