[MX] Einmal geht's - einmal nicht...

aelf

Grünschnabel
hallo leute,

ich bin echt verwirrt. die sache ist die: ich bastel gerade an meiner neuen seite und die soll zum ersten mal komplett in flash sein. bevor ich nun die "richtige" FLA für die komplette seite angefangen habe, hatte ich lauter kleinere FLA´s, wo ich teilbereiche und techniken, die auf der endgültigen seite verwendet werden sollten, ausprobieren konnte. im anhang findet ihr zwei solcher FLA´s (ist ein selbst-entpackendes winrar-archiv): <main.fla> ist der anfang der "richtigen" FLA und <test03.fla> ist eine der vielen ausprobier-FLA´s, wie ich sie gerade beschrieben habe.

wenn ihr euch jetzt mal test03.fla anseht, dann könnt ihr mit der maus rechts oben an dem objekt über eine kleine stelle fahren (dort wo was übersteht), wo dann eine bewegung ausgelöst wird (menu-arm fährt raus). in der main.fla habe ich diese technik wieder angewendet - nur seltsamerweise will es diesmal nicht mehr funktionieren (wieder an derselben stelle, also rechts oben - die anderen menu-arme hab ich noch nicht bearbeitet). bestimmt ist es nur eine kleinigkeit, aber ich komm einfach nicht drauf... vielleicht findet ihr ja den fehler. das hauptscript findet ihr im MC des menu-arms, der jeweils rausfahren soll.

eine weitere frage hätte ich zu dem ganzen noch: wenn ihr das movie anseht, dann sieht man ganz kurz zu beginn, wie der jeweilige menu-arm, auf dem das script liegt, von links reinfliegt. warum tut es das? das ist nicht beabsichtigt...

achso ja: wundert euch nicht über die extrem ausführlichen kommentare von mir in den scripts - ich neige zu sowas, weil ich noch am lernen bin und sonst innerhalb von wenigen tagen schon nicht mehr durchblicken würde :D

VIELEN dank für´s reinkucken schonmal im voraus! :)

grüße,
aelf

ANHANG:
[Rechtsklick - Speichern unter] (selbstentpackendes winrar-archiv)
 
Zuletzt bearbeitet:
würd gern helfen, aber exe-dateien lad ich mir grundsätzlich nicht runter - nichts gegen dich aber generell zu 'gefährlich', hoffe du verstehst ;)

kannst du das zippen und hier anhängen? die flas natürlich, nicht die exe ... wär ja dann dasselbe ;)

gruß
rena
 
Hoi,

also deine Bewegung an sich kann nicht ablaufen, da du zwei Bedingungen ineinander verschachtelst:
Du prüfst zuerst, ob die x-Mausposition größer als 725 ist und hast daraufhin einen Anweisungsblock mit der zweiten Abfrage, die die Kollision Mauszeiger-Objekt betrifft.
Diese zweitgenannte Abfrage findet aber nur dann statt, wenn die erste Bedingung, nämlich dass der x-Mauszeiger über 725 hinaus ist, erfüllt ist.

Betrachtest du mal die Koordinaten deines Armes, dann wirst du feststellen, dass er nur bis zur x-Koordinate 615 verläuft.
Sobald also die erste Bedingung wahr ist, ist die zweite die nutzlos, da beide nie eintreffen können.
Setzt du hingegen bei der ersten Abfrage die Kondition wie folgt:
PHP:
if (_root._xmouse >= 725) {
...
}
dann klappt das ganze wunderbar. :)

Und zur ungewollten Bewegung mit dem Arm am Anfang:
Die geschieht, weil du die x-Position des Armes von Anfang an per enterFrame-Event von der Variable vel2 abhängig machst.
vel2 ist aber keine von dir schon zu Beginn deklarierte Variable, ist also undefined.
Von daher geht der Flash-Player davon aus, dass dein Arm zu Beginn auf x = 0 ist, was er als Aushilfsmaßnahme zu deinen Gunsten *überhaupt* macht, denn eigentlich läge ein Syntaxfehler vor und der Arm dürfte überhaupt keinen x-Wert erlangen...
Folglich hast du also überhaupt Glück, dass in der ActionScript-Engine der Wert "undefined" der Variable vel2 im Zusammenhang mit einer Rechenoperation als Zahlwert immerhin als eine 0 gerechnet wird und keinen kickout gibt. ;)

Umgehen kannst du das, indem du zu Beginn des Ladens, also am besten im load-Event des Armes die Variable richtig definierst:
PHP:
onClipEvent (load) {
...
vel2 = 615;
...
}
Das dürfte so ziemlich die Auflösung gewesen sein, hoffe das bringt dich vorwärts. :)

have a nice day,
Geist
 
vielen dank geist! die sache mit problem #1 funzt jetzt super :) aber bei problem #2 will das mit der variablen-definition im load-event irgendwie nicht so recht klappen. flashMX haut mir dann lauter fehlermeldungen um die ohren (expected ";" u.ä. - egal ob ich ";" gemacht hab oder testhalber mal weglasse - kommt trotzdem jedesmal). hast du es vielleicht mal selbst in der main.fla ausprobiert? irgendwas mach ich wohl falsch.

falls ich nicht allzusehr nerve :) (*duck*) hätte ich noch eine weitere frage zu dem ganzen (also wohl problem #3): und zwar hab ich bemerkt, daß wenn der arm erstmal ausgefahren ist, dann fährt er auch wieder wunderbar zurück, sobald ich den "arm-bereich" verlasse. aber wenn ich den arm stattdessen in der horizontalen in linker richtung verlasse, dann bleibt der arm dummerweise ausgefahren (beschreibende grafik hab ich in der neuen gepackten datei (siehe unten) zur veranschaulichung hinzugefügt).

jetzt hab ich mir gedacht, daß ich vielleicht noch einen weiteren hittest mit der großen "torso"-grafik (das große zentrierte ding, wo die arme dahinter sind) verschachteln könnte. also sowas in der art, daß wenn der mauszeiger den korpus berührt, dann soll er den arm auch wieder zurückfahren. hat aber nicht funktioniert. hat jemand eine idee, wie ich problem #3 anders in den griff kriege? danke schonmal :)

@rena: ja, das versteh ich schon. internet ist halt ein unsicheres metier :) hatte daraus eigentlich nur deshalb eine exe gemacht, weil ich es allen möglichst komfortabel vorbereiten wollte, aber das war wohl doch keine so gute idee. hier ist jetzt mal im anhang eine normal gepackte datei - keine exe diesmal :)

ANHANG:
[Rechtsklick - Speichern unter] (die main.fla ist hierin jetzt geupdated mit der lösung zu problem #1 dank geist)

[edit] p.s.: spielt der sound beim rausfahren des armes bei euch eigentlich ab? ich hab anfang der woche ein format c: über mein gesamtes system laufen lassen (war mal wieder nötig) und seit der system-neuinstallation kann ich bei meinen flash-sachen keinen sound mehr hören. seltsam... aber wenn das mit dem sound bei euch funzt, dann wüsste ich schonmal, daß es nicht an den FLA´s liegt (ging ja unverändert letzte woche noch - also vor dem formatieren). [/edit]
 
Zuletzt bearbeitet:
update: das mit dem sound hat sich erledigt - heute geht´s plötzlich wieder. war wohl irgendwas mit meinem system nicht so ganz ok gestern :)

problem #2 müsste eigentlich nach geist´s anleitung für mich lösbar sein - ich komm schon noch dahinter, warum geist´s erklärung (die ich verstanden habe) bei mir grad nicht so recht funktionieren will. irgendein dummer syntax-fehler meinerseits garantiert (wär mal wieder typisch *g*). ich arbeite daran *grübelprobier*

was #3 angeht bin ich allerdings doch noch etwas überfordert wie es scheint. hab inzwischen auch daran gedacht vielleicht eine hitarea drüber zu legen anstatt der ersten if-schleife. aber die if-schleife ist so schön effektiv (und gut wiederverwendbar) und deshalb überleg ich ständig, ob es nicht auch eine so hübsche einfache lösung zu problem #3 gäbe. mal sehen, was mir noch so einfällt :D

danke für´s mitgrübeln :)

[edit] na sowas... hab problem #2 gerade nochmal probiert und jetzt geht es plötzlich ohne zicken. ich versuch grad noch rauszufinden, warum es gestern nicht ging. jedenfalls bin ich schonmal froh, daß jetzt nur noch #3 übrig bleibt und ansonsten das ganze nun eigentlich ziemlich gut funktioniert :) unter diesem link findet ihr jetzt die nochmals geupdatete zip-datei, falls es sich jemand ansehen möchte :) [/edit]
 
Zuletzt bearbeitet:
Probiert habe ich die Sache in deiner Datei schon und es lief auch.
Du hättest ja mal dein fehlerhaftes Script drinlassen können, dann hätte man dir sagen können, wo dein Denkfehler liegt.
Die Lösung ist jedenfalls noch immer die gleiche wie vorher, nämlich innerhalb des Anweisungsblocks vom load-Event die Variable vel2 zu deklarieren und zu manipulieren.
Der Anweisungsblock ist der Teil zwischen den beiden geschweiften Klammern {...}
Im konkreten deinigen Fall - ich poste jetzt mal das gesamte Event ohne Kommentare mit - sieht das dann wie folgt aus:
PHP:
onClipEvent (load) {
    _root.xcoord = 515;
    vel = 2;			
    vel2 = 515;
    msnd2 = true;
    menu_sound = new Sound();
    menu_sound.attachSound("menu_wav");
}
und mehr ist's nicht. :)

Zum nächsten Problem:
Auch hierbei beachtest du wieder nicht die Konditionen, wann etwas geschehen soll.
Die Bewegung des Armes hängt einzig und allein vom enterFrame-Event ab, denn dort findet sich die x-Koordinatenzuweisung wieder.
In diesem Event gibt es aber eine einzige große Abfrage, die den Mauszeiger betrifft:
Es kann nur dann etwas stattfinden, wenn die x-Mausposition über 615 liegt.
Das ist im Falle eines Bewegens des Zeigers auf den Torso nicht der Fall.
Demzufolge brauchst du eine Abfrage, die sowohl die x-Mausposition größer als 615 beachtet, als auch für das Wiederreinfahren des Armes eine,
die sowohl dann greift wenn kein hitTest mehr erfolgt, als auch wenn die x-Mausposition kleiner als 615 wird und gleichzeitig der Arm ausgefahren ist.

Und da kannst du ganz gut die Variable msnd2 zur Hilfe nehmen:
Diese Variable besitzt den booleschen Wert "true", wenn der Arm eingefahren ist, jedoch den Wert "false", wenn er ausgefahren ist.
Somit hast du die Möglichkeit, die Abfrage im enterFrame-Event wie folgt zu modifizieren:
PHP:
if(_root._xmouse >= 615 || _root._xmouse < 615 && msnd2 == false) {
    ...
}
und schon hast du auch das linksseiige Rausfahren aus dem Arm erfasst. :)

An sich sollte aber auch ein zusätzlicher hitTest mit dem Torso klappen, nur hast du dann das Problem, dass du von Seiten des Torsos nicht ohne weiteres weißt, welcher Arm eingefahren werden soll, wenn er berührt wird...von daher ist so eine Anweisung auf dem MC, den es betrifft, besser.

Was den Sond betrifft, so lässt sich sagen, dass der passend erscheint, wenn der Arm ausgefahren wird, da hat sich nix geändert.
Denke mal, dass das so erfolgt, wie du es haben willst - klingt jedenfalls ganz passend.

So - hoffe das hilft dir wieder,
Geist

edit:
Hoppala, mittlerweile hast du's ja selbst rausbekommen...nicht gemerkt, dass du unterdessen nochmal gepostest hast. :)
 
oh, du hast schon geantwortet - sorry geist, daß ich kurz zuvor meinen letzten beitrag editiert hab! keine absicht! ich les mir jetzt zuerstmal genau durch, was du geschrieben hast :)
 
mal zwecks verständnis gefragt: bei mir sieht es momentan im load-event so aus:
PHP:
onClipEvent (load) {	
vel2 = 515
_root.xcoord = 515		
vel = 2			
msnd2=true			
menu_sound = new Sound()
menu_sound.attachSound("menu_wav")
}
warum funktioniert das obwohl ich keinen einzigen semikolon verwendet habe? ist MX da so kulant, daß es das durchgehen lässt? jedenfalls macht es zur zeit keine probleme damit. find das nur irgendwie seltsam.
 
Dazu lässt sich sagen, dass Semikolons in ActionScript nicht gefordert sind, sondern gesetzt werden können und nicht müssen.

Solange du deine einzelnen Anweisungen auf mehrere Zeilen verteilst, besteht keine Gefahr, dass dir ohne Semikolon der Code um die Ohren fliegt, sobald du jedoch mal anfängst, mehrere der Zeilen auf eine zu bringen, wird am Ende nix mehr herauskommen, da Semikolons zur Trennung von Anweisungen gebraucht werden.

Grob gesehen ist das mit wenig technischem Verstand auch nachvollziehbar, dass Zeilen wie
PHP:
var a = 35 while (a == 35) { trace(a) } a++ var b = 10 if (a != b) { trace("ok") }
keine Überlebenschance besitzen - von daher trennt man schon von sich aus zumeist die Anweisungen im Anweisungsblock mit Zeilenumbrüchen und es gibt kein Theater, weil der ActionScript-Interpreter des Flash-Players am Ende einer Zeile sowieso von sich aus ein Semikolon setzt.

Verhängnisvoll kann sowas bspw. aber hier werden:
PHP:
return
true
denn dann schlussfolgert die Engine folgendes
PHP:
return;
true;
und der Sinn von
PHP:
return true;
ist nicht erreicht worden.
Das geschieht halt, weil auch Zeilenumbrüche zwischen 2 Codeschnipseln erlaubt sind, aber du dann eben mit dem Setzen eines Semikolons rechnen musst.
Ähnlich sowas auch in Verbindung mit break...

Wie gesagt - eine Obligation ist es nicht, ein guter Usus allemal. :)

Andere Programmiersprachen wie C, C++ und Java verlangen diese Semikolons afaik immer, während JavaScript ähnlich ActionScript die gleiche Großzügigkeit wie ActionScript gegenüber dem User bietet.

Geist
 
ich grad was bemerkt: weiß nicht, ob das schon bekannt war hier im forum (bin ja noch ganz frisch hier seit das FF weg ist.. *schnief*..), aber wenn ich code direkt aus dem browser in flash reinkopiere (mr. tippfaul..), dann akzeptiert flashMX das nicht und bringt diese fehlermeldung mit dem <expected ";"> usw. - deshalb hat das mit der variablendefinition gestern nicht klappen wollen. heute hatte ich es per hand eingetippt und plötzlich ging´s.

dasselbe spiel hatte ich eben mit der erweiterten if-abfrage von geist: als ich die zuerstmal rüberkopiert hatte (aus opera übrigens) kam wieder oben erwähnte fehlermeldung, dann hab ich es mal per hand eingetippt und tataa: geht. na sowas...
 

Neue Beiträge

Zurück