2015-01-02 5 views
1

플래시 퍼즐 게임에 문제가 있습니다. 내 타임 라인의 첫 번째 프레임에서 게임을 만들면 작동하지만 5 번째 프레임에서 게임이 만들어지면 작동하지 않습니다! 나는 문제가 VAR 대상으로 생각어떻게 플래시 게임에서이 오류를 해결할 수 있습니까?

TypeError: Error #1009: Cannot access a property or method of a null object reference. at Map() TypeError: Error #2007: Parameter hitTestObject must be non-null. at flash.display::DisplayObject/_hitTest() at flash.display::DisplayObject/hitTestObject() at DragDrop/drop()

끌어서 놓기 클래스

 package 
{ 
    import flash.display.*; 
    import flash.events.*; 


    public class DragDrop extends Sprite 
    { 
     var origX:Number; 
     var origY:Number; 
     var target:DisplayObject ; 


     public function DragDrop() 
     { 
      // constructor code 
      origX = x; 
      origY = y; 
      addEventListener(MouseEvent.MOUSE_DOWN, drag); 
      buttonMode = true; 
     } 

     function drag(evt:MouseEvent):void 
     { 
      stage.addEventListener(MouseEvent.MOUSE_UP, drop); 
      startDrag(); 
      parent.addChild(this); 
     } 

     function drop(evt:MouseEvent):void 
     { 
      stage.removeEventListener(MouseEvent.MOUSE_UP, drop); 
      stopDrag(); 

      if(hitTestObject(target)) 
      { 
       visible = false; 
       target.alpha = 1; 
       Object(parent).match(); 
      } 

      x = origX; 
      y = origY; 
     } 


    } 
} 

:

그것은 나에게 오류를 보내! 나는 그것을 해결하는 방법을 모른다.

Map.as는 여기에 코드 패키지 {

import flash.display.*; 
import flash.events.*; 


public class Map extends MovieClip 
{ 
    var dragdrops:Array; 


    public function Map() 
    { 
     // constructor code 
     dragdrops = [tt1]; 
     var currentObject:DragDrop; 
     for(var i:uint = 0; i < dragdrops.length; i++) 
     { 
      currentObject = dragdrops[i]; 
      currentObject.target = getChildByName(currentObject.name + "_target"); 
     } 
    } 

    public function match():void 
    { 

    } 
} 

} 당신의 hitTestObject 방법이 제대로 호출되지 않기 때문에

+0

내 대답 읽기. hitTestObject 메서드는 항상 잘못 호출 된 채로 있습니다. – helloflash

답변

0

편집 : 코드 여러 문제가 있습니다

. 목록에 표시 할 항목이 너무 많습니다. 가장 큰 것은 다음과 같습니다.

지도를 선언하고 개체를 추가하기 전에 개체를 추가하려고합니다. 프레임 5까지는 존재하지 않으므로 작동하지 않습니다. 아래 코드를 다시 작성했지만 코드의 상당 부분을 다시 작성하지 않고 수정할 수는 없습니다.

package 
{ 

import flash.display.*; 
import flash.events.*; 


public class Map extends MovieClip 
{ 
    var dragdrops:Array; 


    public function Map() 
    { 
     // constructor code 
     dragdrops = new Array(); 

    } 
    public function addElement(gamepiece:DragDrop):void { 
     dragdrops.push(gamepiece); 
    } 
    public function addChildElements():void { 
     var currentObject:Object; 
     for(var i:uint = 0; i < dragdrops.length; i++) 
     { 
      currentObject = dragdrops[i]; 
      currentObject.test(); 
      currentObject.target = (currentObject.name + "_target"); // this should work now, but doesn't. Why? 
      currentObject.target.test(); 
     } 
    } 
    public function match():void 
    { 

    } 
} 

} 

그런 다음, 프레임 하나, 내가 추가 :

var map:Map = new Map(); 

그런 프레임 오에, 내가 추가 :

map.addElement(tt1); 
map.addChildElements(); 

이있어 TT1은, 맵에 추가 적어도하지만, 그게 내가 가진 것입니다. 이제 당신의 문제는;

currentObject.target = (currentObject.name + "_target"); 

는 지금, 올바른 이름, 그러나 그것은 target에 추가되지 않습니다. 그게 내가 할 수있는만큼.

+0

tnx이 줄을 this.target = (evt.target as DisplayObject) 추가합니다.) 이제이 오류를 보내주십시오 : TypeError : Error # 1009 : null 개체 참조의 속성이나 메서드에 액세스 할 수 없습니다. \t Map() 에서 드래그 앤 드롭하면 개체가 숨겨집니다! ((m y 게임을하고 그것을 치크 : https://www.mediafire.com/?u0y39kll1yo5tib – arshia

+0

나는 우리 map.as을 변경해야한다고 생각해!? – arshia

+0

아. 나는 네가하는 일을 본다. 귀하의지도가 DragDrop에서 목표를 설정하고 있습니다. 이 경우 귀하의 문제가 아니므로, 귀하의 문제가 아니므로 원래 귀하가 원래 한 일로 돌아갈 것을 제안합니다. CS5를 사용할 때 FLA를 열 수 없습니다. 이 클래스에서 개체를 생성하는 위치는 어디입니까? Document Class를 설정 했습니까? 아니면 FLA의 첫 번째 프레임에서 이러한 객체를 선언하고 있습니까? 당신이 그 코드를 게시했다면, 그리고 당신이 그 코드를 fla에 가지고 있다면 도움이 될 것입니다. –

0

그건를 입력합니다. 이 방법은 표시 객체의 다른 인스턴스가 안타 경우 테스트하는 표시 객체 인스턴스에서 호출해야합니다

if (myDisplayObject.hitTestObject(anotherDisplayObject)) 
{ 
    // do stuff 
} 

어도비에 대한 hitTestObject 방법을 도움이됩니다.

편집

그래서 당신은 좋아 클래스를 작성해야합니다

package 
{ 
    import flash.display.*; 
    import flash.events.*; 

    public class DragDrop extends Sprite 
    { 
     var origX:Number; 
     var origY:Number; 
     var target:DisplayObject; 

     public function DragDrop() 
     { 
      addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event):void { 
      origX = x; 
      origY = y; 
      stage.addEventListener(MouseEvent.MOUSE_DOWN, drag); 
      buttonMode = true; 
     } 

     private function drag(evt:MouseEvent):void 
     { 
      stage.addEventListener(MouseEvent.MOUSE_UP, drop); 
      startDrag(); 
      parent.addChild(this); 
     } 

     private function drop(evt:MouseEvent):void 
     { 
      target = (evt.target as DisplayObject); 
      stage.removeEventListener(MouseEvent.MOUSE_UP, drop); 
      stopDrag(); 

      if(target.hitTestObject(target)) 
      { 
       visible = false; 
       target.alpha = 1; 
       Object(parent).match(); 
      } 

      x = origX; 
      y = origY; 
     } 
    } 
} 

당신은 당신의 변수 target를 호출하지 않아야 때문에 플래시의 그 이름 원시 변수. 예를 들어 targ으로 이름을 바꿉니다.

+0

안녕하세요 tanx 대단히 죄송 합니다만, 나는 꽤 기대하지 않습니다. 당신이 내 자신의 코드를 바꾸어서 내가 무슨 소리를하지 않겠습니까? – arshia

+0

: (((((((((((( – arshia

+0

이것은 내 게임 링크입니다. https://www.mediafire.com/?u0y39kll1yo5tib – arshia