Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Взаимодействие кнопки и файла swf (http://www.flasher.ru/forum/showthread.php?t=201086)

Vladimir991 11.06.2013 09:16

Взаимодействие кнопки и файла swf
 
Вложений: 1
Здравствуйте! Подскажите как реализовать взаимодействие кнопки и игры в формате swf? Создал кнопку, в первом кадре слоя as пишу код:
Код AS3:

btn.buttonMode = true;
btn.addEventListener(MouseEvent.CLICK, btnClicked);
 
function btnClicked(e:MouseEvent):void
{
 var swfRequest:URLRequest = new URLRequest("saper.swf");
 var swfLoader:Loader = new Loader();
 swfLoader.load(swfRequest);
 
 addChild(swfLoader);
 swfLoader.x = stage.stageWidth - 550;
 swfLoader.y = 0;
}

Пишет ошибку: TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at Main()
Направьте на путь пожалуйста.

Vladimir991 11.06.2013 09:55

Причем самое интересное в том, что вставляю любой другой файл swf и код работает как нужно.

caseyryan 11.06.2013 10:21

Скорее всего в этом файле saper.swf в конструкторе класса Main идет обращение к stage. А ее еще нет на стадии инициализации. Отсюда и ссылка на объект null.
Надо в том файле добавить в конструктор такой код:
Код AS3:

// эти 2 строки в конструктор
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
 
// ну и создать обработчик события
private function init(e:Event = null):void {
    removeEventListener(Event.ADDED_TO_STAGE, init);
    // а тут уже можно смело обращаться к stage
}


Vladimir991 11.06.2013 10:45

Вложений: 1
Цитата:

Сообщение от caseyryan (Сообщение 1137542)
Скорее всего в этом файле saper.swf в конструкторе класса Main идет обращение к stage. А ее еще нет на стадии инициализации. Отсюда и ссылка на объект null.
Надо в том файле добавить в конструктор такой код:
Код AS3:

// эти 2 строки в конструктор
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
 
// ну и создать обработчик события
private function init(e:Event = null):void {
    removeEventListener(Event.ADDED_TO_STAGE, init);
    // а тут уже можно смело обращаться к stage
}


Вы не могли бы мне помочь. Вот класс main:

belv 11.06.2013 10:48

По-моему вот этот код вызывает ошибку
addChild(swfLoader);
swfLoader.x = stage.stageWidth - 550;
swfLoader.y = 0;
Нужно добавить слушатель события на окончание загрузки Event.COMPLETE , а потом в приемнике писать этот код.

Vladimir991 11.06.2013 10:52

Помогите пожалуйста решить эту проблему. Отблагодарю перечислением на вебмани. Вопрос жизни и смерти.

caseyryan 11.06.2013 19:36

Переделал:
Код AS3:

package 
{
        // импортируем классы
        import flash.display.Sprite;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.events.TimerEvent;
        import flash.utils.Timer;
        // конец импорта классов
        public class Main extends Sprite
        {
                // переменные класса
                private const FIELD_W:uint = 9;
                private const FIELD_H:uint = 9;
                private const NUM_MINES:uint = 10;
                private var mineField:Array = new Array();
                private var game_container:Sprite = new Sprite();
                private var tile:tile_movieclip;
                private var timer:Timer = new Timer(1000);
                private var toolbar:toolbar_mc;
                private var gameOver:Boolean = false;
                private var firstClick:Boolean = true;
                // конец записи переменных класса
                public function Main()
                {
                        if (stage) init();
                        else addEventListener(Event.ADDED_TO_STAGE, init);
                }
 
                private function init(e:Event = null):void {
                        removeEventListener(Event.ADDED_TO_STAGE, init);
                        // создаем минное поле
                        for (var i:uint = 0; i < FIELD_H; i++)
                        {
                                mineField[i] = new Array();
                                for (var j:uint = 0; j < FIELD_W; j++)
                                {
                                        mineField[i].push(0);
                                }
                        }
                        // конец создания минного поля
                        // создание плиток
                        addChild(game_container);
                        for (i = 0; i < FIELD_H; i++)
                        {
                                for (j = 0; j < FIELD_W; j++)
                                {
                                        tile = new tile_movieclip();
                                        game_container.addChild(tile);
                                        tile.gotoAndStop(1);
                                        tile.nrow = i;
                                        tile.ncol = j;
                                        tile.buttonMode = true;
                                        tile.x = 140 + tile.width * j;
                                        tile.y = 65 + tile.height * i;
                                        tile.addEventListener(MouseEvent.CLICK, onTileClicked);
                                }
                        }
                        // конец создания плиток
                        // управление временем и конец игры
                        toolbar = new toolbar_mc();
                        addChild(toolbar);
                        toolbar.y = stage.stageHeight - toolbar.height;
                        timer.start();
                        timer.addEventListener(TimerEvent.TIMER, onTick);
                        // конец управления временем и окончания игры
                }
                private function tileValue(row,col:uint):int
                {
                        if (mineField[row] == undefined || mineField[row][col] == undefined)
                        {
                                return -1;
                        }
                        else
                        {
                                return mineField[row][col];
                        }
                }
                private function onTileClicked(e:MouseEvent):void
                {
                        if (!gameOver)
                        {
                                var clicked_tile:tile_movieclip = e.currentTarget as tile_movieclip;
                                var clickedRow:uint = clicked_tile.nrow;
                                var clickedCol:uint = clicked_tile.ncol;
                                if (firstClick)
                                {
                                        firstClick = false;
                                        // минируем поле
                                        var placedMines:uint = 0;
                                        var randomRow,randomCol:uint;
                                        while (placedMines < NUM_MINES)
                                        {
                                                randomRow = Math.floor(Math.random() * FIELD_H);
                                                randomCol = Math.floor(Math.random() * FIELD_W);
                                                if (mineField[randomRow][randomCol] == 0)
                                                {
                                                        if (randomRow != clickedRow || randomCol != clickedCol)
                                                        {
                                                                mineField[randomRow][randomCol] = 9;
                                                                placedMines++;
                                                        }
                                                }
                                        }
                                        // конец минирования поля
                                        // помещаем цифры
                                        for (var i = 0; i < FIELD_H; i++)
                                        {
                                                for (var j = 0; j < FIELD_W; j++)
                                                {
                                                        if (mineField[i][j] == 9)
                                                        {
                                                                for (var ii:int = -1; ii <= 1; ii++)
                                                                {
                                                                        for (var jj:int =- 1; jj <= 1; jj++)
                                                                        {
                                                                                if (ii != 0 || jj != 0)
                                                                                {
                                                                                        if (tileValue(i+ii,j+jj) != 9 && tileValue(i+ii,j+jj) != -1)
                                                                                        {
                                                                                                mineField[i + ii][j + jj]++;
                                                                                        }
                                                                                }
                                                                        }
                                                                }
                                                        }
                                                }
                                        }
                                        var debugString:String;
 
                                        for (i = 0; i < FIELD_H; i++)
                                        {
                                                debugString = "";
                                                for (j = 0; j < FIELD_W; j++)
                                                {
                                                        debugString +=  mineField[i][j] + " ";
                                                }
                                                trace(debugString);
                                        }
                                        // конец помещения цифр
                                }
                                var clickedValue:uint = mineField[clickedRow][clickedCol];
                                if (e.shiftKey)
                                {
                                        clicked_tile.gotoAndStop(5 - clicked_tile.currentFrame);
                                }
                                else
                                {
                                        if (clicked_tile.currentFrame == 1)
                                        {
                                                clicked_tile.removeEventListener(MouseEvent.CLICK, onTileClicked);
                                                clicked_tile.buttonMode = false;
                                                // пустая плитка
                                                if (clickedValue == 0)
                                                {
                                                        floodFill(clickedRow, clickedCol);
                                                }
                                                // конец пустой плитки
                                                // плитка с цифрой
                                                if (clickedValue > 0 && clickedValue < 9)
                                                {
                                                        clicked_tile.gotoAndStop(2);
                                                        clicked_tile.tile_text.text = clickedValue.toString();
                                                }
                                                // конец плитки с цифрой
                                                // мина
                                                if (clickedValue == 9)
                                                {
                                                        clicked_tile.gotoAndStop(3);
                                                        timer.removeEventListener(TimerEvent.TIMER, onTick);
                                                        toolbar.message_text.text = "Вы подорвались на мине!";
                                                        gameOver = true;
                                                }
                                                // конец мины ;
                                        }
                                }
                        }
                }
                private function onTick(e:TimerEvent):void
                {
                        toolbar.message_text.text = "Время игры: " + e.target.currentCount + " сек.";
                }
                private function floodFill(row,col:uint):void
                {
                        var emptyTile:tile_movieclip;
                        emptyTile = game_container.getChildAt(row * FIELD_W + col) as
                        tile_movieclip;
                        if (emptyTile.currentFrame == 1)
                        {
                                emptyTile.removeEventListener(MouseEvent.CLICK, onTileClicked);
                                emptyTile.buttonMode = false;
                                emptyTile.gotoAndStop(2);
                                if (mineField[row][col] > 0)
                                {
                                        emptyTile.tile_text.text = mineField[row][col].toString();
                                }
                                else
                                {
                                        emptyTile.tile_text.text = "";
                                }
                                if (mineField[row][col] == 0)
                                {
                                        for (var ii:int = -1; ii <= 1; ii++)
                                        {
                                                for (var jj:int = -1; jj <= 1; jj++)
                                                {
                                                        if (ii != 0 || jj != 0)
                                                        {
                                                                if (tileValue(row + ii, col + jj) != 9)
                                                                {
                                                                        if (tileValue(row + ii, col + jj) != -1)
                                                                        {
                                                                                floodFill(row + ii, col + jj);
                                                                        }
                                                                }
                                                        }
                                                }
                                        }
                                }
                        }
                }
        }
}

проблему и вызывала эта строка:
Код AS3:

toolbar.y = stage.stageHeight - toolbar.height;

в конструкторе здесь в stage обращаться нельзя

п.с. никаких вебмани не надо. Форум на то и создан, чтобы помогать просто так.

belv 11.06.2013 22:05

caseyrya
А чем декомпилировали saper.swf ?
Или после , декомпиляции переписали класс ?

caseyryan 11.06.2013 22:22

Я ничего не декомпилировал. ТС же выложил исходник.

belv 11.06.2013 22:27

Я понял , просто прозевал его, вы 100 % правы .


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

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