Zurück   Flashforum > Flash > ActionScript > Spielkonzepte und Spieleprogrammierung

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 20-10-2010, 10:20   #1 (permalink)
Neuer User
 
Registriert seit: Oct 2010
Ort: nähe Bremerhaven
Beiträge: 22
Question AS3 Spiel HitTest Probleme

Hey.....bin noch dabei ein spiel zu programmieren komme aber nicht weiter weil ich keinen vernünftigen hittest zum laufen kriege..
hab schon einiges versucht aber nichts will funktionieren

Code:
    stage.addEventListener(Event.ENTER_FRAME, hitTest);
   /*_timerBewegung= new Timer(20);					
      _timerBewegung.addEventListener(TimerEvent.TIMER, hitTest);	
      _timerBewegung.start();*/
}
		
private function hitTest(event:Event):void{
			
  //var fishes:Array=_fish.getFishes();
  for each(var fish:Fishes in _fishArray){
				
//Wenn Fish zwischen den x-Werten 110 und 90 ist....und den y-Werten der Hai.y Position +/- 10 px
				
  if(fish.x <=110 && fish.x >= 90 && fish.y <= _shark.y+10 && fish.y >=   _shark.y -10){
		fish.killFish(fish);
  }

}
habs also einmal über ein EnterFrame und über Timer laufen lassen beides funktioniert nicht
Habs auch schon mit HitTestObject probiert:

Code:
	
for each(var fish:Fishes in _fishArray){
			
	if( (_shark.hitTestObject(fish))==true){
					
		fish.killFish(fish);
		//_gameScore.setScore(1);
					
	}
				
			}
und mit HitTestPoint:

Code:
for each(var fish:Fishes in _fishArray){
				
	var hitX:Number = _shark.x;
	var hitY:Number = _shark.y - 20;
	var hitY2:Number = _shark.y + 20;
				
				
if(fish.hitTestPoint(105, hitY, true) || fish.hitTestPoint(105, hitY2, true)){
					
	fish.killFish(fish);
	//_gameScore.setScore(1);	
					
}else{
	trace("");
}
Also ich bin verzweifelt :( .... ich brauche eure hilfe
xXRockMyLifeXx ist offline   Mit Zitat antworten
Alt 20-10-2010, 11:36   #2 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.326
du denkst drann, das hitTest globale koordinaten erwartet?
siehe auch localToGlobal und globalToLocal

erzeuge ein objekt (einen punkt) den an der stelle positionieren, wo du hittestest. dann siehst du ja, wo dein objekt ist und wo du eine kollision vermutest.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 20-10-2010, 14:09   #3 (permalink)
Neuer User
 
Registriert seit: Oct 2010
Ort: nähe Bremerhaven
Beiträge: 22
hey....ja danke hab meinen fehler gefunden^^
jetzt hab ich das nächste Problem!
Ich arbeite mit Flex Builder 3 und lade meine Grafiken von einer .SWC Datei.
Hab ja verschiedene Fische die reinschwimmen, die Animation vom Schwimmen läuft automatisch ab, das ist in Flash alles so animiert worden.
Jetzt hab ich aber ja die Fische in einem Array, damit sie zufällig auf die Bühne kommen.
Wie kann ich jetzt einen einzelnen ansprechen um sozusagen die sterbeani zu starten?müsste sie theoretisch über gotoAndPlay() abspielen...Frage ist nur wie ich auf den RICHTIGEN fisch zugreifen kann

Code:
private function createFish():void
{
	_fish1= new KugelfischMC();
	_fish2= new ClownFMove();
	_fish3= new Fisch3MC(); 
	_fisharray= new Array(/*_aal,*/_fish1,_fish2, _fish3);
			
	_fish= new Sprite();
	_fish.addChild(_fisharray[Math.floor(Math.random()*3)]);
	addChild(_fish);
			
	y=Math.random()*+stage.stageHeight-100;
}
in der gleichen Datei ist eine Funktion die aufgerufen wird wenn der Charakter die Fische Berührt

Code:
public function killFish(fish:Fishes):void
{		
   removeEventListener(Event.ENTER_FRAME, onEnterFrame);
   //Animation abspielen für einzelne Fische
   //blabla.gotoAndPlay(55);
}

Geändert von xXRockMyLifeXx (20-10-2010 um 14:19 Uhr)
xXRockMyLifeXx ist offline   Mit Zitat antworten
Alt 20-10-2010, 14:35   #4 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.326
Code:
// wieso
_fish= new Sprite();
_fish.addChild(_fisharray[Math.floor(Math.random()*3)]);
addChild(_fish);
// anstatt
addChild(_fisharray[Math.floor(Math.random()*3)]);
im 1. fall (kein code, nur beispiel):
getChildAt(x); // ist der x.te fisch auf der bühne
getChildAt(x).getChildAt(0); // ist das 0.te objekt da drinn
getChildAt(x).getChildAt(0).sterbeani();
im 2. fall
getChildAt(x).sterbeani();
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 20-10-2010, 14:58   #5 (permalink)
Neuer User
 
Registriert seit: Oct 2010
Ort: nähe Bremerhaven
Beiträge: 22
leider funktioniert das nich ganz...
getChildAt gibt mir zwar den richtigen MovieClip aber ich kann kein gotoAndPlay darauf anwenden...

ach jaa....is auch das erste flash spiel das ich nach meinem studium mache-.-
hab halt noch einiges zu lernen
xXRockMyLifeXx ist offline   Mit Zitat antworten
Alt 20-10-2010, 17:11   #6 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.326
// zu z.B.
var fisch:MovieClip = this.getChildAt(x) as MovieClip;
fisch.gotoAndPlay(y);

// besser?
Code:
var fischAry:Array=[];

switch (Math.floor(Math.random()*3)) {
 case 1: fischAry.push(new KugelfischMC()); break;
 case 2: fischAry.push(new ClownFMove()); break;
 case 3: fischAry.push(new Fisch3MC()); break;
}
addChild(fischAry[fischAry.length-1]);
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 21-10-2010, 13:09   #7 (permalink)
Neuer User
 
Registriert seit: Oct 2010
Ort: nähe Bremerhaven
Beiträge: 22
super danke^^
Ich denke das wird mir weiterhelfen....hatte mir sowas ähnliches auch gedacht aber bin nicht auf das "as MovieClip" gekommen -.-
danke nochmal
xXRockMyLifeXx ist offline   Mit Zitat antworten
Alt 21-10-2010, 15:28   #8 (permalink)
Neuer User
 
Registriert seit: Oct 2010
Ort: nähe Bremerhaven
Beiträge: 22
EventListener

Und schon wieder das nächste Problem an der Backe -.-
Ich hab mein Spiel jetzt soweit das ich zum EndScreen komme.
Ich entferne also das Spiel und füge den Endscreen hinzu.

Code:
private function onSpielende(event:Event):void{
			_game.destroy();
			_game.removeEventListener("SpielEnde", onSpielende);
			removeChild(_game);
			
			
			_restartScreen=new EndScreen();
			addChild(_restartScreen);
			_restartScreen.addEventListener("RestartButtonClick", onRestartButtonClick);
			createEndScore();
		}
in _game.destroy() werden sämtliche EventListener entfernt die zur Bewegung der Figur dienen...also KeyUp, KeyDown und ein EnterFrame...

Wenn ich jetzt über den RestartButton im EndScreen das Spiel neu starten will dann bekomme ich folgenden fehler:TypeError:

Error #1009: Der Zugriff auf eine Eigenschaft oder eine Methode eines null-Objektverweises ist nicht möglich. at haigame::SharkHero/move()[/Users/sabinebrosicke/Desktop/HaiGame/GameProjekt/source/classes/haigame/SharkHero.as:52]

also hier:
Code:
private function move(event:Event):void{
	//Bewegung runter
	if(dirKey == 1){
		if(_sharky.y > stage.stageHeight  - _sharky.height/2 -100){
						_sharky.y += 0;
					}else{
						_sharky.y += 10;
						
					}
	}else if(dirKey == -1){
		if(_sharky.y < 0 + _sharky.height/2 +10){
						_sharky.y -=0;
					}else{
						_sharky.y -=10;
						
					}
			}
			
		
		}
Das ist die EnterFrame funktion. Die wird aber ja eigentlich bei Neustart des Spiels auch wieder NEU hinzugefügt...

Läuft auch zuerst alles über AddedToStage.
Wo ist jetzt also der Fehler?
xXRockMyLifeXx ist offline   Mit Zitat antworten
Alt 21-10-2010, 15:58   #9 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.326
ich kann nicht sehen, wo bei dir zeile 52 ist (und hätte auch garkeine zeit dafür, deine programme zu durchforsten)

zum debuggen, dem täglichen geschäft jedes programmierers:
baue trace-befehle ein und benütze mal den debugger! dafür ist das ding ja da.
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 22-10-2010, 10:55   #10 (permalink)
Neuer User
 
Registriert seit: Oct 2010
Ort: nähe Bremerhaven
Beiträge: 22
jo danke.....hab mein Problem schon gefunden.
Es ist mir ja fast schon peinlich wie oft bei mir fehler auftauchen -.-
bin aber halt noch weit vom profi entfernt^^und dafür das ich nur 1 jahr studiert hat und AS3 nur ein kleiner teil meines studiums war finde ich doch das ich schon einiges gelernt hab
xXRockMyLifeXx ist offline   Mit Zitat antworten
Alt 22-10-2010, 11:10   #11 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.326
nur wer nichts macht macht keine fehler.
ich mache jeden tag mindestens 300 fehler ;-)
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Alt 25-10-2010, 11:58   #12 (permalink)
Neuer User
 
Registriert seit: Oct 2010
Ort: nähe Bremerhaven
Beiträge: 22
aus Array löschen!

Huhu...Ich mal wieder^^
das nächste Problem ist aufgetaucht....
Obwohl ich eine Funktion dafür habe das mein kleinen Fische aus dem Array gelöscht werden sobald sie entweder den Bildschirmrand verlassen oder vom Hai berührt werden, wird das Array immer länger und länger und frisst unglaublich viel performance -.-
vielleicht hab ich auch noch i-wo einen fehler?!
Code:
private function onFishComplete(event:Event):void{
			//typisierung der variablen..... (casten)
			var fish:Fishes = event.target as Fishes;
			//funktion destroy() wird aufgerufen
			fish.destroy();
			/***********von Fish HitTest************/
			var index:int = _fishArray.indexOf(fish);	
			//Fisch wird aus dem Array gelöscht
			_fishArray.splice(index, 1);
			//Variable Fisch wird entfernt
			removeChild(fish);	
			fish= null;
		}


//in Untergeordneter Klasse :
public function destroy():void
		{
			removeEventListener(Event.ENTER_FRAME, onEnterFrame);
			removeChildAt(0);
		}
xXRockMyLifeXx ist offline   Mit Zitat antworten
Alt 25-10-2010, 12:34   #13 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.326
public function destroy():void
das ist schonmal gut. besser, wenn du das mit events machen würdest. also die aufräumaktion via Event.REMOVED_FROM_STAGE aufrufen lassen

removeChildAt(0);
brauchst du nicht. mit removeChild(fish); werden auch alle movieclips von der bühne entfernt, die im fisch drinn sind.
sollte ChildAt(0) irgend etwas spezielles haben, dann sollte das eine class haben mit einer funktion die auf Event.REMOVED_FROM_STAGE reagiert.

script natürlich ungeprüft .. nur so auf verdacht getippt ;-)
Code:
var fish:Fishes = event.target as Fishes;
if (fish && fish!=null) { // immer prüfen!!
  var index:int = _fishArray.indexOf(fish);
  if (index>-1) { // immer prüfen!!
    var ary:Array = _fishArray.splice(index, 1);
    if (ary.length==1) { // immer prüfen!!
      fish.destroy(); // wie gesagt, das besser via REMOVED_FROM_STAGE 
      removeChild(fish);
      //  fish= null; // unnötig eine locale variable auf null zu setzen.
    } else {
      trace("ERR fisch wurde nicht aus dem array entfernt, und jetzt?");
    }
  } else {
    trace("ERR fisch ist unbekannt, und jetzt?");
  }
} else {
  trace("ERR event ist kein fisch, und jetzt?");
}
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de

Geändert von hgseib (25-10-2010 um 12:39 Uhr)
hgseib ist offline   Mit Zitat antworten
Alt 25-10-2010, 13:31   #14 (permalink)
Neuer User
 
Registriert seit: Oct 2010
Ort: nähe Bremerhaven
Beiträge: 22
danke für deine schnelle antwort!
I-wie hilft mir das noch nicht so ganz weiter
Das Problem liegt glaube ich darin dass ich bei den eingefangenen Fischen erst eine Animation abspiele bevor sie gelöscht werden...
Ich probiere nochmal ein bisschen weiter rum
xXRockMyLifeXx ist offline   Mit Zitat antworten
Alt 25-10-2010, 14:22   #15 (permalink)
Techniker
 
Benutzerbild von hgseib
 
Registriert seit: Sep 2003
Ort: 64807
Beiträge: 16.326
das kann das problem nicht sein?

a) stelle sicher das der fisch aus dem array gelöscht wird.
mit trace überprüfen, ob das objekt tatsächlich gefunden wird bzw. if's im programm

b) dann kann deine jahresendanimation laufen und am ende der ani löscht sich der fisch selbst von der bühne.

das muss gehen.
dein fehler kann nur daran liegen, das du nicht die richtigen objekte ansprichst bzw. zur falschen zeit?
__________________
die ultimative antwort auf alle programmierfragen: der debugger
mfg h.g.seib www.SeibsProgrammLaden.de
hgseib ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
HitTest für ein Mini-Spiel Diwersant Flash Einsteiger 3 20-08-2008 15:45
Spiel - Hittest nur 1mal Nostradamus Flash Einsteiger 3 22-03-2008 18:40
hitTest-Problem in Spiel BjörnG ActionScript 1 4 03-01-2007 09:35
Hittest-Problem im Spiel commander-x Flash 4 und Flash 5 1 01-05-2002 12:30
memory spiel hitTest zebulor ActionScript 1 6 17-03-2002 22:10


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:11 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele