0

d'abord vous remercier de l'attention de tous ceux qui liront cette questionActionScript 3: caractère frappé objet de test avec tous les objets dans le tableau

Je suis indonésienne, alors excuse si mon anglais était mauvais.

Je suis actuellement dans un projet d'école en créant un jeu Android tactile utilisant Flash ActionScript 3 ou Unity, mon projet actuel est fait en utilisant Flash avec ActionScript 3. Mon travail actuel est un jeu Feeding Frenzy qui implique une plongeuse. ce qui annihilera une bombe de poisson tombant sous l'eau. J'essaie de mettre en garde le plongeur pour toutes les bombes à l'écran. J'ai une classe BombsLayer qui appellera une classe RegularBomb pour tomber en position x aléatoire. Toutes les instances de RegularBomb sont placées dans un tableau, puis je les utilise pour chaque boucle avec hitTestObject, donc si le plongeur frappe le cercle transparent à l'intérieur du MovieClip, un signe d'exclamation apparaîtra et placera le readyToDefuse boolean dans la classe diver à true, et quand le plongeur est loin de la bombe, le booléen sera mis à faux, et le signe d'exclamation disparaîtra.

Mon problème est que le plongeur ne peut interagir qu'avec la dernière installe de movieclip de bombe dans le tableau. Quand le premier enfant de la bombe a ajouté dans le tableau et que le plongeur l'a atteint, le signe d'exclamation apparaissait, mais chaque fois qu'une nouvelle bombe instanciait le signe d'exclamation disparaissait et je devais faire passer le plongeur à la nouvelle bombe instanciée pour faire le signe apparaître. J'ai lu la suggestion sur cette question: AS3 - array hit test in 'for each' loop only works properly with last object in array pour supprimer l'instruction else dans la pour chaque boucle, mais en la supprimant, ReadyToDefuse reste vrai et le signe d'exclamation reste affiché.

je l'ai fait une recherche google et rien ne semble répondre à mon problème, je dois finir ce jeu pendant une semaine jusqu'à ce que la présentation et cela me avait conduite confus ces derniers jours ..

voici mon code complet pour la Bombslayer classe:

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

    public class BombsLayer extends MovieClip{ 
     public var area:Sprite; 
     public var bombs:Array; 
     public var bomb:RegularBomb; 
     public var bombground:BombGround; 
     public var diver:Diver; 
     public var warner:BombWarn; 

     public function BombsLayer(character:Diver, warn:BombWarn){ 
      // constructor code 
      area = new Sprite(); 
      area.graphics.beginFill(000000, 0); 
      area.graphics.drawRect(0,0,2200,720); 
      area.graphics.endFill(); 
      addChild(area); 

      diver = character; 
      warner = warn; 

      bombs = new Array(); 
      var newBomb = new RegularBomb(Math.random()*area.width, diver, warner); 
      bombs.push(newBomb) 
      addChild(newBomb); 

      bombground = new BombGround(0, 670, this); 
      addChild(bombground); 

      this.addEventListener(Event.ENTER_FRAME, moveBomb); 
     } 
     function moveBomb(event:Event){ 
      if(Math.random() <= 0.0005){ 
       var newBomb = new RegularBomb(Math.random()*area.width, diver, warner); 
       bombs.push(newBomb) 
       addChild(newBomb); 
      } 
      for each(var bomb:RegularBomb in bombs){ 
       bomb.moveDown(); 
       if(diver.hitTestObject(bomb)){ 
        warner.visible = true; 
        diver.readyToDefuse = true; 
       } 
       else{ 
        warner.visible = false; 
        diver.readyToDefuse = false; 
       } 
      } 
     } 
    } 
} 

si besoin je peux télécharger le projet complet aussi ..

Tout aide serait appréciée. Merci!

Répondre

0

La logique est incorrecte. Vous devez parcourir les bombes et en trouver un en contact avec le plongeur le cas échéant, et travailler avec la seule bombe. Sinon, le plongeur est prêt à désamorcer la bombe A mais pas prêt à désamorcer B, C et D et n'est donc pas prêt du tout.

function moveBomb(event:Event) 
{ 
    var aBomb:RegularBomb; 

    if (Math.random() <= 0.0005) 
    { 
     aBomb = new RegularBomb(Math.random() * area.width, diver, warner); 
     bombs.push(aBomb) 
     addChild(aBomb); 
    } 

    for each(aBomb in bombs) aBomb.moveDown(); 

    // Find bomb in diver's vicinity. 
    aBomb = findBomb(); 

    // The same as "if (aBomb != null)" 
    if (aBomb) 
    { 
     warner.visible = true; 
     diver.readyToDefuse = true; 
    } 
    else 
    { 
     warner.visible = false; 
     diver.readyToDefuse = false; 
    } 
} 

function findBomb():RegularBomb 
{ 
    for each(var aBomb:RegularBomb in bombs) 
     if (diver.hitTestObject(aBomb)) 
      return aBomb; 

    return null; 
} 
+0

Cela fonctionne !! En fait c'est juste le début, pour chaque bombe atteinte et l'utilisateur tient un bouton de désamorçage l'indicateur de la bombe chargera et quand il sera plein, l'enfant de la bombe disparaîtra et l'enfant de la bombe sera retiré du tableau .. aussi, pas seulement des bombes, je voulais faire une même interaction avec des créatures marines dangereuses comme les requins, les méduses, les serpents et les poissons-tampons, mais au lieu d'être averti, quand le plongeur touche l'un d'entre eux, . dois-je faire la même chose? au fait Merci beaucoup !! –

+0

@AzmiFarhan Non, la logique des hits instantanés sera différente. Pensez-y en termes généraux. Le plongeur doit choisir une bombe et se préparer à la désamorcer. Ensuite, ** tout ** poisson dangereux endommagerait le plongeur instantanément, quel que soit le nombre de poissons qui seront. – Organis

+0

alors devrais-je utiliser ma logique précédente alors pour les poissons? –