Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 21-03-2009, 05:36   #1 (permalink)
Neuer User
 
Registriert seit: Feb 2009
Beiträge: 3
Problem mit drag and drop

hallo
ich habe ein problem mit drag and drop. in diesem kleinen test sollen 2 spieler abwechselnd ihre spielfiguren über des spielfeld bewegen können, per druck auf einen button is jeweils der andere spieler am zug. es klapt auch soweit bis auf das nach dem ersten wechsel von spieler 1 auf spieler 2(oder andersrum) die onPress funktionalität weiterhin auf dem mc von spieler 1 liegt.
in spieler.aktiv liegt ja der string des im jeweiligen zug anzusprechenden movieclips, warum wird also das drag and drop immer richtig gestartet aber bleibt weiterhin auf dem movieclip des als ersten aktiven spielers liegen?

ich habe wirklich schon alles versucht was mir eingefallen ist aber ich bekomme das problem einfach nicht gelöst!

Code:
// objekt erzeugen
var spieler:Object = new Object();

// beim start ist spieler1 am zug
spieler.aktiv = "spieler1_mc";

// spieler mcs erstellen
_root.attachMovie("spieler","spieler1_mc",1);
_root.attachMovie("spieler","spieler2_mc",2);

// startposizionen setzen
_root.spieler1_mc._x = 100;
_root.spieler1_mc._y = 100;
_root.spieler2_mc._x = 200;
_root.spieler2_mc._y = 200;

//drag des aktiven spielers starten
_root[spieler.aktiv].onPress = function() {
	_root[spieler.aktiv].startDrag();
};
// drag des aktiven spielers beenden
_root[spieler.aktiv].onRelease = function() {
	_root[spieler.aktiv].stopDrag();
};

// durch drücken eines buttons den aktiven spieler wechseln
_root.zugende_btn.onRelease = function() {
	stopDrag();
	if (spieler.aktiv == "spieler1_mc") {
		spieler.aktiv = "spieler2_mc";
	} else {
		spieler.aktiv = "spieler1_mc";
	}
};
daschima22 ist offline   Mit Zitat antworten
Alt 21-03-2009, 10:45   #2 (permalink)
So'n User
 
Benutzerbild von anfiba
 
Registriert seit: Dec 2005
Beiträge: 207
Hallo,

Du machst den Fehler, dass Du zu Begin nur dem ersten Spieler die beiden Funktionen "onPress" und "onRelease" zuweist. Da Deine Variable "spieler.aktiv" ja erstmal den Wert "spieler1_mc" trägt. Definiere am Anfang mal für beide Spieler die Funktionen

PHP-Code:
_root.spieler1_mc.onPress = ...
_root.spieler1_mc.onRelease = ...

// das auch dür Spieler 2 
Innerhalb dieser Funktion fragst Du dann, ob der Spieler auch aktiv ist oder nicht.

Etwas so:

PHP-Code:
if (this == spieler.aktiv) {...} 
Erst dann lässt Du den Drag zu.

Oder Du definierst und löscht die Funktionen des jeweiligen Spielers innerhalb Deines Buttons "zugende_btn", je nachdem wer dann wieder dran ist.

Geändert von anfiba (21-03-2009 um 10:47 Uhr)
anfiba ist offline   Mit Zitat antworten
Alt 21-03-2009, 16:30   #3 (permalink)
Neuer User
 
Registriert seit: Feb 2009
Beiträge: 3
danke für die schnelle antwort, es klapt jezt einwandfrei!

doch damit tut sich auch gleich das nächste problem auf. ich habe mein kleines script umgeschrieben und um einige funktionalitäten erweitert. jezt wird bei rollover auf die spielfigur eine bewegungs schablone eingeblendet die die maximale bewegung der figur anzeigt und bewegungen darüber hinaus verhindert. dies ist nur eine der funktionalitäten die ich mir ausgedacht habe, am ende sollen die spielfiguren sich bewegen, schiessen und viele andere handlugen ausfüren können. nun das problem vor dem ich stehe.
hat jeder spieler nur eine figur wüste ich wie ich das ganze implementieren kann aber jeder spieler soll sagen wir mal 5-10 tups mit je 5-15 einheiten haben und jede soll über der ihrem typ zugewiesenen eigenschaften und funktionen vergügen. ich habe jezt nur leider überhaup keine vorstellung wie ich das realisieren soll ohne für jeden mc jeder spielfigur wie ich es in dem code hier gemacht habe einzeln die funktionalitäten zu implementieren(was sicher nicht der beste weg ist. zumidest kann ich mir das nicht vorstellen). vielleicht kann mir jemand von euch einen denkanstos oder noch besser ein kleines beispiel geben wie ich da ran gehen soll oder genauer wie ich für jede möglichkeit die eine spielfigur haben kann einen prototyp erzeugen kann auf den die vom aktiven spieler jeweils gerade ausgewälte einheit dann zugreifen kann.

