2016-10-30 1 views
2

Ich arbeite an einem Spiel und habe Probleme mit diesem Array. Es gibt alle Früchte auf der Bühne, die aus der Array-Frucht erzeugt werden. Wenn der Appel den Korb trifft, zählen wir sie. Die Melone ist nicht zu zählen. Wie finde ich heraus, ob das aktuelle Obst ein Apfel oder eine Melone ist?AS3 array indexOF

var array_fruit:Array = new Array(appel1_mc, appel2_mc, melon_mc); 
var appelsOnstage:Array = new Array(); 
var appelsCollected:Number = 0; 


for (var i:int = 0; i<10; i++) { 
    var pickappels = array_fruit[int(Math.random()* array_fruit.length)]; 
    var spel_appels:MovieClip = new pickappels(); 
    addChild(spel_appels); 
    spel_appels.x = (Math.random() * 800) + 100; 
    spel_appels.y = Math.random() * -500; 
    spel_appels.speed = Math.random() * 10 + 2; 
    appelsOnstage.push(spel_appels); 

} 


stage.addEventListener(Event.ENTER_FRAME, catchappels); 

function catchappels(e:Event):void { 

for (var i:int = appelsOnstage.length-1; i > -1; i--) { 
    var currentfruit:MovieClip = appelsOnstage[i]; 


    if (currentfruit.hitTestObject(basket_mc)) {   

     if(array_fruit.indexOf(currentfruit) == melon_mc){ 
       trace("melon"); 
      } else { 
       trace("no melon"); 
       appelsCollected++; 
      } 
    } 
} 
} 
+0

Was ist 'appelsOnstage'? – null

+0

ich hier etwas mehr Code zu setzen. AppelsOnstage ein Array ist die Appels auf der Bühne enthält. – Henrique

+0

array_fruit.indexOf (currentfruit) = -1 die ganze Zeit – Henrique

Antwort

0

a_fruit.indexOf (currentfruit) = -1 die ganze Zeit

Das Problem hier ist die Verwirrung zwischen den Klassen und Objekten.

  • a_fruit hält Klassen, die durch diesen Code

    var pickappels = array_fruit[int(Math.random()* array_fruit.length)]; 
    var spel_appels:MovieClip = new pickappels(); 
    
  • appelsOnstage hält Objekte dieser Klassen instanziiert werden sollen, und ist gefüllt hier

    appelsOnstage.push(spel_appels); 
    

Klassen und Objekte sind - Entschuldigung das Wortspiel! - Äpfel und Orangen, sehr verschiedene Dinge. Eine Klasse ist wie eine Blaupause für ein Gebäude oder ein Rezept für eine Mahlzeit. Sie können Objekte nicht mit Klassen vergleichen und erwarten, dass sie identisch sind.

Stattdessen sollten Sie die Klasse eines Objekts finden und dann diese Klasse mit einer anderen Klasse vergleichen. Verwenden Sie dazu die is operator. So etwas wie

if(currentfruit is melon_mc) 

sollte den Trick tun, um Ihnen zu sagen, ob Sie eine Melone haben oder nicht.

+0

die Ausgabe zeigte mir tatsächlich [Objekt melon_mc] und [Klasse melon_mc] also habe ich den Vorschlag von curretfruit == melon_mc auch ausprobiert und das gibt einen Fehler über static.flash.movieclip kann nicht mit Klassen vergleichen. – Henrique

+0

@Henrique Ich bin mir nicht ganz sicher, was Sie sagen wollen. Ich habe nie vorgeschlagen, 'currentfruit == melon_mc' zu verwenden. Ist Ihr Problem gelöst mit dem, was ich in meiner Antwort vorgeschlagen habe oder nicht? Wenn nicht was genau hast du versucht und was war der genaue Fehler, den du erhalten hast? – null

+0

Ok, danke für deine Hilfe. Ich werde ein anderes Array für die anderen Früchte machen. – Henrique

0

indexOf wird einen int Wert zurückzukehren. Sehen Sie meine Bearbeitung zu Ihrem Code unten.

if (currentfruit.hitTestObject(basket_mc)) {   
    if(array_fruit.indexOf(currentfruit) == 2){ 
     trace("melon"); 
    } else { 
     trace("no melon"); 
     appelsCollected++; 
    } 
} 

indexOf braucht zwei Argumente. Der erste ist das genaue Element, nach dem Sie suchen. Das zweite Argument ist die Indexposition, von der aus die Suche gestartet werden soll. Der Standardwert ist Position 0.

Siehe API-Dokumentation here. (Immer gut, um diese zuerst zu lesen).

+0

