как я могу получить доступ к сцене основного класса?+ Могу ли я передать функции в качестве аргументов, как это? - PullRequest
0 голосов
/ 22 января 2011

В моем проекте ActionScript есть два файла с именем "TestAPP", TestAPP.as и Draggable.as

TestAPP.as:


    package {
 import flash.display.Sprite;
 import flash.display.Stage;

 public class TestAPP extends Sprite
 {
  var _mainStage:Stage;
  public function TestAPP()//This is where we test the UI components.
  {

   var sp:Sprite = new Sprite();
   _mainStage = stage;
   _mainStage.addChild(sp);
   sp.graphics.beginFill(0x00FF00);
   sp.graphics.drawCircle(0,0,10);
   sp.graphics.endFill();
   sp.x = 50;
   sp.y = 50;
   var draggable1:Draggable = new draggable(sp,_mainStage,limitingfunc);
  }
  public function limitingfunc(x:Number,y:Number):int{
   return 0;
  } 

 }
}

И для draggable.as:


package
{
 import flash.display.Sprite;
 import flash.display.Stage;
 import flash.events.MouseEvent;

 public class Draggable
 {
  private var _limitingFunc:Function;
  private var _which:Sprite;
  private var _MouseSavedX:Number;
  private var _MouseSavedY:Number;

  private var _stage:Stage;
  public function Draggable(which:Sprite,stage:Stage,limitingfunc:Function)
  {
   _limitingFunc = limitingfunc;
   _which = which;
   _stage = stage;
   _which.addEventListener(MouseEvent.MOUSE_DOWN,begin_drag);

  }
  //limiting func: returns 0 when the object is free to move that place.
  //returns -1 when the user wants to block X coordinate changes (but maintain Y free)
  //returns -2 when the user wants to block Y ...
  //returns -3 or less when the user wants to block both X and Y from changing.
  //returns
  private function Return_0(x:Number = 0,y:Number = 0):int{
   return 0;
  }
  private function begin_drag(ev:MouseEvent):void{
   var xTo:Number = _stage.mouseX - _MouseSavedX + _which.x;
   var yTo:Number = _stage.mouseY - _MouseSavedY + _which.y;
   var limitingFuncReturnValue:int = _limitingFunc(xTo,yTo);
   if(limitingFuncReturnValue == 0){//free to move.
    _which.x = xTo;
    _which.y = yTo;
   }
   else if(limitingFuncReturnValue == -1){//free to move Y
    _which.y = yTo;
   }
   else if(limitingFuncReturnValue == -2){
    _which.y = yTo;
   }
   //else:do nothing.
  }
 }
}

В «моей теории сценария действий» я должен видеть круг, который следует за мышью, когда я нажимаю на нее.(Перетаскиваемый объект не полностью реализован) Но круг даже не сдвинулся с места: (

... Я пытался выяснить, как получить доступ к свойству stage основного класса., но все еще без прогресса.

Пожалуйста, помогите этому беспомощному новичку !!! Я буду очень признателен за вашу помощь :) Спасибо!

Ответы [ 4 ]

1 голос
/ 22 января 2011

Вы реализуете свой второй класс как «перетаскиваемый», когда вы назвали его (и он должен быть назван) «Перетаскиваемым» в верхнем регистре. Измените это и посмотрите, работает ли это. Вы, кажется, проходите в стадии родительских классов правильно, хотя.

0 голосов
/ 22 января 2011

если вам так нужно, вы можете:

private static var _instance: TestAPP;
//...
public function TestAPP(){
    _instance = this;
    //...
}

public static function get instance():TestAPP{
    return _instance;
}

public static function set instance(newVal: TestAPP):void{
    _instance = newVal;
}

, и вы сможете ссылаться на его этап из любого класса, где ваш TestAPP будет импортирован только с TestAPP.instance.stage.
но _instance является свойством самого класса TestAPP, а не его экземпляров

0 голосов
/ 22 января 2011

Вы можете получить доступ к свойству stage основного класса так же, как и для любого объекта DisplayObject на сцене: используйте this.stage.

Так что этого должно быть достаточно:

var sp:Sprite = new Sprite();
stage.addChild(sp);

Затем вы могли бы передать спрайт и этап основного класса в качестве параметра, как вы это сделали, но я бы порекомендовал создать подкласс Draggable extends Sprite и создать экземпляр всего этого, используя вместо этого new Draggable().
Новый объектбудет автоматически иметь собственную ссылку на stage, как только она будет добавлена ​​в список отображения, и limitingFunc также может быть членом Draggable.

Также вы можете использовать startDrag () *Методы 1013 * и stopDrag () , не нужно реализовывать свои собственные: вы можете указать Rectangle в качестве параметра для startDrag (), чтобы ограничить разрешенное движение.

0 голосов
/ 22 января 2011

Если TestAPP является вашим классом документов. Вы можете получить доступ к этапу через свойство stage (как вы делаете в своем примере). Если TestAPP не является классом документа, вы должны сначала прослушать событие ADDED_TO_STAGE, а затем получить доступ к свойству stage. Нет необходимости добавлять свойство _mainStage, потому что у вас уже есть свойство stage. Для перемещения объектов вам необходимо использовать событие ENTER_FRAME.

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