Maulwurf-Spiel...

SonMiko

Erfahrenes Mitglied
Hallo zusammen,

Ich bin derzeit damit beschäftigt ein "Maulwurf-Spiel" zu programmieren.
Es soll eines dieser Spiele werden, wo eine bestimmte Anzahl an Maulwurfslöchern zu sehen ist. Dann tauchen nach einander per Zufall aus den Löchern Köpfe auf, welche man anklicken muss um einen Punkt zu erhalten.

Davon bin ich aber noch ein Stück entfernt.

Derzeit habe ich folgendes Problem:
Ich erstelle dynamisch die besagten Löcher, kann diese aber nicht "ansteuern".

Code:
stop();

//Variablen
var feldanzahl:Number=20;
var feldanzahlx:Number=5;
var feldposx:Number=0;
var feldposy:Number=0;

//Rastererzeugung
_root.createEmptyMovieClip("felder_mc",this.getNextHighestDepth());
felder_mc._x=75;
felder_mc._y=20;

//---FELDERERZEUGUNG
for(i=1;i<=feldanzahl;i++){
	aktfeld_mc=felder_mc.attachMovie("feld_mc","feld_mc"+i,i);
	aktfeld_mc.feldnummer_txt.text=i;
	
//--Abstaende errechnet durch Breite und Höhe des Feldes
	feldbreite=aktfeld_mc._width;
	feldhoehe=aktfeld_mc._height;
	
//--Felder werden ausgerichtet
	if (feldposx<feldanzahlx) {
		aktfeld_mc._x = feldposx*feldbreite;
		aktfeld_mc._y = feldposy;
		feldposx++;
	} else {
		feldposx = 0;
		feldposy += feldbreite;
		aktfeld_mc._x = feldposx*feldbreite;
		aktfeld_mc._y = feldposy;
		feldposx++;
	}
	//Einzelne Feldfunktion
	aktfeld_mc.onEnterFrame=function(){
	aktfeld_mc.feldnummer_txt.text=random(500); //PROBLEM	}
	
}

//---MAUSZEIGER
_root.Mouse.hide();
_root.attachMovie("zeiger_mc", "zeiger_mc", this.getNextHighestDepth());
zeiger_mc._x=_root._xmouse;
zeiger_mc._y=_root._ymouse;
_root.onMouseDown=function(){
	_root.zeiger_mc.play();
}
_root.onMouseMove=function(){
_root.zeiger_mc._x=_root._xmouse;
_root.zeiger_mc._y=_root._ymouse;
_root.zeiger_mc._alpha=100;
}

Das Problem ist, dass beispielsweise die Funktion immer nur auf das letzte Feld angewendet wird. Klar - weil der Zähler "i" zuletzt bei der höhsten Zahl stehen geblieben ist - wie aber erreiche ich es, das ich trotzdem alle Felder ansteuern kann bzw. das überall diese besagte Funktion ausgeführt wird?

Kann oder wäre es sinnvoll wenn ich ein Array verwende?
Ansätze mit aktfeld_mc[i] habe ich schon versucht - leider erfolglos...


Wäre sehr dankbar für Hilfe.


Besten Gruß,


Mike
 
Hi,

Code:
aktfeld_mc.onEnterFrame=function() {
    this.feldnummer_txt.text=random(500);
}

Generell kannst Du zu einem späteren Zeitpunkt (egal, ob es sich um eine onEnterFrame-Methode oder z.B. ein Mausereignis handelt) nicht mehr sinnvoll auf die Variablen zugreifen, die in der Schleife verwendet werden.

in Funktionen, die auf einem bestimmten Objekt ausgeführt werden (z.B. onPress, onEnterFrame), bekommst Du mit "this" immer Zugriff auf das ausführende Objekt. In anderen Fällen kann es helfen, dem jeweiligen Objekt seinen Index selbst mitzugeben:
Code:
aktfeld_mc.idx = i;

aktfeld_mc.onPress = function() {
  trace("ich bin Nummer: " + this.idx);
}

Gruß

P.S.: "random(bereich)" ist veraltet - verwende Math.random() * bereich
.
 
Hallo Tobi

Vielen dank für die Antwort ;-).
Ich habe das ganze durchdacht und bin zu dem Entschluss gekommen, das Spiel nicht direkt dynamisch zu programmieren (das ist jetzt Interpretationssache).
Ich werde die einzelnen Figuren feste auf der Bühne unter einer Maske platzieren
und dann durch eine Variable mit einem Boolschen Wert steuern.

Ich habs mir einfach mal wieder zu schwer gemacht glaube ich.

Trotzdem habe ich aber zum zweiten Ansatz noch eine Frage.

Wieso, kann man manchmal die Figuren anklicken, und manchmal nicht?
Ich habe bemerkt das ich an einer Stelle etwas überschreibe womit ein jeweiliges Element nicht mehr ansteuerbar und ungültig wird - allerdings glaube ich, das dies schon zuvor eintritt...

