• beyond tellerrand – play. Register Now!
Zurück   Flashforum > Flash > ActionScript > Spielkonzepte und Spieleprogrammierung

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 25-07-2010, 20:23   #46 (permalink)
in the boondocks
 
Benutzerbild von shin10
 
Registriert seit: Feb 2006
Ort: Augsburg
Beiträge: 3.238
removeChild(this["gegneranimation"+1]);
sollte klappen, oder?

EDIT:
und
PHP-Code:
var mc:MovieClip e.currentTarget as MovieClip;
mc.parent.removeChild(mc); 
editEdit: mit der wohnung siehts schlecht aus. brüste haben wohl vorrang
__________________

flintfabrik.de

Geändert von shin10 (25-07-2010 um 20:32 Uhr)
shin10 ist offline   Mit Zitat antworten
Alt 25-07-2010, 20:37   #47 (permalink)
Mediendesigner
 
Benutzerbild von izanagi
 
Registriert seit: Jan 2007
Ort: Köln
Beiträge: 418
hahaha ja so ist das, wir haben da klare nachteile ^^



Also dein erster Vorschlag klappte nicht, aber der zweite.
Jedoch war das genau dies was ich vermeiden wollte,
viell macht es der perfomence nix aus, ich weiss es nit.

Aber ich hier das gemacht, das klappt:

PHP-Code:
gegner[1].removeChild(e.currentTarget); 
Ich muss 3 MCs entfernen, die bei Gegner Generierung erzeugt werden.
  • Einen Pfad Clip inkl. Holder
  • Einen Gegner Clip
  • Einen Animations Clip
Beim Kill werden die Objekte geleert bzw. freigegeben damit sie wieder
befüllt, also generiert werden können.
Einen einzelnen bekomm ich removed aber nicht alle 3 zusammen

PHP-Code:
gegner[e.currentTarget.parent.nummer].removeChild(e.currentTarget); // animations Objekt wird gelöscht
pfad[e.currentTarget.parent.nummer]["holder_gegner"].removeChild(gegner[e.currentTarget.parent.nummer]);// das gegner klassenobjekt gelöscht
removeChild(pfad[e.currentTarget.parent.nummer]); // der pfad des gegners gelöscht 
Zitat:
.....null-Objektverweises

Geändert von izanagi (25-07-2010 um 20:40 Uhr)
izanagi ist offline   Mit Zitat antworten
Alt 25-07-2010, 20:48   #48 (permalink)
Mediendesigner
 
Benutzerbild von izanagi
 
Registriert seit: Jan 2007
Ort: Köln
Beiträge: 418
Exclamation Prototyp v.1

Ich habe nun mal das Script für meine Animation, habs doch über
ein vordefiniertes Pfad-Ani-Movieclip mit Holder für Gegner gemacht.
Klappt auch alles. Gibt nur noch kein Waffengebrauch ^^ (wird eh alles Gewaltfrei mit Notenschlüsseln oder sowas).
Falls du Shin oder wer, abänderungen des Script vorschlagen würdest,
bin ich natürlich gerne bereits hier was zu ändern.
Den Test kann man sich hier anschauen:
Updated>>>>> tests/pfadeFinal3.html
Die Mauer kann man wegschieben und neue Gegner generieren.

UPDATE: juhuu jetzt werden auch die kollisionen unter den Gegnern selbst abgefragt und stoppen vor ihrem Vordermann

PHP-Code:
//#### Vars ########################################################################
var gegnerist:int=0;
var 
gegneraktiv:int=0;
Stagepath.rootpath=stage.getChildAt(0) as MovieClip;



//#### Vorbereitung ########################################################################

for (var pfadmaker:int 1pfadmaker <= 50pfadmaker++) {// pfade generieren von Variante 1
    
pfad[pfadmaker] = new Pfad()as MovieClip;
    
pfad[pfadmaker].aktiv=false;//
}

