2011-08-29 7 views
-1

플래시에서 지그 소 퍼즐을 개발 중입니다. 나는 퍼즐 조각을위한 수업을 개발 중이다. PuzzlePiece 클래스의 코드는 다음과 같습니다.TypeError : Actionscript 3의 오류 # 1009

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); 

      } 
     } 
    } 

puzzlepiece 동영상 클립 내가 PuzzlePiece 클래스의 코드를 사용하여 퍼즐 조각 내부의 동영상 클립의 크기를 설정하려고 두 개의 층

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

있습니다.

하지만이 오류가 발생합니다.

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으로 하드 코딩하고 있습니다. flos 및 파일을 aloso로 업로드했습니다.

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

+0

마스크가 모두 프레임 1에 있습니까? – Kodiak

+0

번호 holder_mc 및 mask1_mc는 프레임 1에 있습니다. mask2_mc는 frame2에 있습니다. –

+0

은 같은 질문을 다른 포럼에 게시했습니다. 이것은 그곳에서 일어난 토론입니다. http://www.kirupa.com/forum/showthread.php?367987- 설정 - 중첩 - 연결된 - 문서 - 클래스 - 부모 - 부모 - –

답변

1

이 내용은 http://www.developria.com/2010/04/combining-the-timeline-with-oo.html에서 일어나는 일에 대해 통찰력을 줄 수 있습니다. (간단히 말해서, Flash Player가 실제로 타임 라인에 선언 한 객체에 액세스 할 수 없습니다.

정지보다 복잡한 작업을 수행하는 프레임 스크립트는 사용하지 않는 것이 좋습니다.) 특히 문서 클래스를 사용하려는 경우에 특히 유용합니다.

0

덕분에 그 질문에 대한 코디 악 당신은 대답에 저를지도했다. 나는 그 문제를 극복했다. 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 

하지만 지금 새로운 문제가 있습니다.

나는 내가 줄을 추가하여 내가 가진 FLA에서 함수를 호출

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

PuzzlePiece

이 같은 기능을 쓴 프레임 1. 마스크를 선택해야이 후하는 AddChild

puzzlePiece.selectFrame(1); 

테스트 할 때 오류가 발생하지 않지만 비트 맵으로로드 된 이미지가 보이지 않고 반복적으로 1에서 2로 점프하여 puzzlePiceces가 깜박입니다.

어떻게 프레임에 1

참고 마스크를 선택할 수 있습니다 : - 실제 경우에는 내가 타임 라인에서 마스크의 수에는 제한이 없습니다 내가 FLA에에서 선택 할 수 있어야한다.

관련 문제