ich hoffe meine frage ist einigermaßen richtig gestellt und verständlich. ich bin noch ein as neuling und trotz lektüre zahlreicher as tuts und hilfen habe ich wohl einige grundlegenden sachen noch nicht so richtig verstanden.

hier mein aktueller code(die klasse und den start bildschirm habe ich jezt nicht mit gepostet):
PHP-Code:
stop();

spieleranzeigen();

// name des aktiven spielers anzeigen
function spieleranzeigen() {
    if (
spieler.aktiv == "spieler1") {
        
_root.aktiv_txt.text "Spieler 1 ist am Zug";
    } else {
        
_root.aktiv_txt.text "Spieler 2 ist am Zug";
    }
}
//-------------------------------------------------------------------
//distanz in pixeln zwischen 2 heinheiten berechnen
/*function distanz(x, y) {
var distx = x._x-y._x;
var disty = x._y-y._y;
var dist = Math.sqrt(distx*distx+disty*disty);
return dist;
}*/
//-------------------------------------------------------------------
// bewegungs schablone bei rollover auf spielfigur erzeugen
// und eigenschaften der bewegungs schablone festlegen
_root.spieler1_trup1_einheit1_mc.onRollOver = function() {
    if (
spieler.aktiv == "spieler1") {
        
_root.attachMovie("bewegungsradius","radius_mc",zaehler);
        
_root.radius_mc._x _root.spieler1_trup1_einheit1_mc._x;
        
_root.radius_mc._y _root.spieler1_trup1_einheit1_mc._y;
        
_root.radius_mc._alpha 20;
        
xpos _root.spieler1_trup1_einheit1_mc._x;
        
ypos _root.spieler1_trup1_einheit1_mc._y;
        
radius 118;
    }
};
_root.spieler2_trup1_einheit1_mc.onRollOver = function() {
    if (
spieler.aktiv == "spieler2") {
        
_root.attachMovie("bewegungsradius","radius_mc",zaehler);
        
_root.radius_mc._x _root.spieler2_trup1_einheit1_mc._x;
        
_root.radius_mc._y _root.spieler2_trup1_einheit1_mc._y;
        
_root.radius_mc._alpha 20;
        
xpos _root.spieler2_trup1_einheit1_mc._x;
        
ypos _root.spieler2_trup1_einheit1_mc._y;
        
radius 118;
    }
};
//-----------------------------------------
// drag bei press auf spielfigur starten
_root.spieler1_trup1_einheit1_mc.onPress = function() {
    if (
spieler.aktiv == "spieler1") {
        
this.startDrag();
    }
};
_root.spieler2_trup1_einheit1_mc.onPress = function() {
    if (
spieler.aktiv == "spieler2") {
        
this.startDrag();
    }
};
//---------------------------------------------
// drag bei release auf spielfigur beenden und
// bewegungs schablone entfernen
_root.spieler1_trup1_einheit1_mc.onRelease = function() {
    if (
spieler.aktiv == "spieler1") {
        
this.stopDrag();
        
unloadMovie(_root.radius_mc);
    }
};
_root.spieler2_trup1_einheit1_mc.onRelease = function() {
    if (
spieler.aktiv == "spieler2") {
        
this.stopDrag();
        
unloadMovie(_root.radius_mc);
    }
};
//---------------------------------------------
// drag bei release auserhalb der spielfigur beenden und 
// bewegungs schablone entfernen
_root.spieler1_trup1_einheit1_mc.onReleaseOutside = function() {
    
unloadMovie(_root.radius_mc);
    
this.stopDrag();
};
_root.spieler2_trup1_einheit1_mc.onReleaseOutside = function() {
    
unloadMovie(_root.radius_mc);
    
this.stopDrag();
};
//-----------------------------------------------
// bewegungs schablone bei rollout von spielfigur entfernen
_root.spieler1_trup1_einheit1_mc.onRollOut = function() {
    
unloadMovie(_root.radius_mc);    
};
_root.spieler2_trup1_einheit1_mc.onRollOut = function() {
    
unloadMovie(_root.radius_mc);
};
//--------------------------------------------
// nur bewegung der gedragten spielfigur inerhalb der bewegungs schablone
// zulassen
_root.spieler1_trup1_einheit1_mc.onMouseMove = function() {
    if (
spieler.aktiv == "spieler1") {
        if (
radius>int(Math.sqrt(Math.pow(this._x-xpos2)+Math.pow(this._y-ypos2)))) {
            
this.this._x;
            
this.this._y;
        } else {
            
this._x this.x;
            
this._y this.y;
        }
    }
};
_root.spieler2_trup1_einheit1_mc.onMouseMove = function() {
    if (
spieler.aktiv == "spieler2") {
        if (
radius>int(Math.sqrt(Math.pow(this._x-xpos2)+Math.pow(this._y-ypos2)))) {
            
this.this._x;
            
this.this._y;
        } else {
            
this._x this.x;
            
this._y this.y;
        }
    }
};
//---------------------------------------------
// bei druck auf button ist der der nächste spieler am zug
_root.zugende_btn.onRelease = function() {
    if (
spieler.aktiv == "spieler1") {
        
spieler.aktiv "spieler2";
        
spieleranzeigen();
    } else {
        
spieler.aktiv "spieler1";
        
spieleranzeigen();
    }
}; 
daschima22 ist offline   Mit Zitat antworten
Alt 23-03-2009, 14:53   #4 (permalink)
So'n User
 
