Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   не работает Instance name (http://www.flasher.ru/forum/showthread.php?t=192653)

In8Finity 17.01.2013 16:10

не работает Instance name
 
Здраствуйте. Пишу арканоид.
В главном классе добавляется класс ракетки и класс шарика.

Код AS3:

private var _platform:Platform;
                private var _ball:Ball;
                ....
                _platform = new Platform();
                addChild (_platform);
                _ball = new Ball();
                _ball.setPlatform(_platform);
                addChild (_ball);

В классе шарика Ball.as

Код AS3:

                private var platform:Platform;
                ....
                public function setPlatform(platformObj:Platform):void
                {
                        platform = platformObj;
                }
                ....
                // Столкновение с platform
                if (platform.hitTestPoint(ball.x, ball.y, true))
                {
                        speedY = -3;
                }

Всё это прекрасно работает.
Но вот я захотел сделать несколько областей в платформе, чтобы отскоки были разными в зависимости от попадания на область.
Встроил в муви-клип Platform несколько областей-маячков hit_place. Проименовал их в instance name hit1, hit2, hit3
И попробовал сделать так:
Код AS3:

if (platform.hit1.hitTestPoint(ball.x, ball.y, true))

но ту-же получил ошибку:
Error: Access of possibly undefined property hit1 through a reference with static type Platform.
Подскажите, как это побороть?

iflamberg 17.01.2013 16:28

Какой класс наследует Platform?
В принципе, можно написать вот так:
Код AS3:

if (platform["hit1"]hitTestPoint(ball.x, ball.y, true))

Если вы уверены, что Hit1 там точно есть, но это немного быдлокод =)

In8Finity 17.01.2013 17:20

Наследовал Sprite
Поправил на
Код AS3:

public class Platform extends MovieClip

но не помогло.
Вот так тоже не получилось
Код AS3:

if (platform["hit1"].hitTestPoint(ball.x, ball.y, true))

Пишет: Не удалось найти свойство hit1 в Platform; отсутствует значение по умолчанию.
Хотя десять раз перепроверил. "hit1" на месте

iflamberg 17.01.2013 17:30

Не понимаю, как у тебя Platform может наследовать MovieClip или Sprite, если ты говоришь: "Встроил в муви-клип Platform несколько областей-маячков hit_place. Проименовал их в instance name hit1, hit2, hit3". Ведь тогда у тебя Platform должен наследовать вот тот самый муви-клип куда ты встроил hit1 и т.д.

А, стоп. Ты не в FlashDevelop работаешь, не используешь swc с библиотекой символов. Хм.. но тогда должно все работать. Ну а вот так trace (platform.getChildByName("hit1")) что выведет?

In8Finity 17.01.2013 17:38

Выводит null.
Я, возможно, немного запутался.
Использую FlashDevelop. С swc для графики из Flash IDE.
Во Flash IDE в библиотеке я создал мувиклип platform. AS Linkage называется Platform_mc.
Внутри этого мувиклипа, помимо картинки самой ракетки - несколько мувиклипов hit_place, названные в instance name hit1, hit2 итд.

iflamberg 17.01.2013 17:41

Так. Если ты используешь FlashDevelop и подключаешь библиотеку символов с помощью swc, ио откуда в Platform extends MovieClip берется графика из символа Platform_mc?

In8Finity 17.01.2013 17:49

Хороший вопрос.
Я размышлял так.
Я в самом начале в главном классе пишу
Код AS3:

_platform = new Platform();
addChild (_platform);

После этого, значит, у меня начинает выполнятся код класса Platform.
(извиняюсь что я так криво пишу. я с этими классами только пытаюсь разобраться)
Так вот. И в классе Platform у меня есть такое:
Код AS3:

                private function createPlatform():void
                {
                        platform =  new Platform_mc();
                        addChild(platform);
                        platform.x = 300;
                        platform.y = 445;
                }

И после этого, полагал я - всё, что внутри этого Platform_mc есть - вместе с подклипами hit1, hit2... - всё это должно подгрузиться. Разве нет?

iflamberg 17.01.2013 18:02

Не так. Есть два основных способа использовать символы из swc в FD.
Метод 1.
Код AS3:

package {
  public class Platform extends Platfrom_mc {
  }
}

Мувик с кодом Platfrom наследует напрямую Platform_mc из swc бибилотеки. Все именнованные символы из Platform_mc доступны напрямую.
Код AS3:

var p:Platform = new Platform ();
trace (p.hit1);

Метод 2.
Код AS1/AS2:

package {
  public class Platfrom extends Sprite {
    public var mc:MovieClip;
    function Platfrom(){
      mc = new Platfrom_mc();
      addChild(mc);
    }
  }
}

В данном случае "пустой" спрайт Platfrom добавляет в себя мувик Platfrom_mc. Соответсвенно все именнованные мувики из Platform_mc находятся в:
Код AS3:

var p:Platfrom = new Platform();
trace (p.mc.hit1);

У тебя судя по всему, что-то типа второго метода. Но только platform_mc ты держишь в _platfrom, что, судя по "_" - приватное свойство, и другие объекты к нему доступа не имеют.

In8Finity 17.01.2013 18:22

Всё. Понял. Заработало. Спасибо огромное!


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

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