Sorry für meine lange Antwort @NealDavis Ich versuche mein Bestes zu verstehen Englisch :( Ich bin sicher, dass null und Sie haben eine bessere Antwort. :( – tatactic

+0

Können Sie mich verstehen, wenn ich auf Englisch schreibe ? Mit freundlichen Grüßen! Nicolas. – tatactic

+0

Sie tun ganz gut mit Englisch! Keine Notwendigkeit, sich zu entschuldigen. Wir sollten diese Kommentare auf die Hand, aber, denke ich. –

0

Sie sollten hier den Operator is verwenden, um die Codierung zu verbessern. Was wäre, wenn Sie die Positionen der Klassen in Ihren Arrays ändern würden?

if ((currentfruit is appel1_mc) || (currentfruit is appel2_mc)) { 
    // apple 
} 
0

Nur in Pseudo-Code, um einen möglichen Weg, um mit diesem Problem umzugehen. auf der Timeline:

import com.fruits.Fruit; 
import com.fruits.Melon; 
import com.fruits.Apple 
var fruit_1:Melon = new Melon(); 
var fruit_2:Apple = new Apple(); 
if(fruit_1 is Melon){ 
    trace("anyway my SuperclassName is : " + fruit_1.getType()); 
    trace (fruit_1.getMyType()); 
    trace(""); 
} 
if(fruit_2 is Apple){ 
    trace("anyway my SuperclassName is : " + fruit_2.getType()); 
    trace (fruit_2.getMyType()); 
    trace(""); 
} 

in com.Fruit.as:

package com.fruits { 
    public class Fruit { 
     import flash.utils.getDefinitionByName; 
     import flash.utils.getQualifiedClassName; 
     import flash.utils.getQualifiedSuperclassName; 
     public function Fruit() { 
      trace ("I'm a Fruit"); 
     } 
     public function getType():String{ 
      var type:String = getQualifiedSuperclassName(this) 
      var str:String = (type); 
      return str; 
     } 
    } 
} 

In com.Melon:

package com.fruits { 
    public class Melon extends Fruit { 
     import flash.utils.getDefinitionByName; 
     import flash.utils.getQualifiedClassName; 
     import flash.utils.getQualifiedSuperclassName; 
     public function Melon() { 
      super(); 
      trace ("Melon says : "); 
      trace (" because I'm Fruit and not happy to be a Melon"); 
      trace(""); 
     } 
     public function getMyType():String{ 
      var type:String = getQualifiedClassName(this) 
      var str:String = ("Im a " + type); 
      trace("Class said : I worth nothing because I'm an Fruit and not proud to be an Melon"); 
      str += "\n" + "but in fact I'm a " + getQualifiedSuperclassName(this) 
      return str; 
     } 
    } 
} 

In com.Apple:

package com.fruits { 
    public class Melon extends Fruit { 
     import flash.utils.getDefinitionByName; 
     import flash.utils.getQualifiedClassName; 
     import flash.utils.getQualifiedSuperclassName; 
     public function Melon() { 
      super(); 
      trace ("Melon says : "); 
      trace (" because I'm Fruit and not happy to be a Melon"); 
      trace(""); 
     } 
     public function getMyType():String{ 
      var type:String = getQualifiedClassName(this) 
      var str:String = ("Im a " + type); 
      trace("Class said : I worth nothing because I'm an Fruit and not proud to be an Melon"); 
      str += "\n" + "but in fact I'm a " + getQualifiedSuperclassName(this) 
      return str; 
     } 
    } 
} 

Dies ist nur eine Idee, sagen Sie mir mehr über Ihr Ziel und wenn diese Ihnen helfen kann ... Mit freundlichen Grüßen Nicolas.

PS: Es tut mir leid, aber mein Englisch ist wirklich schlecht. also habe ich versucht, mir das Problem zu erklären ...

Vielleicht können Sie indexOf vergessen und addChild jederzeit verwenden Sie wollen ein Objekt/Instanz über einen anderen setzen .... Sie müssen also nicht überprüfen die Indizes. addChild (ein altes Kind) wird das "alte Kind" auf den letzten Index setzen (über die anderen Instanzen). Entschuldigung, ich habe Ihren Code nicht geschrieben, aber der Titel besagt, dass Sie überprüfen möchten, ob die Frucht eine Melone oder ein Apfel ist ... Sorry, wenn ich falsch verstanden habe. :(

+0

Ich bin mir sicher, dass @null deine Frage verstanden hat, also lies ihn zuerst! Ich mache nur mein Bestes Dies ist eine gute Übung für mich – tatactic

+1

'indexOf' hat nichts mit Z-Reihenfolge zu tun (was ist, was Sie mit Ihrem' addChild' Kommentar beziehen). 'indexOf' bezieht sich auf die Indexposition in einem Array. Wie in 'var arr: Array = [6,5,4,3,2,1]; trace (arr.indexOf (6)); 'gibt '0' zurück, weil '6' an der 0. Position des Arrays steht. –

+0

Sorry @NealDavis, ich versuche mein Bestes zu verstehen und zu beantworten. Die meiste Zeit verstehe ich die Frage nicht wirklich. Ich versuche mein Bestes, um Englisch zu lernen und AS3 nicht zu vergessen, weil ich aus gesundheitlichen Gründen meine Arbeit einstellen musste. THX für Ihre Kommentare! Ich schätze sie wirklich! – tatactic