Ich habe anbei mal die FLA gepostet.


Besten Gruß,

Mike
 

Anhänge

  • base.zip
    144,8 KB · Aufrufe: 18
Hi,

zum einen inkrementierst Du Deinen Zähler "i" zu früh: die onPress-Methode bezieht sich daher auf das nächste Objekt (welches idr. noch nicht existiert).

Zum anderen machst Du genau das, wovon ich weiter oben gesprochen habe: Du greifst in der onPress-Methode (die auf einem MC liegt) auf die Laufvariable "i" zu, welche an dieser Stelle nicht mehr auf das aktuelle Objekt zeigt:
Code:
 _root["kopf_mc"+i].onPress=function(){
    _root["kopf_mc"+i].removeMovieClip();
Korrekt wäre z.B.:
Code:
_root["kopf_mc"+i].onPress=function(){
    this.removeMovieClip();

Der Code in den nachfolgenden Zeilen würde dann aber nicht mehr ausgeführt werden, da Du den Clip, auf dem der Code existiert, ja entfernst. Du musst daher die removeMovieClip-Methode ans Ende der Funktion setzen.

Du setzt "i" wieder auf 0, sobald die Variable den Wert "gleichzeitig" überschreitet - der Clip, der zu diesem Zeitpunkt den Index "0" hat, kann aber noch existieren; Du hast dann zwei Objekte dieses Namens auf der Bühne, wodurch unklar wird, auf welches sich Dein Mausereignis bezieht.

Wofür diese Zeile ist:
Code:
_root.createEmptyMovieClip("containerclip_mc",this.getNextHighestDepth());
, habe ich nicht herausfinden können.

Ausserdem ist Deine Art des Einrückens - vosichtig ausgedrückt - recht kreativ: Es ist daher nicht immer leicht zu erkennen, welche Zeile nun zu welcher Bedingung gehört ...

Gruß
.
 
Hallo Tobias...

Ja so ein Chaos - da hast Du allerdings recht.
Vielen Dank für die Hilfe. Ich shcätze ich muss mir echt angewöhnen
sehr viel intensiver über die Abläufe nachzudenken, bevor ich etwas versuche umzusetzen.
Ein Struktogram sollte mir da Abhilfe verschaffen...

Häufige Fehler bei mir sind eben diese, das ich etwas vom Programm verlange das noch nicht existiert und/ oder schon wieder weg ist.
Da muss mein Gedankengang irgendwie noch in die verkehrte Richtung gehen...

Ich muss mir dazu einmal ansehen wie FlashCode verarbeitet wird.

Die letzte Codezeile von der Du sprachst... Sie sollte eigentlich all die generierten Clips in eine Art Container packen - eben den generierten Container - angefangen und nicht zuende gebracht.


Ich habe aber noch eine kurze Frage, wenn es nicht stört oder gar nervt:
Wurde die Funktion "play()" irgendwie in CS3 modifiziert?
Immer wenn ich play() anwende, kann ich es mit stop() nicht mehr stoppen - der Clip läuft unaufhörlich weiter...


Vielen lieben Dank,

Besten Gruß,


Mike
 
Hi Tobi,

schon okay, lag tatsächlich an Flash. War ein Bug.
Ich hatte im ersten Schlüsselbild unter einer Bedingung ein "play();" eingefügt.
Dieses wollte ich dann mit einem "stop();" abfangen, was nicht möglich war.
Da habe ich alles abgespeichert, Flash beendet, neu gestartet und siehe da es ging bzw. geht wieder.

Im betrieb setzen wir CS3 ein, zuhause habe ich alleridngs nur eine Lizenz für Flash 8 Professional. Auf mich wirkt CS3 nicht wesentlich "besser" - definitiv einfacher sind die Gruppierungen der einzelnen Elemente (Toolbars, Info, Farbfelder etc. meine ich).

Setzt Du eigentlich AS3 ein (kann man doch auch ohne CS3 ausgeben - oder?)?


Vielen Dank für die Hilfe Tobi


Besten Gruß,

Mike
 
Setzt Du eigentlich AS3 ein?
Bisher nicht, da ich noch keinen wirklichen Mehrwert darin sehe. Vielleicht ändert sich das, wenn ich auf CS3 umsteige.

Wenn ich ehrlich bin, arbeite ich noch nicht einmal bei allen Projekten mit AS2.0-Klassen. ;)

Gruß
.
 
Hi Tobi...

das Neueste vom Neuesten ist auch nicht immer das Beste vom Besten.
Die Vorteile von CS3 werden für mich nun langsam ersichtlich.
So wurde beispielsweise vieles an den Dateiformat-Kompatibilitäten getan,
was mich sehr freut, aber nicht wirklich überrascht - im Gegenteil, schließlich
kommt ja alles bei Adobe aus einem Haus.

Mein Spiel ist übrigens fast fertig ;).


Besten Gruß,

Mike
 
Zurück