2016-03-03 2 views
1

мне нужно проверить столкновение между 2 видеофрагментами, используя воздух для сценария андроида действий 3.испытание столкновение двух клипов в двух различных классах AS3

Сва столкновение между объектом и несколькими препятствиями.

Моя структура выглядит следующим образом:

  • Файл базы FLA, связан с файлом Action Script под названием baseCode.as.
  • В этом AS файл, я создать obsctacles, используя следующий код:

baseCode.as:

package { 
    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.geom.Point; 
    import Mc_MC;    // Not strictly needed 

    public class baseCode extends flash.display.MovieClip 
    { 
     //private static var SYMBOLS:Array = new Array(MySymbol1, MySymbol2); 
     public var t:int = 0; 
     public function baseCode() 
     { 
      // Create five symbols: 
      for (var i:int = 0; i < 5; i++) { 
       trace(i); 
       makeSymbol(); 
      } 
     } 

    function randomRange(minNum:Number, maxNum:Number):Number 
    { 
     return (Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum); 
    } 
     public function makeSymbol():void 
     { 


      trace("IT entered makeSymbol"); 
      // Pick a random symbol from the array: 
      // var symType:Class = SYMBOLS[0]; 

      //trace(SYMBOLS[Math.random() * SYMBOLS.length]); 
      // Construct the new symbol: 
      //var Positi : Number = new Number(Math.random); 
      var loc:Point = new Point(randomRange(100,stage.stage.height),0); 
      var loc2:Point = new Point(randomRange(110,stage.stage.height),0); 
      //var loc:Point = new Point(10*randomRange(15, stage.width),100*randomRange(10 , stage.width)); 
      trace("this is the starting point" , loc); 
      var sym:Mc_MC = new Mc_MC(1 + Math.random() *10, loc); 
      if(t % 2 == 0){ 
      var sym2:Mc_MC2 = new Mc_MC2(15 + Math.random() *10, loc); 
      // Listen for the object hitting the left edge: 
      //sym2.addEventListener(Event.COMPLETE, remakeObject); 
      this.addChild(sym2); 
      } 
      sym.addEventListener(Event.COMPLETE, remakeObject); 
      this.addChild(sym); 
      t ++; 

     } 


     public function remakeObject(e:Event):void 
     { 
       e.target.removeEventListener(Event.COMPLETE, remakeObject); 
      //e.removeChild(sym); 
      //e.parent.removeChild(this.child); 
     // removeChild(this); 
      // this.removeChild(sym); 
      // Replace the dead symbol: 
      makeSymbol(); 
     } 
    } 
} 
  • Mc_MC и Mc_MC2 являются два файла Action Script, в котором Препятствия называются:

Mc_MC.as:

package { 
     import flash.display.MovieClip; 
     import flash.events.Event; 
     import flash.geom.*; 
     import flash.display.Screen; 
     import flash.system.Capabilities; 
     public class Mc_MC extends MovieClip 
     { 


     public var speed:Number;  // Pixels moved per frame 
    var valuee:baseCode; 

    public function Mc_MC(speed:Number, startPosition:Point) 
    { 
     this.speed = speed; 
     this.addEventListener(Event.ENTER_FRAME, update); 

     this.x = startPosition.x; 
     this.y = startPosition.y; 
    } 


    public function update(speed:Number) 


    { 
     var screenWidth:Number = Capabilities.screenResolutionX; 
     var screenHeight:Number = Capabilities.screenResolutionY; 


     trace("this.y" , this.y); 
     trace("this is the stage height" , screenHeight); 
     trace("this.speed" , this.speed); 

     if (this.y >= screenHeight - 100) { // We're at the left edge 
      trace("Entered if"); 
      trace("new Starting Pos" , this.y); 

      this.y = stage.height; 
       parent.removeChild(this); 

     this.removeEventListener(Event.ENTER_FRAME, update); 

      this.dispatchEvent(new Event(Event.COMPLETE)); 
     } 
     else this.y += this.speed; 
    } 
    } 
} 
  • В файле базы FLA, я создать главный объект, который будет столкнуться со всеми препятствиями, созданными с помощью Mc_MC и Mc_MC2. Я создаю его, используя следующий код:

Home.fla

import flash.events.* 

//import flash.events.EventDispatcher.addEventListener() 

import flash.display.DisplayObject; 
//import flash.events.MouseEvent; 
import flashx.textLayout.events.UpdateCompleteEvent; 
import flash.display.MovieClip; 

var offsetX:Number; 
var offsetY:Number; 
//var draggedObject:DisplayObject; 
var my_obj:OriginalObject = new OriginalObject(); 
//left.addEventListener(MouseEvent.MOUSE_MOVE, drag); 


//The speed of the scroll movement. 
var scrollSpeed:uint = 2; 

//This adds two instances of the movie clip onto the stage. 
var s1:ScrollBg = new ScrollBg(); 
var s2:ScrollBg = new ScrollBg(); 



left.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown); 

function mouseDown(e:MouseEvent):void { 

    stage.addEventListener(MouseEvent.MOUSE_UP,mouseUp); //listen for mouse up on the stage, in case the finger/mouse moved off of the button accidentally when they release. 
    addEventListener(Event.ENTER_FRAME,myButtonClick); //while the mouse is down, run the tick function once every frame as per the project frame rate 
} 

function mouseUp(e:MouseEvent):void { 
    removeEventListener(Event.ENTER_FRAME,myButtonClick); //stop running the tick function every frame now that the mouse is up 
    stage.removeEventListener(MouseEvent.MOUSE_UP,mouseUp); //remove the listener for mouse up 
} 


right.addEventListener(MouseEvent.MOUSE_DOWN,mouseDown2); 
function mouseDown2(e:MouseEvent):void { 

    stage.addEventListener(MouseEvent.MOUSE_UP,mouseUp2); //listen for mouse up on the stage, in case the finger/mouse moved off of the button accidentally when they release. 
    addEventListener(Event.ENTER_FRAME,stopDragging); //while the mouse is down, run the tick function once every frame as per the project frame rate 
} 

function mouseUp2(e:MouseEvent):void { 
    removeEventListener(Event.ENTER_FRAME,stopDragging); //stop running the tick function every frame now that the mouse is up 
    stage.removeEventListener(MouseEvent.MOUSE_UP,mouseUp2); //remove the listener for mouse up 
} 



my_obj.x = stage.width/2; 
my_obj.y = stage.height - (stage.height/3); 


stage.addChild(my_obj); 

function myButtonClick(ev:Event):void 
{ 

    trace("UPPP"); 


    if(my_obj.x > (my_obj.width*2)){ 
    my_obj.x = my_obj.x - 10; 

    trace("In the limit"); 
    } 

    else { 

      trace("out of bounds"); 

    } 

    trace("myButton has been clicked."); 

    } 

    //// This function is called when the mouse button is released. 
    function stopDragging(ev2:Event):void 
    { 
      trace("Down"); 
      if(my_obj.x <= right.x){ 
      my_obj.x = my_obj.x + 10; 
      } 



    } 

Как я могу проверить столкновение движущегося Mc_MC/Mc_MC2 с my_obj, учитывая, что из разных AS файлы?

Я новичок в AS, поэтому любая помощь будет оценена!

+1

Почему бы вам не перевести свой временной код на baseCode.as? –

+0

Ваш код трудно прочитать. Какой именно объект должен взаимодействовать с каким-либо другим объектом? Комментарии кодов и значащие имена переменных имеют большое значение для ясности кода. 'my_obj' и' Mc_MC' не являются очень значимыми именами, поскольку они вообще не указывают цель этих объектов. – BadFeelingAboutThis

+0

Кроме того, где именно вы пытаетесь сделать столкновение? – BadFeelingAboutThis

ответ

1

Если вы хотите иметь возможность проверки объектов столкновения из разных классов/родительских элементов, вам необходимо настроить проект таким образом, чтобы вы могли получить ссылку на указанные объекты.

Из-за внешнего вида ваши два объекта уже находятся в одном и том же классе (так как ваш основной код временной шкалы и код класса документа имеют одну и ту же область, поэтому то, что вы объявляете в одном, должно быть доступно в другом).

Единственное, чего вам не хватает, это ссылка на верхний уровень вашего препятствия/Mc_MC. Поскольку в настоящее время вы назначаете его переменной var, которая привязана к функции makeSymbol (поэтому у вас есть только ссылка на нее внутри этой функции).

Решение

В классе документа (baseCode.в), создать верхний уровень вар содержать ссылку на эту преграду: (для справки, у вас есть верхний уровень вар называется t, поместите эту строку выше или ниже)

private var obstacle:Mc_MC; 

позже в функции что инициализирует новый Mc_MC (makeSymbol), назначить экземпляр этого верхнего уровня вар:

obstacle = new Mc_MC(1 + Math.random() *10, loc); 
    addChild(obstacle); 

Теперь вы можете получить доступ к этому obstacle вар где-либо еще в основной временной шкалы или документа класса.

if(my_obj.hitTest(obstacle)){ 

    } 

Как и в сторону, если у вас есть класс документа, нет никакого смысла в том, чтобы код на первом кадре вашей основной временной шкале, как код будет работать так же, в классе документа (хотя это должна содержаться в функции). Вот пример перемещения основного кода временной шкалы:

public class Main extends MovieClip { 

     public function Main():void { 
      //listen for the added to stage event prior to do anything display oriented 
      this.addEventListener(Event.ADDED_TO_STAGE, init); 
     } 

     private function init(e:Event):void { 
      //this is the best place to put the equivalent of timeline code (not including vars or functions, put those in the class root NOT nested here) 
     } 
    } 
+0

Спаситель жизни !!! Большое спасибо! –

Смежные вопросы