2011-05-03 3 views
0

두 개의 파일이 들어있는 하나의 폴더 (Projects)가 있습니다. FirstPro.fla, FirstClass.as 내 질문의 목표는 클래스의 다른 두 객체 (MovieClip)와 상호 작용하는 것입니다. 나 자신에 의해 만들어졌고 단 하나의 클래스 만 있고 클래스는 단 하나의 MovieClip 만 가지고, 목표는 상호 작용입니다. 이름이있는 MovieClip 두 번째 (letterPanel)에는 클래스가없고 MovieClip이 장면에만 있습니다. 링크가 내가 현장에있는ActionScript의 클래스에 대해

package 
{ 
    import flash.utils.Timer; 
    import flash.events.TimerEvent; 
    import flash.display.MovieClip; 
    import flash.events.*; 
    import flash.display.Stage; 

    public class FirstClass extends MovieClip 
    { 
     public function FirstClass() 
     { 
      var NewMyTimer:Timer = new Timer(100); 
      NewMyTimer.addEventListener(TimerEvent.TIMER, hm); 
      NewMyTimer.start(); 

     } 

     public function hm(TimerEvent):void 
     { 
      this.y += 5; 

      if(this.hitTestObject(letterPanel)) 
      { 
       trace("Coincidens"); 

      } 

     } 

    } 

} 

그리고 FirstPro.fla 파일에 난 두 개의 무비 클립 (이미지)을 가지고, 그 중 하나가 firstobj했다 이름 : FirstClass.as에서

내가 다음 코드를 내 생성 된 클래스와 함께 작동하고, 내 개체 firstobj 타이머와 함께,하지만 난 두 번째 개체 (MovieClip-letterPanel)와 상호 작용하고 싶습니다 - if (this.hitTestObject (letterPanel)) {trace ("Coincidens") ; } 이 클래스에서이 코드를 작성하면이 출력 실수 (letterPanel)가 정의되어 있지 않습니다. 한 클래스에서 두 객체의 상호 작용으로 무엇을 할 수 있습니까?

답변

0

당신은 영화 클립을 할당해야하고 프로젝트의 당신의 explaination가 조금 어렵습니다 때문에 당신은 또한 VAR이 혼동 이외의

package{ 
    import flash.utils.Timer; 
    import flash.events.TimerEvent; 
    import flash.display.MovieClip; 
    import flash.events.*; 
    import flash.display.Stage; 
    public class FirstClass extends MovieClip{ 
    private var _letterPanel:MovieClip; 
    public function FirstClass(){ 

    } 
    public function startConter():void{ 
     var NewMyTimer:Timer=new Timer(100); 
     NewMyTimer.addEventListener(TimerEvent.TIMER, hm); 
     NewMyTimer.start(); 
    } 
    public function hm(TimerEvent):void{ 
     this.y+=5; 
     if(this.hitTestObject(this._letterPanel)){ 
     trace("Coincidens"); 
     } 
    } 
    public function set letterPanel(val:MovieClip):void{ 
     this._letterPanel = val; 
    } 
    } 
} 


var firstClass:FirstClass = new FirstClass(); 
firstClass.letterPanel = letterPanel; 
firstClass.startCounter(); 
+0

1061 : 정적 유형 FirstClass가있는 참조를 통해 시작 가능하지 않은 메서드 startCounter를 호출합니다. – Adam

+0

1067 : Class 유형의 값을 관련없는 유형의 암시 적 강제 변환입니다. flash.display : MovieClip. – Adam

+0

FirstClass를 가져와야합니다. –

0

내 초기 응답을 (설정되어 전까지 타이머를 시작할 수 없습니다 이해하는 것은 당신이 OOP에 대해 잘 이해하지 못한다는 것입니다. 이 질문에 대한 답이 나오기 전에 나는 옳다고 믿었습니다. 내가 올바르게 기억한다면 당신은 수업을 이용하지 않았기 때문에 그것을 거부했다. OOP 방법 등 귀하의 경우에는

추상화, 캡슐화, 상속, 다형성 등의 OOP 개념을 구현 때 뿐만 아니라하는 을 알고에 관한 생각 질문에 간단한 대답은 다음과 같습니다

하지만 수업을 실제로 사용해야하는 필요성을 느끼는 경우 비슷한 플래시 응용 프로그램을 만들어서 어떻게 사용하는지 보여줍니다. 기본적으로 3 개의 드래그 가능한 빨강, 녹색 및 파란색 원이 스테이지에있는 객체를 표시하며 원 표시 객체를 드래그하고 다른 원 표시 객체와 겹치거나 교차하면 충돌을 설명하는 흔적이 만들어집니다. 다음 코드를 복사하여 문서 클래스에 붙여 넣어 응용 프로그램을 실행할 수 있습니다.

package 
{ 
    import flash.display.Sprite; 
    import flash.events.Event; 

    public class Main extends Sprite 
    { 
     public function Main():void 
     { 
      if (stage) init(); 
      else addEventListener(Event.ADDED_TO_STAGE, init); 

     }// end function 

     private function init(e:Event = null):void 
     { 
      removeEventListener(Event.ADDED_TO_STAGE, init); 

      var redCircle:Circle = new Circle(Color.RED, 50); 
      redCircle.name = "redCircle"; 
      redCircle.x = 100; 
      redCircle.y = 100; 
      addChild(redCircle); 

      var greenCircle:Circle = new Circle(Color.GREEN, 50); 
      greenCircle.name = "greenCircle"; 
      greenCircle.x = 300; 
      greenCircle.y = 100; 
      addChild(greenCircle); 

      var blueCircle:Circle = new Circle(Color.BLUE, 50); 
      blueCircle.name = "blueCircle"; 
      blueCircle.x = 500; 
      blueCircle.y = 100; 
      addChild(blueCircle); 

      var collision:Collision = new Collision(stage, redCircle, greenCircle, blueCircle); 
      collision.addEventListener(CollisionEvent.COLLISION, onCollision); 

     }// end function 

     private function onCollision(e:CollisionEvent):void 
     { 
      var collision:Collision = Collision(e.target); 
      collision.removeEventListener(CollisionEvent.COLLISION, onCollision); 

      trace("There was a collision between " + e.displayObject1.name + " and " + e.displayObject2.name); 

     }// end function 

    }// end class 

}// end package 

internal class Color 
{ 
    public static const RED:uint = 0xFF0000; 
    public static const GREEN:uint = 0x00FF00; 
    public static const BLUE:uint = 0x0000FF; 

}// end class 

import flash.display.Sprite; 
import flash.display.Stage; 
import flash.events.EventDispatcher; 
import flash.events.Event; 
import flash.display.DisplayObject; 
import flash.events.Event; 
import flash.events.MouseEvent; 

internal class Circle extends Sprite 
{ 
    public function Circle(color:uint, radius:Number) 
    { 
     graphics.beginFill(color); 
     graphics.drawCircle(0,0,radius); 
     graphics.endFill(); 

     addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); 

    }// end function 

    private function onMouseDown(e:MouseEvent):void 
    { 
     parent.setChildIndex(this, parent.numChildren - 1); 
     startDrag(); 

     stage.addEventListener(MouseEvent.MOUSE_UP, onMouseUp) 

    }// end function 

    private function onMouseUp(e:MouseEvent):void 
    { 
     stage.removeEventListener(MouseEvent.MOUSE_UP, onMouseUp); 

     stopDrag(); 

    }// end function 

}// end class 

internal class Collision extends EventDispatcher 
{ 
    private var _stage:Stage; 
    private var _doVector:Vector.<DisplayObject>; 

    public function Collision(stage:Stage, ...displayObjects) 
    { 
     _stage = stage; 
     _doVector = getDOVector(validateArgs(displayObjects, DisplayObject)); 

     init(); 

    }// end function 

    private function init():void 
    { 
     _stage.addEventListener(Event.ENTER_FRAME, onEnterFrame); 

    }// end function 

    private function onEnterFrame(e:Event):void 
    { 
     for(var i:uint = 0; i < _doVector.length; i++) 
     { 
      for(var j:uint = 0; j < _doVector.length; j++) 
      { 
       if (_doVector[i] != _doVector[j]) 
       { 
        if (_doVector[i].hitTestObject(_doVector[j])) 
        dispatchEvent(new CollisionEvent(CollisionEvent.COLLISION, _doVector[i], _doVector[j])); 

       }// end if 

      } // end for 

     }// end for 

    }// end function 

    private function validateArgs(args:Array, type:Class):Array 
    { 
     for each(var arg:* in args) 
     if(!(arg is type)) 
     throw new ArgumentError("Argument must be of type " + type); 

     return args; 

    }// end function 

    private function getDOVector(array:Array):Vector.<DisplayObject> 
    { 
     var doVector:Vector.<DisplayObject> = new Vector.<DisplayObject>(); 

     for each(var displayObject:DisplayObject in array) 
     doVector.push(displayObject); 

     return doVector; 

    }// end function 

}// end class 

internal class CollisionEvent extends Event 
{ 
    public static const COLLISION:String = "collision"; 

    private var _displayObject1:DisplayObject; 
    private var _displayObject2:DisplayObject; 

    public function get displayObject1():DisplayObject { return _displayObject1 }; 
    public function get displayObject2():DisplayObject { return _displayObject2 }; 

    public function CollisionEvent(type:String, 
            displayObject1:DisplayObject, 
            displayObject2:DisplayObject, 
            bubbles:Boolean = false, 
            cancelable:Boolean = false):void 
    { 
     _displayObject1 = displayObject1; 
     _displayObject2 = displayObject2; 

     super(type, bubbles, cancelable); 

    }// end function 

    override public function clone():Event 
    { 
     return new CollisionEvent(type, displayObject1, displayObject2, bubbles, cancelable); 

    }// end function 

}// end class 
관련 문제