Benutzerbild von anfiba
 
Registriert seit: Dec 2005
Beiträge: 207
Hallo,

das Bester wäre ja natürlich, dass Du alles auf AS3 umbaust und Dir dort dann Deine Klassen schreibst und dort definierst, was Dein einzelner Spieler kann.
In Deinem Fall musst Du Dir dann Methoden schreiben, die Deinen Spielern die Aktionen zuweist. Somit hast Du dann an einer zentralen Stelle die Definition.

z.B.

PHP-Code:
function setPlayerFuntions(mc:MovieClip):void
{
    
mc.onRollOver = function()
    {
        
// "this" referenziert ja auf den MovieClip, auf dem sich die Methode befindet.
        
var player this._name.split("_")[0]; // ergibt ja "spieler1", da der Name so ist: "spieler1_trup1_einheit1_mc"
        
if (spieler.aktiv == player) {
            
_root.attachMovie("bewegungsradius","radius_mc",zaehler);
            
_root.radius_mc._x this._x;
            
_root.radius_mc._y this._y;
            
_root.radius_mc._alpha 20;
            
xpos this._x;
            
ypos this._y;
            
radius 118;
        }
    }
};


setPlayerFunctions(_root.spieler1_trup1_einheit1_mc); 

Das ist wie gesagt nur eine Möglichkeit bei Deinem jetzigen Aufbau. Das lässt Dir die Sache aber bei so einem komplexen Spiel - was es ja mal werden soll - schnell sehr unübersichtlich werden. Da bietet Dir AS3 weitaus mehr Möglichkeiten das modularer aufzubauen. Dazu müsst Du Dich aber mit Klassenprogrammierung beschäftigen.
anfiba ist offline   Mit Zitat antworten
Alt 23-03-2009, 15:42   #5 (permalink)
Neuer User
 
Registriert seit: Feb 2009
Beiträge: 3
danke für deine anregung anfiba!

ich werde mich gleich mal dran machen ein paar klassen zu entwerfen und versuchen meine funktionalitäten in ihnen einzubauen. mal schauen ob ich schon genau von klassen verstanden habe um dies zu bewergstelligen.

werde meine ersten ergebnisse wieder hier posten.
daschima22 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



Alle Zeitangaben in WEZ +1. Es ist jetzt 05:04 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele