Zurück   Flashforum > Flash > ActionScript > ActionScript 2

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 23-03-2009, 20:54   #1 (permalink)
Padawan
 
Benutzerbild von Seebold
 
Registriert seit: Dec 2005
Ort: Hannover
Beiträge: 75
Klasse mit Hittest: manchmal reagieren die falschen MovieClips *ich muss weinen*

Liebes Forum.
Was ist nur los mit Flash? Ich habe doch ein einfaches Skript und es geschehen unvorhersehbare Dinge. Der reihe nach:

Bei einem Schießbuden-Spiel gibt es viele Preise-MCs. Darin befindet sich je ein Röhrchen-MC und ein Blume-MC (s. Anlage). roehrchen und blume haben folgende Klassenskripte:

Roehrchen:
PHP-Code:
class cl_roehrchen extends MovieClip {

    private var 
mc_fadenkreuz:MovieClip;
    private var 
point:Object;
    
    function 
onLoad() {
        
this._name "mc_roehrchen";
    }
    
    function 
onMouseDown() {
        if (
_global.Kugeln && _global.schussFreigabe) { //Schussfreigabe wird abgelaufenem Interval true gesetzt
            
            
var point _root.mc_fadenkreuz.getGlobalLoc();
            if (
this.hitTest(point.xpoint.ytrue)) {
                
_root.schussInterval();    //Schussfreigabe wird hier false gesetzt und der Interval gestartet. Damit wird verhindet, dass hinter dem ersten Objekt liegende Objekte den Schuss ebenfalls abbekommen
                
this._parent.initSound("roehrchen"100);                
                if (
this._parent._currentframe == 1) {
                    
_root.kassiert();
                    
this._parent.gotoAndPlay("rz"); //Röhrchen zerstört
                
} else {
                    
this._parent.gotoAndPlay("prz"); //Preis und Röhrchen zerstört
                
}
            
unloadMovie(this); //Sollte auch ohne gehen, aber ich wollte es ausmerzen!
            
}
        }
    }

Die Blume, die im/hinter dem Röhrchen liegt hat ein ähnlcihes Skript:

PHP-Code:
class cl_blume extends MovieClip {

    private var 
intakt:Boolean;
    
    
//set variables
    
function onLoad() {
        
this._name "mc_blume";
    }
    
    
    function 
onMouseDown() {
        if (
_global.Kugeln && _global.schussFreigabe) {        
            var 
point _root.mc_fadenkreuz.getGlobalLoc();
            
            if (
this.hitTest(point.xpoint.ytrue)) {
                
this._parent.initSound("preis_kaputt"70);
    
                
_root.schussInterval();    
                
this._parent.gotoAndPlay("pz"); //Preis zerstört                
                
            
}
        }
    }
    

Der Preis-MC selbst hat kein Skript mehr außer, dass er in Bild 1 stehen bleibt. Nun passiert Folgendes: Ich schieße auf das Röhrchen, die "Getroffen und Röhrchen zerspringt"-Animation geht los und endet auf dem Bild des "Röhrchenrests" (MC findet Ihr als Flash-Datei in der Anlage). Wunderbar klappt prima. Auch eine ganz Reihe durch; Schuss für Schuss. Doch irgendwann schieße ich auf ein Röhrchen und an völlig anderer Stelle sprint ein "Röhrchenrest", dass bereits einmal getroffen war, zu dem Zustand "Preis und Röhrchen zerstört". Schieße ich die Reihe weiter ab, wiederauferstehen die Röhrchen an anderer Stelle ebenfalls. Ich bin da gar nicht in der Nähe. Der HitTest wird nicht auf den MC unter meiner Maus/Fadenkreuz (beides ausprobiert) ausgeführt, sondern vielleicht 100 Pixel weiter links und 10 Pixel weiter oben. Plötzlich funktioniert es aber wiederum gut bei den nächsten Preisen. Das ist verrückt.
Ich habe Euch das Symbol des Preises beigelegt (wundert Euch nicht, es ist keine Blume sondern ein Marienkäfer). Ich habe schon folgendes probiert:
1. Ich habe dem Preis zwei Eigenschaften gegeben: Blume_intakt und Roehrchen_intakt. Diese Eigenschaften habe ich bei entsprechendem Treffer false gesetzt. Nix geändert.
2. Ich habe eine Liste angelegt mit allen Preisen, garantiert eindeutigen Namen und den beiden Stati.
3. Ich habe zusätzlich ein Bild angelegt, das den abgeschossenen Zustand beinhaltet -- ohne wenn und aber und das Bild "ende" genannt. Ich habe angegeben, dass onEnterFrame bei !Blume_intakt und !Roehrchen_intakt immer zu "ende" gesprungen werden soll.
Nichts nichts nichts ändert etwas am Problem. Denn trotz letztem vermeintlich sicheren Vorgehen springt irgendwann ein MC auf das Bild "Preis und Roehrchen zerstört (prz)". Würde die globale Liste oder die Eigenschaft so sein wie ich sie gesetzt habe, müsste IMMER das Bild "ende" erscheinen. Also: Der Status resp. die Liste wird irgendwo geändert. Dagegen spricht, dass dieser Status nur bei "onLoad" auf true gesetzt wird. onLoad aber (durch Trace ausprobiert) nur zu Beginn einmal aufgerufen wird.
Ich weiß nicht weiter HILFE!!!
Angehängte Dateien
Dateityp: fla schiessbude.fla (128,0 KB, 5x aufgerufen)
Seebold ist offline   Mit Zitat antworten
Alt 24-03-2009, 00:02   #2 (permalink)
Der Wunderhund
 
Benutzerbild von gaspode
 
Registriert seit: Jun 2002
Ort: Hattingen
Beiträge: 10.515
Wäre es nicht hilfreicher, wenn Du die ganze fla hochlädst?

Übrigens: Was sind das für merkwürdige Klassen? Ohne Konstruktor?!

gruß, gaspode
gaspode ist offline   Mit Zitat antworten
Alt 24-03-2009, 10:44   #3 (permalink)
l2l|c4o
 
Benutzerbild von Sir Freako
 
Registriert seit: Nov 2005
Ort: düstere Grotte im Süden
Beiträge: 968
kleiner Tipp -

installier mal den debugPlayer und schau dir mal die redrawRegions an
wenn du mit createEmptyMovieClip MovieClips generierts und da mit code nicht sofort reinzeichnest dann sind die meistenst einfach standartmäßig genauso groß wie die Bühne

Geändert von Sir Freako (24-03-2009 um 10:46 Uhr)
Sir Freako ist offline   Mit Zitat antworten
Alt 24-03-2009, 11:28   #4 (permalink)
Padawan
 
Benutzerbild von Seebold
 
Registriert seit: Dec 2005
Ort: Hannover
Beiträge: 75
Fehler immer noch unklar, aber Problem gelöst

Hallo,

vielen Dank. Ich habe dann gestern Abend nocht weiter gebastelt und springe nun bei erfolgtem Abschuss direkt in das Bild "ende". Dort befindet sich nichts mehr außer ein bisschen Grafik -- nicht einmal als Symbol. Da scheint Flash zumindest zu verbleiben und springt nicht mehr einfach in ein anderes Bild.

gaspode: Danke, leider kann ich die FLA nicht posten, da das Projekt eine Auftragsarbeit ist. Sonst hätte ich es gerne gemacht, da das Phänomen so bescheuert ist, dass ich es gerne geteilt hätte :-). Ich gehe von einen Bug aus... Ich habe keinen Konstruktor, weil ich unter der Flash-GUI arbeite und dort habe ich die Klasse direkt dem Darsteller in der Bibliothek zugeordnet. Das Konstrukten macht Flash dann vermutlich alleine.

Sir Freako: Danke für den Hinweis :-)

Viele Grüße
Seebold
Seebold ist offline   Mit Zitat antworten
Alt 24-03-2009, 12:05   #5 (permalink)
l2l|c4o
 
Benutzerbild von Sir Freako
 
Registriert seit: Nov 2005
Ort: düstere Grotte im Süden
Beiträge: 968
also wie ich finde majorpfusch

also nicht minor sondern major

wenn du den ersteller dierekt in der Bibliothek zuordnest via linkage Indetifier dann ist das umso schlimmer das du keinen Konstruktor hast weil

Code:
class myMovieClip extends MovieClip{
public function myMovieClip(){
}
}
ok aber trotzdem in dem fall ist der Konstruktor wichtig und das mit dem extends in deinem Fall auch extrem sogar

Geändert von Sir Freako (24-03-2009 um 12:20 Uhr)
Sir Freako ist offline   Mit Zitat antworten
Alt 24-03-2009, 12:15   #6 (permalink)
Padawan
 
Benutzerbild von Seebold
 
Registriert seit: Dec 2005
Ort: Hannover
Beiträge: 75
Nein nein nein da hast Du was falsch verstanden

Hallo,

ich schreibe hier nichts in die Timeline. Man kann in der Bibliothek die Darsteller mit einer Klasse verknüpfen. Verwende ich das Symbol/MovieClip auf der Bibliothek, greift es automatisch auf die Klassendatei zu. Diese ist ein externes Skript, dass wie die Klasse heißt, z.B. cl_blume.as (hierfür benutze ich auch den FlashDeveloper und nicht Flash).
Ich finde, das ist eine sehr saubere Lösung. Alle Skripte liegen extern als Klassen-Skripte vor. In der Timeline und auf den MCs befindet sich keine Skripte (in der Regel).
Seebold ist offline   Mit Zitat antworten
Alt 24-03-2009, 12:27   #7 (permalink)
Padawan
 
Benutzerbild von Seebold
 
Registriert seit: Dec 2005
Ort: Hannover
Beiträge: 75
Ich will lernen, Sir Freako

Nun, so wie ich es mache, funktionierts. Aber gerne lerne ich dazu. An welcher Stelle müsste ich den einen Konstruktor einbauen und wie sieht der dann aus? Ich habe mit mit Konstruktoren kaum befasst, weil ich bisher dachte, dass auf dem Weg, wie ich ihn gehe, das Objekt ohnehin erzeugt wird; spricht, der Konstruktor vorhanden ist.
Seebold ist offline   Mit Zitat antworten
Alt 24-03-2009, 12:31   #8 (permalink)
l2l|c4o
 
Benutzerbild von Sir Freako
 
Registriert seit: Nov 2005
Ort: düstere Grotte im Süden
Beiträge: 968
Ja aber leider falsch gedacht weil wenn du extends schreibst dann überschreibst du sozusagen die MovieClip standart klasse wenn dann der Konstruktor fehlt dann kanns auch nicht gescheit klappen .

Naja so wie ich das da oben halt auch gemacht habe und vorallem alle variablen die vorahnden sein sollen mußt du auch deklarieren leichter tust du dich wenn du ein Object auf deinen MovieClip patchst und eben nicht extendest -

nur so zur info
Sir Freako ist offline   Mit Zitat antworten
Alt 24-03-2009, 14:50   #9 (permalink)
Padawan
 
Benutzerbild von Seebold
 
Registriert seit: Dec 2005
Ort: Hannover
Beiträge: 75
Hm, das ist ja spannend

Habe jetzt mal bei der Blume
PHP-Code:
    public function cl_blume() {
        
trace("konstrukte");
    } 
eingetragen (und das reicht schon aus?) und nun passiert Folgendes:

Am Anfang gibt es allerhand Ausgabe á la "konstrukte"; das ist ja auch richtig. Nur kommt im Laufe des Spiels, in dem keine MCs neu geladen werden, die Ausgabe "konstrukte". Hin und wieder. In 2 Minuten drei Mal. Das würde zeigen, warum sich die Eigenschaften (beginn dieses Threads) wieder zurückgestellt haben. Aber was kann es sein, dass die MCs quasi neu erstellt werden?
Erklärt aber noch nicht, warum nicht das MC unter dem Hittest reagiert, die die MCs sind händisch plaziert und nicht über "createEmptyMovieClip()".

Dies ist nur eine interessante Beobachtung- Mein Spiel funzt soweit.

Sir Freako: Werde die Konstruktoren in meinen Klassen nachtragen. Damits hübsch ist und nicht majorpfusch :-) Danke Könnte ich im Konstruktor auch die Dinge unterbringen, die ich bei onLoad einstelle?
Seebold ist offline   Mit Zitat antworten
Alt 24-03-2009, 14:55   #10 (permalink)
l2l|c4o
 
Benutzerbild von Sir Freako
 
Registriert seit: Nov 2005
Ort: düstere Grotte im Süden
Beiträge: 968
Zitat:
Zitat von Seebold Beitrag anzeigen
Habe jetzt mal bei der Blume
PHP-Code:
    public function cl_blume() {
        
trace("konstrukte");
    } 
eingetragen (und das reicht schon aus?) und nun passiert Folgendes:

Am Anfang gibt es allerhand Ausgabe á la "konstrukte"; das ist ja auch richtig. Nur kommt im Laufe des Spiels, in dem keine MCs neu geladen werden, die Ausgabe "konstrukte". Hin und wieder. In 2 Minuten drei Mal. Das würde zeigen, warum sich die Eigenschaften (beginn dieses Threads) wieder zurückgestellt haben. Aber was kann es sein, dass die MCs quasi neu erstellt werden?
Erklärt aber noch nicht, warum nicht das MC unter dem Hittest reagiert, die die MCs sind händisch plaziert und nicht über "createEmptyMovieClip()".

Dies ist nur eine interessante Beobachtung- Mein Spiel funzt soweit.

Sir Freako: Werde die Konstruktoren in meinen Klassen nachtragen. Damits hübsch ist und nicht majorpfusch :-) Danke Könnte ich im Konstruktor auch die Dinge unterbringen, die ich bei onLoad einstelle?
yup das ist dann auch sauberer so wenn du im Konstruktor :

Code:
class myBlume extends MovieClip {
	public function myBlume() {
		this.onLoad = function() {
			trace("Blume Load ");
		}
		this.onEnterFrame = function(){
		}
		}
	}
}
geht aber auch so :

Code:
class myBlume extends MovieClip {
	public function myBlume() {

	}
        private function onLoad(){
        }
        private function onEnterFrame(){
        }
}

Geändert von Sir Freako (24-03-2009 um 14:58 Uhr)
Sir Freako ist offline   Mit Zitat antworten
Alt 24-03-2009, 15:00   #11 (permalink)
Padawan
 
Benutzerbild von Seebold
 
Registriert seit: Dec 2005
Ort: Hannover
Beiträge: 75
Super. Was gelernt

Danke
Seebold ist offline   Mit Zitat antworten
Alt 24-03-2009, 15:04   #12 (permalink)
l2l|c4o
 
Benutzerbild von Sir Freako
 
Registriert seit: Nov 2005
Ort: düstere Grotte im Süden
Beiträge: 968
Zitat:
Zitat von Seebold Beitrag anzeigen
Danke
sorry habe mir auch dein file noch garnicht angeschaut aber hast du denn explizit Hitareas definiert oder verwedest du gleich den ganzen cip als hitobject das ist nähmlich auch nicht so gut
Sir Freako ist offline   Mit Zitat antworten
Alt 24-03-2009, 15:10   #13 (permalink)
Padawan
 
Benutzerbild von Seebold
 
Registriert seit: Dec 2005
Ort: Hannover
Beiträge: 75
Frage mit Hittest Koordinaten ab und beschränke das auf die Form, nicht aufs Begrenzungsfeld. Dann würds auch nicht gehen...
Seebold ist offline   Mit Zitat antworten
Alt 24-03-2009, 16:36   #14 (permalink)
l2l|c4o
 
Benutzerbild von Sir Freako
 
Registriert seit: Nov 2005
Ort: düstere Grotte im Süden
Beiträge: 968
Zitat:
Zitat von Seebold Beitrag anzeigen
Frage mit Hittest Koordinaten ab und beschränke das auf die Form, nicht aufs Begrenzungsfeld. Dann würds auch nicht gehen...
sory wie gaspode schon gesagt hat ist das einfach nur unmöglich da jetzt groß was zu sagen wo das problem liegt wenn du die files nicht rausgeben darfst !!!!
Sir Freako ist offline   Mit Zitat antworten
Alt 24-03-2009, 19:14   #15 (permalink)
Perverted Hermit
 
Benutzerbild von Omega Psi
 
Registriert seit: Mar 2004
Ort: Delmenhorst
Beiträge: 12.141
Wenn kein Konstruktor definiert ist, wird implizit ein default Konstruktor erzeugt.
Omega Psi ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
hittest, klasse, unerklärliches verhalten

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



Alle Zeitangaben in WEZ +1. Es ist jetzt 15:59 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele