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

Fogflasher 10.10.2013 23:41

Недоступность текстфилда в многофреймовом мувиклипе.
 
Вложений: 1
Воссоздаю игру Minesweeper, из книжки Эмануэля Феронато, по наводке KumoKairo.
Код класса Main скопирован из исходника, так что моей ошибки набора здесь нет.

Код использует созданный в библиотеке мувиклип tile_movieclip, пролинкованный галочкой к одноименному классу, который содержит 4 фрэйма.
На каждом фрэйме находится одно из состояний квадратика: неоткрыт, открыт с числом, взрыв, флаг.

Второй фрейм содержит несгруппированный, несимвольный квадрат, поверх которого находится динамический текстфилд:
Вложение 30092

И вот с ним возникает проблема.
В одной из функций основного документ-класса к нему идет обращение вот так:

Код AS3:

 
package
{
        import flash.display.Sprite;
        import flash.events.MouseEvent;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
 
        public class Main extends Sprite
        {
                //...
                private var game_container:Sprite = new Sprite;
                private var tile:tile_movieclip;
                //...
 
                public function Main()
                {
                //...
                }
 
                private function onTileClicked(e:MouseEvent):void
                {
                        if (! gameOver)
                        {
                                var clicked_tile:tile_movieclip = e.currentTarget as tile_movieclip;
 
                                //...
                                                if (clickedValue > 0 && clickedValue < 9)
                                                {
                                                        clicked_tile.gotoAndStop(2);
                                                        clicked_tile.tile_text.text = clickedValue.toString();
                                                }
                                //...
                        }
                }
    }
}

То есть через конструкцию
Код AS3:

clicked_tile.tile_text.text

Запуск проекта проходит без ошибок.
Но когда я нажимаю мышкой на квадратик такого типа, то это приводит к ошибке:
Цитата:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Main/::onTileClicked()
Если протрейсить вот так:
Код AS3:

trace("clicked_tile.tile_text == ", clicked_tile.tile_text)

То получим:
Цитата:

clicked_tile.tile_text == null
То есть, по каким-то причинам, этот текстфилд равен нулл? Но почему?
Или может быть, тут есть некий трюк, не работающий для версии Flash CS3.

in4core 11.10.2013 01:05

Естественно. Если вы находитесь на 1ом кадре, и пыьтаетесь что то сделать с текстом - которого там нет, он есть только на втором, то вот и обшибка. Сначала надо перейти на второй, принудительно - gotoAndStop(2)

dimarik 11.10.2013 01:15

Цитата:

private var tile:tile_movieclip;
Советую бежать от таких "аффторов".

Fogflasher 11.10.2013 09:10

in4core, ну так а разве это:

Код AS3:

clicked_tile.gotoAndStop(2);

Не оно?

dimarik, но почему?

КорДум 11.10.2013 11:14

Вы дали команду перейти на N-ый кадр, но не дожидаетесь перехода. Реально все произойдет в следующем кадре, поэтому нужно подписаться на событие enterFrame, в обработчике тут же отписаться и обратиться к этому текстфилду.

Fogflasher 11.10.2013 13:20

КорДум, благодарю за идею, несколько позже проверю.

Добавлено через 9 часов 30 минут
Насколько я понял, нужно было сделать так:

Код AS3:

 
        //...
        if (clickedValue > 0 && clickedValue<9)
                {
                        clicked_tile.gotoAndStop(2);
                        clicked_tile.addEventListener(Event.ENTER_FRAME, readText);
                        //...
 
                }
 
                private function readText(e:Event)
                {
                        trace("ENTERFRAME!");
                        trace("e.currentTarget == ", e.currentTarget, " name = ", e.currentTarget.name );
                        trace("e.target == ", e.target, " name = ", e.target.name);
                        trace("e.currentTarget.currentFrame == ", e.currentTarget.currentFrame);
 
                        e.currentTarget.removeEventListener(Event.ENTER_FRAME, readText);
                        e.currentTarget.tile_text.text = "3!";
                }

Однако, результат тот же, в окне Output видим следующее:
Цитата:

ENTERFRAME!
e.currentTarget == [object tile_movieclip] name = instance66
e.target == [object tile_movieclip] name = instance66
e.currentTarget.currentFrame == 2
TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Main/::readText()
И вот судя по последнему трэйсу мы в правильном фрейме, а текст не виден, странно.

Котяра 12.10.2013 12:27

Дайте ссылку на оригинальню книжку, но уже по фрагментам видно, что там что-то феерическое написано.
Хотя Феронато иногда что-то даже нормальное писал.

Fogflasher 12.10.2013 15:36

Котяра, Flash Game Development by Example


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

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