2014-12-27 1 views
0

Привет, ребята, я делаю свой университетский проект в этой маленькой игре с тамогачи, где я перетаскиваю вещи на персонаже, а его здоровье или деньги wtv меняются в соответствии с это, и мы должны были сделать это с несколькими классами, поэтому все хорошо, за исключением объекта hitTestObject, если он неправильно регистрируется через разные классы.hitTestObject обнаружение столкновения, даже если нет столкновения, а в другом случае его не регистрируется

Вот мой код и все мои файлы проекта ссылка также прилагается ниже, пожалуйста, помогите:

Ссылка для файлов проекта: https://drive.google.com/folderview?id=0B07PZ7vQgjsteWhVMnItczd2YUE&usp=sharing

Главный класс:

package { 

    import flash.display.MovieClip; 
    import flash.events.Event; 
    import flash.utils.Timer; 


    public class Main extends MovieClip { 





     public var addStuff:AddStuff = new AddStuff; 
     public var hmClass:HealthMoney = new HealthMoney; 

     public function Main() { 

      addChild(addStuff.bg); 


      addStuff.batMan.x = 700; 
      addStuff.batMan.y = 600; 
      addChild(addStuff.batMan); 

      addChild(addStuff.box); 
      addStuff.box.x = 1050; 
      addStuff.box.y = 500; 

      addChild(addStuff.batHealth); 
      addStuff.batHealth.x = 890; 
      addStuff.batHealth.y = 430; 

      addChild(addStuff.dollar); 
      addStuff.dollar.x = 890; 
      addStuff.dollar.y = 570; 

      addChild(addStuff.men); 
      addStuff.men.x = 800; 
      addStuff.men.y = 900; 

      addChild(addStuff.batBurger); 
      addStuff.batBurger.x = 400; 
      addStuff.batBurger.y = 900; 

      addChild(addStuff.batDrink); 
      addStuff.batDrink.x = 600; 
      addStuff.batDrink.y = 900; 

      addChild(addStuff.batMoney); 
      addStuff.batMoney.x = 850; 
      addStuff.batMoney.y = 940; 

      AddHealth(); 
      AddMoney(); 


      } 

     public function AddHealth(){ 

      hmClass.HealthTimer(); 
      addChild(hmClass.myHealthText); 

      addEventListener(Event.ENTER_FRAME,Kill); 
      function Kill(e:Event){ 

       if(hmClass.health <= 0){ 

        hmClass.batLifeTimer.stop(); 
        addStuff.batMan.rotation -= 1; 
        if(addStuff.batMan.rotation <= -80){ 

         addStuff.batMan.alpha = -5; 

         } 


        } 

       } 


     } 

     public function AddMoney(){ 

       addChild(hmClass.myMoneyText); 
       hmClass.Money(); 



       } 










    } 

} 

AddStuff Класс:

package { 


    public class AddStuff{ 

     public var bg:BG = new BG(); 
     public var batHealth:BatHealth = new BatHealth(); 
     public var batMan:BatMan = new BatMan(); 
     public var batBurger:BatBurger = new BatBurger(); 
     public var batDrink:BatDrink = new BatDrink(); 
     public var batMoney:BatMoney = new BatMoney(); 
     public var men:Men = new Men(); 
     public var box:Box = new Box(); 
     public var dollar:Dollar = new Dollar(); 

     public function AddStuff() { 



     } 



    } 

} 

HealthMoney Класс:

package { 
    import flash.events.TimerEvent; 
    import flash.utils.Timer; 
    import flash.text.TextField; 
    import flash.events.Event; 
    import flash.display.MovieClip; 
    import flash.text.TextFormat; 
    import flash.events.MouseEvent; 

    public class HealthMoney extends MovieClip{ 

     public var health:int = 100; 
     public var money:int = 100; 
     public var batLifeTimer:Timer = new Timer(1000); 
     public var myHealthText:TextField = new TextField(); 
     public var myHealthTextFormat:TextFormat = new TextFormat(); 
     public var myMoneyText:TextField = new TextField(); 
     public var myMoneyTextFormat:TextFormat = new TextFormat(); 
     public var addStuffClass:AddStuff = new AddStuff; 
     public var addStuff1:AddStuff = new AddStuff; 
     public function HealthMoney() { 
      // constructor code 

     } 

     public function HealthTimer(){ 


      myHealthText.setTextFormat(myHealthTextFormat); 
      myHealthTextFormat.size = 120; 
      myHealthTextFormat.color = 0xFFFFFF; 

      myHealthText.defaultTextFormat = myHealthTextFormat; 
      //myHealthText.border = true; 
      myHealthText.x = 970; 
      myHealthText.y = 350; 
      myHealthText.width = 200; 
      myHealthText.height = 120; 





      batLifeTimer.addEventListener(TimerEvent.TIMER, timerListener); 

      function timerListener (e:TimerEvent):void{ 

       health--; 
       //trace(health); 
       myHealthText.text = health.toString(); 
       } 


      batLifeTimer.start(); 




      addEventListener(Event.ENTER_FRAME, BatBurger); 
      function BatBurger(e:Event):void{ 

       if(addStuff1.batMan.hitTestObject(addStuff1.batBurger)){ 

        health++; 
        //trace("yo"); 

        } 

       } 






      } 


     public function Money():void{ 

      myMoneyText.setTextFormat(myMoneyTextFormat); 
      myMoneyTextFormat.size = 120; 
      myMoneyTextFormat.color = 0xFFFFFF; 

      myMoneyText.defaultTextFormat = myMoneyTextFormat; 
      myMoneyText.border = true; 
      myMoneyText.x = 970; 
      myMoneyText.y = 500; 
      myMoneyText.width = 500; 
      myMoneyText.height = 200; 
      //addChild(myMoneyText); 
      myMoneyText.text = money.toString(); 

      addEventListener(MouseEvent.MOUSE_UP, AddMoney); 

      function AddMoney(e:MouseEvent):void{ 

       if(addStuff1.batMoney.hitTestObject(addStuff1.batMan)){ 

        myMoneyText.text = money.toString(); 
        money = money + 100; 
        trace("hey"); 


        } 



       } 



      } 











    } 
} 

и DraggableItem Класс:

(этот класс является базовым классом для всех объектов, я хочу, чтобы перетащить)

package { 

    import flash.events.MouseEvent; 
    import flash.display.MovieClip; 

    public class DraggableItem extends MovieClip{ 

     public function DraggableItem() { 

      addEventListener(MouseEvent.MOUSE_DOWN, startmove); 
      addEventListener(MouseEvent.MOUSE_UP, stopmove); 

     } 

     public function startmove(e:MouseEvent){ 

      this.startDrag(); 

      } 
     public function stopmove(e:MouseEvent){ 

      this.stopDrag(); 

      } 

    } 

} 
+0

поэтому, в чем проблема? Я не вижу hitTestObject в вашем проекте ... где вы тестируете столкновение? – tziuka

+0

проблема в том, что я сделал объект теста хитов, который обнаруживает столкновение между гамбургером и бэтменом, поэтому, когда я перетаскиваю гамбургер на него, его здоровье должно увеличиться на 10, но оно продолжает увеличивать каждый кадр и то же самое с деньгами ничего не происходит когда я бросаю деньги на него – Lev

ответ

0

Попробуйте это:

Основной класс:

package { 

import flash.display.MovieClip; 
import flash.events.Event; 
import flash.utils.Timer; 
import flash.display.Stage; 

public class Main extends MovieClip { 




    public static var stageRef:Stage; 
    public var addStuff:AddStuff = new AddStuff; 
    public var hmClass:HealthMoney; 

    public function Main() { 

     stageRef = stage; 

     addChild(addStuff.bg); 


     addStuff.batMan.x = 700; 
     addStuff.batMan.y = 600; 
     addChild(addStuff.batMan); 

     addChild(addStuff.box); 
     addStuff.box.x = 1050; 
     addStuff.box.y = 500; 

     addChild(addStuff.batHealth); 
     addStuff.batHealth.x = 890; 
     addStuff.batHealth.y = 430; 

     addChild(addStuff.dollar); 
     addStuff.dollar.x = 890; 
     addStuff.dollar.y = 570; 

     addChild(addStuff.men); 
     addStuff.men.x = 800; 
     addStuff.men.y = 900; 

     addChild(addStuff.batBurger); 
     addStuff.batBurger.x = 400; 
     addStuff.batBurger.y = 900; 

     addChild(addStuff.batDrink); 
     addStuff.batDrink.x = 600; 
     addStuff.batDrink.y = 900; 

     addChild(addStuff.batMoney); 
     addStuff.batMoney.x = 850; 
     addStuff.batMoney.y = 940; 

     hmClass = new HealthMoney(addStuff); 

     AddHealth(); 
     AddMoney(); 


     } 

    public function AddHealth(){ 

     hmClass.HealthTimer(); 
     addChild(hmClass.myHealthText); 

     addEventListener(Event.ENTER_FRAME,Kill); 
     function Kill(e:Event){ 

      if(hmClass.health <= 0){ 

       hmClass.batLifeTimer.stop(); 
       addStuff.batMan.rotation -= 1; 
       if(addStuff.batMan.rotation <= -80){ 

        addStuff.batMan.alpha = -5; 

        } 


       } 

      } 


    } 

    public function AddMoney(){ 

      addChild(hmClass.myMoneyText); 
      hmClass.Money(); 



      } 










} 

} 

HealthMoney класс:

package { 
import flash.events.TimerEvent; 
import flash.utils.Timer; 
import flash.text.TextField; 
import flash.events.Event; 
import flash.display.MovieClip; 
import flash.text.TextFormat; 
import flash.events.MouseEvent; 

public class HealthMoney extends MovieClip{ 

    public var health:int = 100; 
    public var money:int = 100; 
    public var batLifeTimer:Timer = new Timer(1000); 
    public var myHealthText:TextField = new TextField(); 
    public var myHealthTextFormat:TextFormat = new TextFormat(); 
    public var myMoneyText:TextField = new TextField(); 
    public var myMoneyTextFormat:TextFormat = new TextFormat(); 
    public var addStuffClass:AddStuff = new AddStuff; 
    public var addStuff1:AddStuff; 

    public function HealthMoney(addStuff:AddStuff) { 
     this.addStuff1 = addStuff; 

    } 

    public function HealthTimer(){ 


     myHealthText.setTextFormat(myHealthTextFormat); 
     myHealthTextFormat.size = 120; 
     myHealthTextFormat.color = 0xFFFFFF; 

     myHealthText.defaultTextFormat = myHealthTextFormat; 
     //myHealthText.border = true; 
     myHealthText.x = 970; 
     myHealthText.y = 350; 
     myHealthText.width = 200; 
     myHealthText.height = 120; 





     batLifeTimer.addEventListener(TimerEvent.TIMER, timerListener); 

     function timerListener (e:TimerEvent):void{ 

      health--; 
      //trace(health); 
      myHealthText.text = health.toString(); 
      } 


     batLifeTimer.start(); 




     addEventListener(Event.ENTER_FRAME, BatBurger); 
     function BatBurger(e:Event):void{ 

      if(addStuff1.batMan.hitTestObject(addStuff1.batBurger)){ 

       health++; 
       //trace("yo"); 

       } 

      } 






     } 


    public function Money():void{ 

     myMoneyText.setTextFormat(myMoneyTextFormat); 
     myMoneyTextFormat.size = 120; 
     myMoneyTextFormat.color = 0xFFFFFF; 

     myMoneyText.defaultTextFormat = myMoneyTextFormat; 
     myMoneyText.border = true; 
     myMoneyText.x = 970; 
     myMoneyText.y = 500; 
     myMoneyText.width = 500; 
     myMoneyText.height = 200; 
     //addChild(myMoneyText); 
     myMoneyText.text = money.toString(); 

     Main.stageRef.addEventListener(MouseEvent.MOUSE_UP, AddMoney); 

     function AddMoney(e:MouseEvent):void{ 

      if(addStuff1.batMoney.hitTestObject(addStuff1.batMan)){ 

       myMoneyText.text = money.toString(); 
       money = money + 100; 
       trace("hey"); 


       } 



      } 



     } 











} 
} 

Строка «public static var stageRef: Stage;» создает статическую переменную типа Stage. Статические переменные доступны из других классов без необходимости использования экземпляра класса.

Строка «stageRef = stage» в основном устанавливает значение stageRef на этап. Вы получаете доступ к stageRef, просто называя «Main.stageRef». Вам нужен экземпляр сцены из-за строки «Main.stageRef.addEventListener (MouseEvent.MOUSE_UP, AddMoney); в классе HealthMoney. Событие mouse_up не будет работать должным образом, если вы только напишите «addEventListener (MouseEvent.MOUSE_UP, AddMoney)», так как фокус находится на сцене.

Линия «hmClass = new HealthMoney (addStuff);» отправляет экземпляр класса AddStuff в конструктор HealthMoney. Вам нужно это сделать, потому что, если вы напишете «addStuff1 = новый AddStuff», вы создадите новый экземпляр AddStuff, а новый экземпляр AddStuff не будет иметь мувиклипы, добавленные вами в основной класс, что сделает hittestobject не запускающим ,

+0

kinda имеет смысл, но все же это ошибка, которую я получаю TypeError: Ошибка # 1009: Не удается получить доступ к свойству или методу ссылки на нулевой объект. \t в HealthMoney/HealthTimer() \t на Main/AddHealth() \t в Main() , а затем здоровье и деньги просто исчезает – Lev

+0

Скажет ли она, какая линия? Потому что я просто попробовал, и он работал отлично для меня, когда я использовал файлы ... –

+0

nah, это просто показывает эту ошибку. я скопировал ошибку и вставил ее. – Lev

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