0

allererst Sie die Aufmerksamkeit von jemand danken der Lektüre dieser FrageActionscript 3: Charakter getroffen Testobjekt mit allen Objekten in Array

ich Indonesian bin, so entschuldige mich, wenn mein Englisch schlecht war.

Ich bin derzeit in einem Schulprojekt Touchscreen-Android-Spiel mit Flash ActionScript 3 oder Unity zu erstellen, mein aktuelles Projekt ist mit ActionScript 3 Flash. Meine aktuelle Arbeit ist ein Feeding Frenzy-ähnliches Spiel, das eine weibliche Taucherin beinhaltet welches eine unter Wasser fallende Fischbombe auslöschen wird.

Ich versuche den Taucher vor allen Bomben auf dem Bildschirm warnen zu lassen. Ich habe eine BombsLayer-Klasse, die eine RegularBomb-Klasse als zufällige x-Position bezeichnet. Alle RegularBomb-Instanzen werden in ein Array platziert, dann verwende ich für jede Schleife mit hitTestObject. Wenn der Taucher den transparenten Kreis innerhalb des Movieclips trifft, erscheint ein Ausrufezeichen und setzt den boolean readyToDefuse in der Taucherklasse auf true und wenn der Taucher ist weg von bombe wird der boolesche Wert auf false gesetzt und das Ausrufezeichen wird verschwinden.

Mein Problem ist der Taucher kann nur mit der letzten Bombe MovieClip Instace im Array interagieren. Als das erste Bombenkind in das Array kam und der Taucher es erreichte, erschien das Ausrufungszeichen, aber jedes Mal, wenn eine neue Bombe instanziiert wurde, verschwand das Ausrufungszeichen und ich musste den Taucher zur neuen Bombe bewegen, um das Zeichen zu erstellen erscheinen.

Ich habe den Vorschlag zu dieser Frage gelesen: AS3 - array hit test in 'for each' loop only works properly with last object in array, um die Else-Anweisung in der für jede Schleife zu entfernen, aber durch Entfernen wird es die ReadyToDefuse bleibt True und das Ausrufezeichen bleibt weiterhin angezeigt.

Ich habe eine Google-Suche gemacht und nichts scheint mein Problem zu beantworten, ich habe dieses Spiel bis zur Vorlage für eine Woche zu beenden und das hatte mich noch für diese letzten Tage verwirrt ..

hier ist meine komplette Code für die Bombslayer Klasse:

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; 
       } 
      } 
     } 
    } 
} 

benötigt, wenn ich auch das komplette Projekt vorstellen kann ..

All würde geschätzt hilft. Vielen Dank!

Antwort

0

Die Logik ist falsch. Du musst durch die Bomben stöbern und einen finden, der mit dem Taucher in Kontakt steht, und mit der einzigen Bombe arbeiten. Ansonsten ist der Taucher bereit, die Bombe A zu entschärfen, aber nicht bereit, B, C und D zu entschärfen und ist somit überhaupt nicht bereit.

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

Es funktioniert !! eigentlich ist es nur der Anfang, für jede Bombe erreicht und der Benutzer hält einen Entmagnetisierungstaster, der Indikator an der Bombenposition wird geladen und wenn es voll ist, verschwindet das Bombenkind und das Bombenkind wird aus dem Array entfernt. auch, nicht nur bomben, ich wollte die selbe interaktion mit gefährlichen meerestieren wie haien, quallen, seeschlange und kugelfisch machen, aber anstatt gewarnt zu werden, wenn der taucher eine von ihnen trifft, wird der gesundheitspunkt des taucher verringert . Muss ich das Gleiche tun? übrigens Vielen Dank !! –

+0

@AzmiFarhan Nein, die Logik der sofortigen Treffer wird anders sein. Stellen Sie es sich allgemein vor. Taucher sollten eine Bombe aussuchen und sich darauf vorbereiten, sie zu entschärfen. Dann würde ** irgendein ** gefährlicher Fisch den Taucher sofort schädigen, egal wie viele Fische es sein wird. – Organis

+0

also sollte ich meine vorherige Logik dann für die Fische verwenden? –