Ошибка типа: Ошибка № 1009 в ActionScript 3 - PullRequest
0 голосов
/ 29 августа 2011

Я разрабатываю Пазл во Flash.Я разрабатываю класс для головоломки.Код класса PuzzlePiece приведен ниже.

package 
{
import flash.display.MovieClip;
import flash.events.MouseEvent;

public class PuzzlePiece extends MovieClip
{

    private var pieceX:Number;
    private var pieceY:Number;

    private var pieceXRandom:Number;
    private var pieceYRandom:Number;


    public function PuzzlePiece(pieceXRandom:Number,pieceYRandom:Number)
    {
        this.pieceXRandom = pieceXRandom;
        this.pieceYRandom = pieceYRandom;
        this.addEventListener(MouseEvent.MOUSE_DOWN,Drag);

        positionClips();
        this.gotoAndStop(2);

        this.holder_mc.width = this.holder_mc.height = 60;
        this.mask1_mc.width = this.mask2_mc.width = 60;
        this.mask1_mc.height = this.mask2_mc.height = 60;

    }

    private function positionClips():void
    {
        this.x = pieceXRandom;
        this.y = pieceYRandom;
    }

    private function Drag(e:MouseEvent)
    {
        switch (e.type)
        {
            case 'mouseDown' :
                this.startDrag();
                this.addEventListener(MouseEvent.MOUSE_UP,Drag);
                break;

            case 'mouseUp' :
                this.stopDrag();
                this.removeEventListener(MouseEvent.MOUSE_UP,Drag);
                /*var m:*=this.parent;
                m.pos(this.x,this.y);*/

        }

    }
}
}

Это код на основной временной шкале.

//Global variables//
var imageDimension:Number = 360;
var gridType:Number = 6;
var puzzlePieceShape:String = "Sqaure";
var imageLoader:Loader = new Loader();
var bitmapArray:Array = [];
var puzzlePiece:PuzzlePiece;

var bitmapManip:BitmapManipulation;

loadImage();

function loadImage()
{
    imageLoader.load(new URLRequest("Mohanlal.jpg"));//The image being loaded is of 360*360
    imageHolder_mc.addChild(imageLoader);//imageHolder_mc is an empty MovieClip on stage
    imageHolder_mc.visible = false;
    imageLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, layoutPieces);
}

function layoutPieces(evt:Event)
{
    bitmapManip = new BitmapManipulation(imageDimension,gridType);
    bitmapArray = bitmapManip.getBitmapImagePieces(imageHolder_mc);

    for (var j:uint =0; j<bitmapArray.length; j++)
    {

        for (var k:uint=0; k<bitmapArray[j].length; k++)
        {

            var bitmap:Bitmap = new Bitmap(bitmapArray[j][k]);
            puzzlePiece = new PuzzlePiece(400 * Math.random(),400 * Math.random());
            addChild(puzzlePiece);
            puzzlePiece.holder_mc.addChild(bitmap);

        }
    }
}

Класс управления растровым изображением

package 
{
    import flash.display.MovieClip;
    import flash.display.BitmapData;
    import flash.geom.Point;
    import flash.geom.Rectangle;

    public class BitmapManipulation extends MovieClip
        {
            private var imageDimension:Number;
            private var gridDimension:Number;

            public function BitmapManipulation(imageDimension:Number,gridDimension:Number)
            {
                this.imageDimension = imageDimension;
                this.gridDimension = gridDimension;

            }

            public function getBitmapImagePieces(imageMC:MovieClip):Array
            {
                var bitmapArray:Array = [];
                var imageBitmapData:BitmapData = new BitmapData(imageMC.width,imageMC.height);
                imageBitmapData.draw(imageMC);
                var tileDimesion:Number = this.imageDimension / this.gridDimension;

                for (var i:uint = 0; i<this.gridDimension; i++)
                {
                    bitmapArray[i] = new Array();

                    for (var j:uint = 0; j<this.gridDimension; j++)
                    {

                        var tempData:BitmapData = new BitmapData(tileDimesion,tileDimesion);
                        var tempRect:Rectangle = new Rectangle(((tileDimesion) * i),((tileDimesion) * j),tileDimesion,tileDimesion);
                        tempData.copyPixels(imageBitmapData,tempRect,new Point(0,0));
                        bitmapArray[i][j] = tempData;

                    }
                }

                return(bitmapArray);

            }
        }
    }

Видеоклип фрагмента головоломки имеет два слоя

Mask Layer - Two masks. One rectangular and one triangular in frame 1 and 2.
Holder Layer - holder_mc

Я пытаюсь установить размер фрагментов ролика внутри фрагмента головоломки с помощьюкод в классе PuzzlePiece.

Но я получаю эту ошибку.

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at PuzzlePiece()[C:\Users\Shabeeb\Desktop\Puzzle OOP\PuzzlePiece.as:26]
    at PuzzlePiece_fla::MainTimeline/layoutPieces()[PuzzlePiece_fla.MainTimeline::frame1:33]

Line number 33 in main timeline class calls 

this.holder_mc.width = this.holder_mc.height = 60;
this.mask1_mc.width = this.mask2_mc.width = 60;
this.mask1_mc.height = this.mask2_mc.height = 60;

Неправильно ли так получить к нему доступ.PuzzlePiece - экспорт для клипа головоломки.

В настоящее время я жестко кодирую размерность как 60. Я также загрузил fla и в виде файлов.

https://rapidshare.com/files/4248268633/Puzzle_OOP.zip

Ответы [ 2 ]

1 голос
/ 31 августа 2011

Это может пролить вам некоторое понимание того, что происходит http://www.developria.com/2010/04/combining-the-timeline-with-oo.html. (В двух словах, вы не можете получить доступ к объектам, которые объявлены на временной шкале, пока Flash Player не создаст их.)

Обратите внимание, что я бы не советовал использовать рамочные сценарии, которые делают что-то более сложное, чем stop (), особенно если вы также собираетесь использовать классы документов.

0 голосов
/ 29 августа 2011

Спасибо за этот вопрос Кадьяк, ты привел меня к ответу.Я преодолел проблему.Я добавил следующее в PuzzlePiece.Я вижу, что mask2_mc не существует до кадра 2.

this.gotoAndStop(1);
this.holder_mc.width = this.holder_mc.height = 60;
this.mask1_mc.width = 60;
this.mask1_mc.height = 60;
this.gotoAndStop(2);
this.mask2_mc.width = 60;
this.mask2_mc.height = 60

Но у меня сейчас новая проблема.

Мне нужно выбрать маску в кадре 1. Я написал такую ​​функцию в PuzzlePiece

public function selectFrame(frameNo:uint) {
this.gotoAndStop(frameNo);
}

Я вызвал функцию из fla с помощью добавления строки this после addChild

puzzlePiece.selectFrame(1);

Когда я тестирую, я не получаю сообщение об ошибке, но я не вижу изображения, загруженные как растровые изображения, и, возможно, мерцающие кусочки головоломки, вероятно, из-за многократного перехода с 1 на 2.

Как мневыберите маску в кадре 1.

Примечание: - В действительности у меня может быть любое количество масок на временной шкале, и я должен иметь возможность выбрать ее из флага.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...