Shooter Spiel (Alpha Wing Style) Problem mit Action Script

  • Themenstarter Themenstarter ByeBye 148134
  • Beginndatum Beginndatum
B

ByeBye 148134

Hallo zusammen!
Ich habe nun das Forum durchforstet aber keine Lösung gefunden :google:, darum werfe ich mein Problem mal hier in den Raum und hoffe, jemand kann mir helfen!
Ich bin gerade dabei, ein Arcade Weltraumshooter zu programmieren (der ein oder andere kennt vielleicht Alpha Wing o.ä.).
Die Grafiken sind bis jetzt einfach gehalten, ich habe noch Probs mit AS.
Das Raumschiff (schwarzes Rechteck) lässt sich mit der Maus steuern. Dauerfeuer gibt es mit Leertaste. Der rote Kreis ist ein Gegner.
Nun hier das Problem: Nur die erste Kugel spricht den Hittest an. Daraufhin sollte die Kugel removed werden, der Hittest wird aber 6 mal registriert.
Die nachfolgenden Kugeln werden bei Hittest auch gelöscht, es werden aber keine damageschäden abgezogen.
Schaut euch mein (bisheriges) Werk mal an. Ich hoffe jemand kann mir helfen!

Greetz, CrazyBread
 

Anhänge

  • 1.zip
    1.zip
    23,1 KB · Aufrufe: 39
Hallo,

ich an deiner Stelle würde bloss einen auf dem Gegner durchführen, der dann auch das Entfernen der Kugeln handelt. Ansonsten läufst du daurend Gefahr, dass der HitTest auf der Kugel zuerst eintrifft und fie Kugel entfernt wird bevor der Gegner seinen hitTest ausführt.
Dann würde ich sämtliche Kugeln, die aktuell herumschwirren in ein Array speichern bzw. aus dem Array entfernen, sobald sie nicht mehr aktuell sind. Dann kannst für jeden Gegner sauber jede Kugel testen.
Als letztes würde ich die Playerversion erhöhen, der 6er ist ja nun mal wirklich passé, Version 7 oder 8 würden dir auch performancemässig helfen.

Gruss
 
Danke, das ist schonmal ein Anfang, ich werde das mal versuchen umzusetzen!!

Leider muss ich mit der Version 6 auskommen, ich arbeite mit Flash MX und da kann ich keine höhere Version einstellen...
 
Zuletzt bearbeitet von einem Moderator:
So ich hab das jetzt umgesetzt, funktioniert aber perforamancetechnisch überhaupt nicht. Ich habe das nun mit 10 if - Bedingungen umgesetzt, damit tut es einwandfrei.
Ich habe die Möglichkeit mit dem Array dringelasssen und auskommentiert.
Nächstes Problem: Wenn Health == 0 ist sollte der Gegner verschwinden, tut er aber nicht. Woran liegt das nun wieder?
 

Anhänge

  • 1.zip
    1.zip
    30,1 KB · Aufrufe: 23
Hallo,

du musst die Elemente natürlich aus dem Array entfernen, sonst wirds übel, das ist klar. Ich würde dir ja gerne die Datei posten, aber CS3 ist nicht so abwärtskompatibel.

Deshalb hier die Modifikationen, die ich vorgenommen habe als Code.
Code auf dem Gegner-Clip:
Code:
onClipEvent (load) {
	//Gesundheit des Gegners, bei jedem Schuss wird diese Zahl verringert, bei null, ist das Schiff zerstört
	Health = 30;
	
	//MovieClips, die im Zeichnungsmodus auf die Bühne gelegt wurden, 
	//haben immer negative Tiefenebenen-Werte und können nicht per 
	//removeMovieClip entfern werden.
	//Deshalb setzen wir hier mal eine praktikable Tiefenebene
	this.swapDepths (999);
}
onClipEvent (enterFrame) {
	var l = _root.control.schussarray.length;
	while (l--) {
		var bullet = _root.control.schussarray[l];
		
		//Wenn Kugel diesen Gegner trifft
		if (this.hitTest(bullet)) {
			Health--;
			trace ("Getroffen. Gesundheit bei "+Health);
			_root.control.schussarray.splice(l, 1);
			bullet.removeMovieClip();
			
		//Wenn Kugel oberhalb des Bühnenrands landet.
		} else if (bullet.y < 0) {
			_root.control.schussarray.splice(l, 1);
			bullet.removeMovieClip();
		}
	} 
	
	//Wenn Gegner keine Leben mehr hat.
	
	if (Health < 1) {
		this.removeMovieClip();
	}
}

Code auf dem control-Clip:
Code:
onClipEvent(load){
	schleife = 0;
	bulletNum = 0;
	schussarray = new Array();
}

onClipEvent (enterFrame) {
	schleife--;
	if (key.isDown(32)) {
		if (schleife < 0) {
			//Die höchste mögliche Tiefenebene für Kugeln
			bulletNum = schussarray.length;
			
			var bullet = _root.bullet.duplicateMovieClip("bullet"+bulletNum, bulletNum);
			schussarray.push(bullet);
			// set the coords to the mouse clik
			Zufall = Math.random()*20;
			bullet._x = _root.Ship._x-10+Zufall;
			bullet._y = _root.Ship._y-50;
			// increment the bullet number
			schleife = 5;
		}
	}
}

Gruss
 
Zuletzt bearbeitet:
Ahh okay das mit den negativen Ebenen wußte ich nicht...

Gut ich werde das mal einpflegen und schauen wie es kommt, wenn ich mehrere Gegner erzeuge, die sich bewegen und auch zurückschiessen.

Ich merke gerade, das projekt wird größer als ich am Anfang dachte! Aber ich bleib dran, ist eine gute Übung (ich bringe mir AS in Eigenregie bei)!

Ich lass von mir hören, wenn es wieder etwas neues gibt!
Thx, luke!
 
Zurück