Antworten auf deine Fragen:
Neues Thema erstellen

Antworten zum Thema „kompliziertes Problem mit AS: Aliens beamen sich einfach weg“

S

shadow_eye

Guest

Hallo liebe Community!
Ich habe mal wieder ein seltsames Problem mit AS:
Zurzeit programmiere ich einen einfachen shooter in Flash, Aliens tauchen auf, bewegen sich und werden abgeschossen.
Jedoch passiert genau das, was ich nicht möchte.
Die Aliens tauchen auf, und verschwinden wieder, einfach so.
Woran kann das liegen?
Ich schreibe hier mal den gesamten code, bitte habt die Geduld, euch das durchzulesen, ich weiß wirklich nicht weiter.
Vielen Dank schonmal, ich freue mich über jede Antwort!

Code:
stop();
//Die Zeitanzeige
_root.Zeit = 90;
//Der Punktestand
_root.score = 0;
//Eine Hilsvariable
_global.counter = 0;
//Die Bewegungsfunktion des Mauszeigers, countdown der Zeit
_root.Fadenkreuz1.onEnterFrame = function() {
	this._x = _xmouse;
	this._y = _ymouse;
	if (_root.Zeit == 0) {
		gotoAndStop(2);
	} else {
		if (counter<12) {
			counter++;
		} else {
			_root.Zeit--;
			counter = 0;
		}
	}
};
//Funktion, die feststellt, ob noch Plätze für Aliens verfügbar sind und diese zurückgibt.
function Alienkoordination() {
	if (!Alien1) {
		return 1;
	} else if (!Alien2) {
		return 2;
	} else if (!Alien3) {
		return 3;
	} else if (!Alien4) {
		return 4;
	} else {
		return 0;
	}
}
this.onEnterFrame = function() {
	if (Hilfsvariable1=Alienkoordination()) {
		Hilfsvariable2 = _root.attachMovie("Alien"+Math.ceil(Math.random()*3), "Alien"+Hilfsvariable1, Hilsvariable1);
		Hilfsvariable2._x = Math.ceil(Math.random()*800);
		Hilfsvariable2.zielx = Math.ceil(Math.random()*800);
		Hilfsvariable2._y = Math.ceil(Math.random()*600);
		Hilfsvariable2.ziely = Math.ceil(Math.random()*600);
		Hilfsvariable2.onEnterFrame = function() {
			if (this._currentframe>=48) {
				this.removeMovieClip();
			} else {
				//Das Alien wird um den Bruchteil seiner Gesamtbewegung bewegt.
				this._x += (this.zielx-this._x)/this._currentframe;
				this._y += (this.ziely-this._y)/this._currentframe;
			}
		};
		Hilfsvariable2.onMouseUp = function(){
			score++;
			this.removeMovieClip();
		};
	}
};
Hoffentlich ist das nicht zu viel.
 

h_seldon

Aktives Mitglied

Hallo,

merkwürdig, habe gestern schon geantwortet, die Antwort ist aber leider weg. Also hier noch mal:

war es nicht Konfuzius, der schon vor Tausenden von Jahren forderte: "Stellt die Namen richtig!". Bezog er sich damit vielleicht auf einen häufigen Fehler, nämlich Namenskuddelmuddel wie "Hilsvariable1", obwohl "Hilfsvariable1" gemeint ist? Das berühmte copy and paste vermeidet Schreibfehler, denn Flash hüllt sich in solchen Fällen leider in vornehmes Schweigen, während andere IDEs einem vor Wut geradezu ins Gesicht springen möchten. Nach einer Korrektur werden immerhin Aliens eingeblendet.

Insgesamt hat das Skript allerdings noch die eine oder andere Problematik zu bewältigen (mal abgesehen von der Logik):

- die Bedingung if (Hilfsvariable1=Alienkoordination()) liest Flash als Zuweisung (= Zuweisungsoperator statt korrekterweise == Vergleichsoperator).
- function Alienkoordination() gibt nur 1 zurück, weil keine Variable namens Alien1, Alien2 etc existiert, demzufolge diese undefined sind und damit die erste Bedingung für Flash erfüllt ist - ergo Rüchgabewert 1. Das kannst Du im this.onEnterFrame testen mit: trace("Alienkoordination(): "+Alienkoordination())
- man sollte möglichst die Anzahl der enterFrame-Ereignisse reduzieren, da sie resourcenintensiv sind. Die Bewegung des Fadenkreuzes kann also getrost in das this.onEnterFrame integriert werden. Besser wäre noch, ein eigenes, übergeordnetes Objekt, z.B. this.createEmptyMovieClip("game",this.getNextHighestDepth()), einzurichten, das dann alle spielbezogenen Elemente aufnimmt und das benötigte enterFrame ausführt. Man kapselt damit alles, was sich auf das Spiel bezieht, von allen anderen Elementen ab, so daß sie sich nicht in die Quere kommen und sich der Code einfach in andere Anwendungen integrieren läßt. Ist das Spiel zu Ende, muß man nur diesen einen mc löschen, und man ist alles auf einen Schlag los. Wichtig: dabei sollte der Bezug zu _root entfallen, der in Deinem Script auch in keinem Fall notwendig ist.
- Deine Zeitkontrolle ist etwas merkwürdig und zudem abhängig von der Geschwindigkeit, mit der auf dem Zielrechner das enterFrame ausgeführt wird. Präziser wäre ein intervZeit = setInterval() oder einfacher eine Variable, die im enterFrame (falls Du es beibehalten willst - es ist ja nicht prinzipiell verkehrt) von 1000 auf 0 gezählt wird. Dann spart man sich zumindest die counter-Variable.
- Ist die counter-Variable, falls Du sie doch verwenden willst, unbedingt explizit als Globale anzulegen? Wozu? Als Zeitleistenvariable ist sie doch ohnehin global, zumindest für jedes Objekt, das inerhalb dieser Zeitleiste existiert. Ich kenne den Aufbau Deiner Anwendung nicht, vermute aber, ein counter = 0 reicht anstelle _global.counter = 0.
- Nicht so ganz verstanden habe ich die Sache mit Alien1, Alien2 etc. Wenn damit festgestellt werden soll, welches Alien sich schon auf dem Monitor tummelt, dann bietet sich ein Array an: game.aAliens = []. Bei jedem Einfügen eines neuen Alien kommt es, falls noch nicht im Array vorhanden, eben dort hinein.

Hoffentlich kannst Du etwas mit den Anmerkungen anfangen ...
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Statistik des Forums

Themen
175.155
Beiträge
2.581.853
Mitglieder
67.221
Neuestes Mitglied
opaklaus
Oben