Hilfe bei Gegnerzahl in Spiel

Jens B.

Erfahrenes Mitglied
Hallo!

Ich habe ja, wie hier (hoffentlich vielen) bekannt ist, angefangen, einen Tutorial für den Contest zu schreiben. Jetzt bin ich aber an ein Problem gestossen: Ich habe nur einen Gegner und ich weis nicht wie ich die vermehre!

Ich habe mein ganzes Wissen eingesetzt und jetzt schon eine Woche herumprobiert und ich habe keine Ahnung wie das geht. Naja, im Prinzip weiß ich es schon, aber es funktioniert nicht!

Anbei ist die FLa- Datei. Der "Ball-Gegner" soll 3 mal kommen - kann mir da jemand helfen ?

Mfg
 
Hää wieso ist die Flashdatei nicht angehängt?

// EDIT

Kann mir mal einer sagen wieso ich das nicht hochladen kann ? Ist doch ein zip-File!
 
Zuletzt bearbeitet:
Hi,

ich würde den Gegner (sofern es sich um ein Objekt handelt), mehrfach instanzieren und bei Bedarf in ein Array legen.
Dann kann ich alle Gegner mit einer Schleife steuern:
Code:
for (i = 0; i < gegner_anzahl; i++) {;
gegner[i].do_action();
gegner[i].trace_hits();
}

Ob das bei Deinem Script Sinn macht, kann ich allerdings nicht sagen - warten wir mal ab, bis das .zip hochgeladen ist.
 
Danke erstmal für die Hilfe. Genau so dachte ich auch dass es geht - leider nicht.

Leider ist die Datei zu groß :( aber ich werde sie irgendwie schon zu euch bekommen
 
Na ja,

bei mir hat es jedenfalls funktioniert (siehe Invaders). Dort hatte ich (glaube ich) 9 Instanzen des gegner-MCs über den oberen Rand der Bühne gelegt (durch Maske erstmal unsichtbar), und ihnen dann bei Bedarf eine Anfangsposition und -Geschwindigkeit zugewiesen.
Die aktiven Gegner werden dann in einer Schleife durchlaufen, um zu testen, ob sie mit dem Laser kollidieren, bzw. den unteren Bildschirmrand passieren (allerdings greifen diese Gegner nicht "aktiv" an - sie fallen nur runter...).

Falls es Dich interessiert, kann ich ja mal einen Codeausschnitt posten.


P.S.: Ich hatte die Gegner-Objekte im Film plaziert, weil ich damals noch nicht raushatte, wie ich MCs sinnvoll dynamisch erzeugen kann - dadurch ist die Anzahl natürlich festgelegt. Man kann natürlich auch dynamische MCs in ein Array hineinpacken.
 
Zuletzt bearbeitet:
Moin!

Hier ist jetzt der ActionScript, bei Fragen dazu bitte einfach fragen. Ich habe es einfach nicht hinbekommen, das File hochzuladen, irgendwie funktioniert das alles nicht. Wer es versuchen will, es befindet sich unter der Domain "mitglied.lycos.de/eminemstinkt" im Hauptverzeichnis und hat den Namen "Spiel.zip" - ich konnte noch nichtr herausfinden, wie man darauf zugreift!

PHP:
/////////////////////////////////////////////7
// Gegner! 
//////////////////
//Gegnername: "Ball" 
// Lasername: "Laser" 
// Raumschiffname: "Raumschiff"
/////////////////////////////////////////////
onClipEvent (load) {
function zuruecksetzen(){
this._x=635;
this._y=random(250)+100;
BallSchnell=random(6)+1;
}

zuruecksetzen();
}

onClipEvent (enterFrame) {
if (_root.Raumschiff.scrollStart){
this._x-=BallSchnell+_root.Sterne.Sternenfeldgeschwindigkeit;
} else {
this._x-=BallSchnell;
}
if (this._x<-10) {
zuruecksetzen();
}
}

/////////////////////////////////////////////////
//Laser
////////////////////////////////////////////////
onClipEvent (load) {
 laserGeschwindigkeit=20;
 this._y=_root.Raumschiff._y+13;
 this._x=_root.Raumschiff._x+80;
}
onClipEvent (enterFrame) {
this._x+=LaserGeschwindigkeit;
if (this._x>600){
this.removeMovieClip();
}
if (this.hitTest( _root.Ball)){
_root.score+=100;
_root.Ball.gotoAndPlay(21);
}
}

////////////////////////////////////////////////////////////////////////7
// Raumschiff
////////////////////////////////////////////////////////////////////////
onClipEvent(load) {
Geschwindigkeit = 10;
scrollx=_root.Sterne.Sternenfeld._width/2;
scrollStart=false;
_root.Laser._visible=false;
LaserZahl=1;
Ballkontakt=0;
Zeitbegrenzung=0;
_root.score = 0;
}

onClipEvent (enterFrame) {
if (this.hitTest( _root.Ball)) {
Ballkontakt = 1;
Zeitbegrenzung = getTimer();
_root.score -= 1000;
_root.Ball.zuruecksetzen();
this.gotoAndPlay(2);
if(_root.Energie.Energiestand<6) {
_root.Energie.Energiestand+=1;
_root.Energie.gotoAndPlay(_root.Energie.Energiestand);
}
if(_root.Energie.Energiestand==6) {
_root.gotoAndPlay("Game Over");
}
}
if(Zeitbegrenzung+5000<getTimer()) {
Ballkontakt=0;
this.gotoAndPlay(1);
}
if(Key.isDown(Key.SPACE)) {
if(Ballkontakt==0) {
laserZahl++;
_root.laser.duplicateMovieClip( "laser"+laserZahl, laserZahl );
_root["laser"+laserZahl]._visible=true;
}
} 
if (Key.isDown(Key.RIGHT)) {
if (this._x<scrollx){
this._x+=Geschwindigkeit;
} else {
scrollStart=true;
}
}
else if (Key.isDown(Key.LEFT)) {
this._x-=Geschwindigkeit;
}
if (Key.isDown(Key.DOWN)) {
this._y+=Geschwindigkeit;
} 
else if (Key.isDown(Key.UP)) {
this._y-=Geschwindigkeit;
}
}

onClipEvent (keyUp) {
 if (Key.getCode() == Key.RIGHT) {
 scrollStart=false;
 }
}

Joa. Mehr kann ich im Moment auch nich schreiben :) .

Mfg
 
Zuletzt bearbeitet:
Tja...

wie gesagt, ich würde die Bälle in ein Array packen:
Code:
for (i=0; i<max_baelle; i++) {
  ball[i]="Ball"+i;
  containerclip.createEmptyMovieClip(ball[i], i);
  ball[i].attachMovie("ball", "ball"+i, 1);
}

dann könnte man im Laser folgendermaßen testen:

Code:
for (i=0; i<max_baelle; i++) {
if (this.hitTest( _root.ball[i])){ 
_root.score+=100; 
_root.ball[i].gotoAndPlay(21); 
}

Ob die Zuweisung im ersten Codeblock so funktioniert, bin ich nicht sicher:
schlimmstenfalls müsste man die Bälle "per Hand" definieren:
Code:
for (i=0; i<max_baelle; i++) {
  ball[i]= new Object();
  container.attachMovie("ball", "ball"+i, i);
  ball[i]=eval(ball+i)
}
 
Habe ein neues Problem!

Und zwar habe ich jetzt einen zweiten Gegner hinzugefügt - eine Schnecke. Sie ist von AS eigentlich genau so wie der Ball, nur mit anderen Namen, die zur Schnecke passen, die aber hier nicht wichtig sind.

Ich habe dabei das Problem, dass das neue Bild des RAUMSCHIFFES nicht angezeigt wird. Es soll sich bei einer Kollision mit der Schnecke, wie auch beim Ball, verändern. Es funktioniert einfach nicht.

Naja, es funktioniert schon, aber nur, wenn man vorher schonmal mit dem Ball kollidiert ist und das geht natürlich nicht. Was mache ich Falsch ?

PHP:
onClipEvent(load) {
	Geschwindigkeit = 10;
	scrollx=_root.Sterne.Sternenfeld._width/2;
	scrollStart=false;
	_root.Laser._visible=false;
	LaserZahl=1;
	Ballkontakt=0;
	Schneckenkontakt=0;
	Zeitbegrenzung=0;
	_root.score = 0;
}

onClipEvent (enterFrame) {
		if (this.hitTest( _root.Ball)){							
				Ballkontakt = 1;								
				Zeitbegrenzung = getTimer();
				_root.score -= 1000;
				_root.Ball.zuruecksetzen();						
				this.gotoAndPlay(2);							 
												
				if(_root.Energie.Energiestand<6) {					
					_root.Energie.Energiestand+=1;				
					_root.Energie.gotoAndPlay(_root.Energie.Energiestand);	
				}

				if(_root.Energie.Energiestand==6) {					
					_root.gotoAndPlay("Game Over");															}
		}
		if (this.hitTest( _root.Schnecke)){							
				Schneckenkontakt = 1;								
				ZeitSchnecke = getTimer();
				_root.score -= 750;
				_root.Schnecke.zuruecksetzen();						
				this.gotoAndPlay(3);	// Das hier will einfach nicht funktionieren						 
												
				if(_root.Energie.Energiestand<6) {					
					_root.Energie.Energiestand+=1;				
					_root.Energie.gotoAndPlay(_root.Energie.Energiestand);	
				}

				if(_root.Energie.Energiestand==6) {					
					_root.gotoAndPlay("Game Over");															}
		}

	if(Zeitbegrenzung+5000<getTimer()) {
		Ballkontakt=0;
		this.gotoAndPlay(1);
	}
	if(ZeitSchnecke+15000<getTimer()) {
		Schneckenkontakt=0;
		this.gotoAndPlay(1);
	}


	if(Key.isDown(Key.SPACE)) {
		if(Ballkontakt==0) {
			laserZahl++;
		 	_root.laser.duplicateMovieClip( "laser"+laserZahl, laserZahl );
		 	_root["laser"+laserZahl]._visible=true;
		}
 	} 
	if (Key.isDown(Key.RIGHT)) {
 		if(Schneckenkontakt==0) {
			if (this._x<scrollx){
				this._x+=Geschwindigkeit;
			} else {
				scrollStart=true;
			}
		}
		if(Schneckenkontakt==1) {
			this._x-=Geschwindigkeit;
		}
	}
	else if (Key.isDown(Key.LEFT)) {
 		if(Schneckenkontakt==0) {
			this._x-=Geschwindigkeit;
		}
		if(Schneckenkontakt==1) {
			if (this._x<scrollx){
				this._x+=Geschwindigkeit;
			} else {
				scrollStart=true;
			}
		}
	}
	if (Key.isDown(Key.DOWN)) {
	 	if(Schneckenkontakt==0) {
			this._y+=Geschwindigkeit;
		}
		if(Schneckenkontakt==1) {
			this._y-=Geschwindigkeit;
		}
	} 
	else if (Key.isDown(Key.UP)) {
		if(Schneckenkontakt==0) {
			this._y-=Geschwindigkeit;
		}
		if(Schneckenkontakt==1) {
			this._y+=Geschwindigkeit;
		}
	}
}

onClipEvent (keyUp) {
	 if(Schneckenkontakt==0) {
		 if (Key.getCode() == Key.RIGHT) {
		 	scrollStart=false;
	 	}
	 }
	 if(Schneckenkontakt==1) {
		 if (Key.getCode() == Key.LEFT) {
		 	scrollStart=false;
	 	}
	 }
}

Danke schonmal für die Hilfe
 
Hi,

was genau funktioniert nicht: Die Änderung am Score, die Reaktion des Schiffes?

So ein Fehler kann an vielen Stellen liegen (auch im AS der Objekte Ball und Schnecke - vielleicht wird dort eine globale Variable unbemerkt verändert?), auf den ersten Blick kann ich in dem Script nichts eklatantes erkennen - kannst Du das ganze mal irgendwie posten oder so?

2 Dinge sind mir auf die Schnelle aufgefallen:

1.) Beim Schneckenkontakt springt der Clip "Schiff" auf Bild 3, beim Ballkontakt allerdings auf Bild 2 - ist das gewollt?

2.) Die Variable "ZeitSchnecke" ist nirgendwo anders referenziert - da es sich um eine lokale Variable des Objektes "Schiff" handelt, muss sie in anderen Objekten auch korrekt adressiert werden (z.B. _parent.schiff.ZeitSchnecke), ist das der Fall?

MfG
 
Hi!

1. Ja, das ist gewollt und ganau da liegt das Problem: der MovieClip springt einfach nicht auf Bild 3!

2. Fehler gesehen, geändert, nix gebracht :)
 

Neue Beiträge

Zurück