for (var 
t:int 1<= 50t++) {// gegner generieren vom typ1
    
gegner[t] = new Gegner()as MovieClip;
    
gegner[t].nummer=t;
    
gegner[t].typ=1;
    
gegner[t].aktiv=false;// ob er gerade Lebt, hier Nein
    
gegner[t].maxenergie=200;
    
gegner[t].energie=gegner[t].maxenergie;
    
gegner[t].aktuellewaffe=1;
    
gegner[t].aktuelleresistenz=1;

    
//var gegneranimation[t] = new Object()as MovieClip;
    //gegneranimation[t] = new Gegneranimation()as MovieClip;

}

// beim Kill wird der Gegner Resetet, removed und der Pfad wieder freigeschaltet

var index_pfad1=this.getChildIndex(pfadebene1);// index speichern

//### Ein Gegner wird erschaffen ##############################################################

var gegnerwelle1:Timer=new Timer(1000,1);// einmalige Erschaffung zum test
gegnerwelle1.start();
gegnerwelle1.addEventListener(TimerEvent.TIMERerschaffen);
gegnerwelle1.addEventListener(TimerEvent.TIMER_COMPLETE com);


//### Gegner GEnerator ########################################################################
function erschaffen(e) {
    
// Baustelle ! if (blaaa) hier würde die KI-Abfragen schauen, wie die aktuelle Situation ist
    // Baustelle ! next Pfad & next Gegner


    
if (gegneraktiv<=49) {// maximum
        
for (var gegnernr:int 1gegnernr <= 50gegnernr++) {
            if (
gegner[gegnernr].aktiv==false) {
                
gegneraktiv = (gegneraktiv 1) ;// % 50 für vorne   anfangen

                
this.addChildAt(pfad[gegnernr], index_pfad1);// ein gegnerpfad als test ohne Random
                //// der MC holder_gegner im Pfad bewegt sich von A nach B
                
pfad[gegnernr].x=0;
                
pfad[gegnernr].y=0;
                
/// Baustelle ! für Dynamik den Pfad varrieren auf der Y achse
                
pfad[gegnernr]["holder_gegner"].addChild(gegner[gegnernr]) as MovieClip;// gegner wird in den holderMC des Pfads geadded
                
gegner[gegnernr].name="gegner"+gegnernr;
                
gegner[gegnernr].aktiv=true;

                for (var 
gegnertyp:int 1gegnertyp <=8gegnertyp++) {// je nach Typ wird die geloopte Grafikanimation geadded

                    
if (gegner[gegnernr].typ==gegnertyp) {// zum test gibts nur Typ 1

                        //var gegneranimation:Array;
                        
var klassenname="Gegner_"+gegnertyp;
                        var 
styleClassName:Class=Class(getDefinitionByName(klassenname)) as Class;
                        
this["gegneranimation"+gegnernr] = new styleClassName();// bekommt seine Animations MC

                        
gegner[gegnernr].addChild(this["gegneranimation"+gegnernr]);
                        
this["gegneranimation"+gegnernr].name="gegnerani"+gegnertyp;
                    }
                }

                
pfad[gegnernr].aktiv=true;// Pfad wird aktiviert, wird benutzt
                
gegner[gegnernr].aktiv=true;// Gegner wird aktiviert, er lebt
                
pfad[gegnernr].gotoAndPlay(1);
                
this["gegneranimation"+gegnernr].addEventListener(MouseEvent.MOUSE_DOWNkill);// zum spass
                
this["gegneranimation"+gegnernr].addEventListener(Event.ENTER_FRAMEkollision);

                
trace("gegner im spiel= "gegneraktiv);
                
trace("gegnernummer="gegnernr+"wurde erschaffen");
                
trace("gegnerobjekt= "gegner[gegnernr].name);
                
trace("gegnerani= "this["gegneranimation"+gegnernr].name);

                break;
            }
        }

    } else {
        
trace("schon genug");
    }

}
function 
com(e) {
    
trace("erste wurde erstellt");
}

//##### COLLISON ########################################################################
var wand:MovieClip=this.hinderniss as MovieClip;
function 
kollision(e) {

    var 
enemy:MovieClip=pfad[e.currentTarget.parent.nummer]["holder_gegner"] as MovieClip;
    if (
Math.sqrt(Math.pow((enemy.+ (enemy.width/2)) - (wand.+ (wand.width/2)), 2) + 
       
Math.pow((enemy.+ (enemy.height/2)) - (wand.+ (wand.height/2)), 2))
             < ((
enemy.width/2) + (wand.width/2))) {

        
trace("Bämm");
        
pfad[e.currentTarget.parent.nummer].stop();
        
this["gegneranimation"+e.currentTarget.parent.nummer].gotoAndStop("stop");
    } else {
        
this["gegneranimation"+e.currentTarget.parent.nummer].play();
    }

    
//}

}

function 
kill(e) {
    
trace("gekillt wird gegner= "+pfad[e.currentTarget.parent.nummer]["holder_gegner"].getChildByName("gegner"+e.currentTarget.parent.nummer).name);
    
//var xxx:MovieClip = pfad[e.currentTarget.parent.nummer]["holder_gegner"].getChildByName("gegner"+e.currentTarget.parent.nummer).getChildByName("gegnerani"+e.currentTarget.parent.typ) as MovieClip;
    
gegneraktiv=gegneraktiv-1;
    
e.currentTarget.removeEventListener(MouseEvent.MOUSE_DOWNkill);
    
e.currentTarget.removeEventListener(Event.ENTER_FRAMEkollision);
    
gegner[e.currentTarget.parent.nummer].aktiv=false;
    
pfad[e.currentTarget.parent.nummer].stop();
    
gegner[e.currentTarget.parent.nummer].removeChild(e.currentTarget);// animations Objekt wird gelöscht
    
pfad[e.currentTarget.parent.nummer]["holder_gegner"].removeChild(gegner[e.currentTarget.parent.nummer]);// das gegner klassenobjekt gelöscht
    
removeChild(pfad[e.currentTarget.parent.nummer]);// der pfad des gegners gelöscht




Geändert von izanagi (26-07-2010 um 15:51 Uhr)
izanagi ist offline   Mit Zitat antworten
Alt 28-07-2010, 22:07   #49 (permalink)
Mediendesigner
 
Benutzerbild von izanagi
 
Registriert seit: Jan 2007
Ort: Köln
Beiträge: 418
Shin ich hab da mal ne kleine Frage,
ich habe ein Monstercode für die 7 verschiedenen Schussanimation.
Je nach Waffentyp wird bei KollisonsReichweite ein schuss als grafiktweener alias Movieclip erzeugt.

In dieser Funktion liegt eine weitere Funktion, und zwar ein Timer....
der ist fürs Nachladen. Sprich nach dem Nachladen wird die Schussfunktion wird freigeschaltet und die alte "Schussanimation" wird removed !!

Meine Frage ist nun Generell, die Pfade und somit das removeChild funktioniert ja
nicht mehr in der verschatelten Funktion also wie kann ich die ansprechen OHNE
wieder neue vars zu setzen.
Ich brauch sowas wie e.currentTarget.fromLastFunction ^^
oder function schussfeld(parentPfad) {

Mein Problem steckt hier:

PHP-Code:
function schussfeld(e) {
    if (
waffe freigegeben
                    
/////////// ERSTELLEN DES SCHUSSES ////////////////////////
addChildAt(this["schuss"+[gebaeude[e.currentTarget.nummer].aktuellewaffe]][akt_schuss[gebaeude[e.currentTarget.nummer].aktuellewaffe]], gegner[colli].indexposi+1);
// muss erst nachladen

////// NACHLADER REMOVER /////////////////////
var timer=setInterval(freigabe,waffe[gebaeude[e.currentTarget.nummer].aktuellewaffe].nachladen);
                function 
freigabe() {
                    
clearInterval(timer);
                    
this.removeChild(this["schuss"+[gebaeude[e.currentTarget.nummer].aktuellewaffe]][50]);
// waffe wieder freigeben
                
}
            
////// COLLI TEST /////////////////////
                            
}
        }
    } 
eine Lösung wäre:

PHP-Code:
var letzterPfad:int gebaeude[e.currentTarget.nummer].aktuellewaffe;

var 
timer=setInterval(freigabe,waffe[letzterPfad].nachladen);
                function 
freigabe() {
                    
clearInterval(timer);
                    
this.removeChild(this["schuss"+[letzterPfad]][50]);
// waffe wieder freigeben 
aber muss das denn sein ?

Geändert von izanagi (28-07-2010 um 22:10 Uhr)
izanagi ist offline   Mit Zitat antworten
Alt 29-07-2010, 23:27   #50 (permalink)
in the boondocks
 
Benutzerbild von shin10
 
Registriert seit: Feb 2006
Ort: Augsburg
Beiträge: 3.238
hi,

sorry das es so lange gedauert hat. aber gerade jetzt in der letzten schulwoche jagt eine feier die nächste.

zu deiner frage: ich denke spätestens jetzt solltest du dich mal ein wenig mit klassen vertraut machen. mich beschleicht das gefühl, dass du wirklich einen "monster code" schreibst. mit klassen lässt sich sowas viel besser strukturieren und die objekte können sich quasi mehr oder weniger selbst verwalten. bei der ganzen verschachtelei von zusammengesetzten namen verliert man ja total den überblick...
ich glaub drum schnall ich gerade auch gar nicht, wo in deiner lösung das problem liegt bzw. du keine variablen setzen möchtest

mfg

sx
__________________

flintfabrik.de
shin10 ist offline   Mit Zitat antworten
Alt 30-07-2010, 13:39   #51 (permalink)
Mediendesigner
 
Benutzerbild von izanagi
 
Registriert seit: Jan 2007
Ort: Köln
Beiträge: 418
ich weiss auch nicht ^^
ich dachte eigentlich das jede Variable, jeder Array und des jedes Object
speicher bzw. performence braucht, oder seh ich das falsch
deswegen versuch ich soviel es geht mit Pfaden des Zielobjekts zu arbeiten
statt sie zwischen zu speichern in erneuten Vars.

Wenn jeder Schuss 50mal geadded und das pro waffentyp 7mal passieren könnte, wären das 350 vars allein fürs zwischenspeichern des letzten Quellobjekts ist nur meine therorie

PS: ich hab echt schon viele Klassen geschaffen so ist das nicht. Weiss ja auch wie Klassen funktionen, das is kein PRoblem.
Die Gebäude teilen sich eine Klasse
Die Gegner teilen sich eine Klasse
Die Waffenfunktion eine
Die Upgrades eine
usw.

Geändert von izanagi (30-07-2010 um 13:42 Uhr)
izanagi ist offline   Mit Zitat antworten
Alt 01-08-2010, 03:13   #52 (permalink)
in the boondocks
 
Benutzerbild von shin10
 
Registriert seit: Feb 2006
Ort: Augsburg
Beiträge: 3.238
hmm,

na gut. aber warum übergibst du dann den mc nicht einfach als argument an die funktion. dann brauchst du keine extravariable setzen (auch wenn das wohl trotzdem vorübergehend irgendwo im speicher landen muss).
PHP-Code:
var timer=setInterval(freigabe,waffe[letzterPfad].nachladengebaeude[e.currentTarget.nummer].aktuellewaffe);
                function 
freigabe(letzterPfad:int) {
                    
clearInterval(timer);
                    
this.removeChild(this["schuss"+[letzterPfad]][50]);
// waffe wieder freigeben 
allerdings zweifel ich ein wenig daran, ob es gut ist, removeChild so mit dem interval zu verknüpfen. gibt es dafür auch einen grund?

mfg

sx
__________________

flintfabrik.de
shin10 ist offline   Mit Zitat antworten
Alt 01-08-2010, 11:10   #53 (permalink)
Mediendesigner
 
Benutzerbild von izanagi
 
Registriert seit: Jan 2007
Ort: Köln
Beiträge: 418
Hi Shin,
wieder was gelernt, das mit der übergabe kannte ich noch nicht.
Warum der Interval? Kann ich dir sagen, die Animation des Schuss
dauert immer so lange wie das Nachladen der Waffe, erst wenn
der Schuss erloschen ist, wird der Schuss Removed, also Freigegeben
in der Objekliste um wieder später wieder auf die Bühne geaddet zu werden.
Klar könnte ich auch sagen if (das ende der zeitleiste erreicht) dann löschen.
Aber mir schien es so sinnvoll. Es kommt aber sowieso noch eine
alternativ Kollision hinzu und zwar wenn der schuss den Gegner trifft
wird die Schussanimation vorzeitig abgebrochen und somit removed.
Blöd das ich dem intervall wieder sagen muss"hey intervall abbrechen wenn schuss kollidiert"
izanagi ist offline   Mit Zitat antworten
Alt 01-08-2010, 11:45   #54 (permalink)
in the boondocks
 
Benutzerbild von shin10
 
Registriert seit: Feb 2006
Ort: Augsburg
Beiträge: 3.238
Zitat:
Blöd das ich dem intervall wieder sagen muss"hey intervall abbrechen wenn schuss kollidiert"
und genau da seh ich schon wieder das problem, dass du timer und schuss nicht eindeutig zuordnen kannst, oder?
nochdazu könntest du ein problem bekommen, wenn der spieler pause drückt (ich nehme an er kann das)
__________________

flintfabrik.de
shin10 ist offline   Mit Zitat antworten
Alt 01-08-2010, 12:07   #55 (permalink)
Mediendesigner
 
Benutzerbild von izanagi
 
Registriert seit: Jan 2007
Ort: Köln
Beiträge: 418
^^ verdammt...



ja pause wird der knaller, ich werd wohl fast alles in eine MainSchleife legen
und diese dann unterbrechen.
Aber mit dem Timer haste recht, wird schwer.
Ehm... aber Animationen zu stoppen ist ja auch ein Mist, verdammt.
*grübel*.... was würdest du denn empfehlen ?
izanagi ist offline   Mit Zitat antworten
Alt 01-08-2010, 12:27   #56 (permalink)
in the boondocks
 
Benutzerbild von shin10
 
Registriert seit: Feb 2006
Ort: Augsburg
Beiträge: 3.238
also ich würde den schüssen eine lebenszeit verpassen, die von frame zu frame geprüft (evtl. herabgesetzt) wird, ähnlich wie bei einem partikelsystem. scheint mir das leichteste zu sein.

edit:
-bei pause ändert sich nichts.
-bei einem treffer setzt du sie einfach gleich auf 0 und alles geht seinen lauf.
__________________

flintfabrik.de

Geändert von shin10 (01-08-2010 um 12:32 Uhr)
shin10 ist offline   Mit Zitat antworten
Alt 01-08-2010, 12:54   #57 (permalink)
Mediendesigner
 
Benutzerbild von izanagi
 
Registriert seit: Jan 2007
Ort: Köln
Beiträge: 418
Auf 0 ? Ich soll nur in der Animation auf den leeren 0-Frame stoppen, NICHT removen ?
Im Tutorial hab ichs aber so gelernt das jeder nicht gebrauchte MC oder Objekt,
von der Bühne gekillt werden soll und erst bei Bedarf geadded.
Allein zur Performence. Deswegen hat der Typ auch zu beginn 50 neue Gegner, 50 neue Schüsse definiert die dann nach bedarf geholt werden.
izanagi ist offline   Mit Zitat antworten
Alt 01-08-2010, 15:05   #58 (permalink)
in the boondocks
 
Benutzerbild von shin10
 
Registriert seit: Feb 2006
Ort: Augsburg
Beiträge: 3.238
doch doch. schon removen und tweens beenden/löschen, listener entfernen ... all das, wenn die lebenszeit <= 0 ist.

was ist den ein 0-frame
__________________

flintfabrik.de
shin10 ist offline   Mit Zitat antworten
Alt 01-08-2010, 18:03   #59 (permalink)
in the boondocks
 
Benutzerbild von shin10
 
Registriert seit: Feb 2006
Ort: Augsburg
Beiträge: 3.238
dass du dir ein wenig besser vorstellen kannst was ich meine, hab ich nochmal schnell was gebastelt.

PHP-Code:
package  {
    
import flash.display.MovieClip;
    
import flash.events.Event;
    
import flash.geom.Point;
    
    public class 
Schuss extends MovieClip{
        private var 
_waffe:Waffe;
        private var 
_ziel:Gegner;
        private var 
_lebensZeit:int 20;
        
        private const 
GESCHWINDIGKEIT:Number 3.5
        private var 
_speedX:Number;
        private var 
_speedY:Number;
        
        public function 
Schuss(waffe:Waffeziel:Gegner) {
            
_waffe waffe;
            
_ziel ziel;
            
waffe.x;
            
waffe.y;
            var 
winkel Math.atan2(ziel.y-waffe.yziel.x-waffe.x);
            var 
pt:Point Point.polar(GESCHWINDIGKEITwinkel);
            
_speedX pt.x;
            
_speedY pt.y;
            
addEventListener(Event.ENTER_FRAMEenterFrameHandler);
        }
        private function 
enterFrameHandler(e:Event):void{
            
//if(Spiel.pause==false){//prüfen, ob das spiel läuft (bspw. statische variable in deiner hauptklasse)
                
+= _speedX;
                
+= _speedY;
                
//Spiel.treffer(this);//wurde ein gegner getroffen? ...
                
lebensZeit--;
                
trace(xylebensZeit);
            
//}
        
}
        public function 
get lebensZeit():int{
            return 
_lebensZeit;
        }
        public function 
set lebensZeit(val:int):void{
            
_lebensZeit val;
            if(
_lebensZeit<=0){
                
kill();
            }
        }
        public function 
kill():void{
            
trace("kill")
            
removeEventListener(Event.ENTER_FRAMEenterFrameHandler);
            if(
parent!=null){
                
parent.removeChild(this);
            }
            
//_waffe.freigegeben = true;//???
        
}
    }

mfg

sx
__________________

flintfabrik.de

Geändert von shin10 (01-08-2010 um 19:14 Uhr)
shin10 ist offline   Mit Zitat antworten
Alt 04-08-2010, 23:00   #60 (permalink)
Mediendesigner
 
Benutzerbild von izanagi
 
Registriert seit: Jan 2007
Ort: Köln
Beiträge: 418
Danke dir. Das geht schon an meine Grenzen, da steckt einiges hinter.
Ich weiss nicht ob ich das jetzt noch ändere... das wären wieder 3 tage arbeit
um 100 fehlermeldungen zu korrigieren. Ich versuch morgen früh mal
.... aber versprechen kann ich nix. Hab Samstag nämlich schon eine fertige
Version der Waffen gehabt.

pfadeFinal7

Jetzt kommt die Treffer Abfrage.
Ich hab noch Probleme mit dem Index. Das ist zum ko***
ich habs jetzt so gemacht, das es auf der Stage 12 Ebenen gibt.
Fängt beim Hintergrund an, geht über Bauplätze vor der Straße, die Straße selbst, Bauplätze nach der Straße,
Bäume, Bauplätze vor der Straße, die Straße selbst, Bauplätze nach der Straße, Bäume.
Hört sich doch intelligent an. Nun hab ich die Indexreihen so wie ich das Level gestaltet habe.
Die Türme bekommen den Index vom Bauplatz, die Gegner von der Straße und der Rest erklärt sich.
Trotzdem muss ich ja gucken das der Schuss, ÜBER den Gegner erstellt wird. Daher die Index position des Schuss einfach auf der der Gegner geadded.
Aber oben der Turm schießt unter sich selbst

EDIT: hat sich erledigt hab den einen turm auf den unteren Bauplatzindex geadded, mein fehler ^^

Geändert von izanagi (04-08-2010 um 23:15 Uhr)
izanagi 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
mehrere Kollisionen sparsam erstellen (Tower Defence Game) ?!? themerx Flash 8 5 29-10-2008 14:35
hilfe bei erstellung von tower defense flash cmdSoniq ActionScript 1 7 12-02-2008 16:17
Die ersten Schritte hunkarcelebi Flash Einsteiger 17 28-02-2006 22:12
ersten 3d schritte... Hamster2k Softwarearchitektur und Entwurfsmuster 35 21-10-2002 12:45
sound wird beim Preloader auf ersten dem ersten Frame geladen II werbe-grafix Flash 4 und Flash 5 1 18-12-2001 19:24


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:57 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele