Flashhilfe.de - Flash Community

Button Code verkürzen bzw. zusammenfassen [Flash 10]

 


AntwortenRegistrieren Seite1  

websnake75#1
Benutzerbild von websnake75
Beiträge: 22
Registriert: Oct 2009

04.07.2011, 20:26

Ich habe folgenden Code für meinen ersten Button (btn1) geschrieben, der auch wie gewünscht funktioniert. Da ich Anfänger bin, frage ich mich nun ob ich für jeden weiteren Button genau so viel Code benötige oder ob man da was zusammenfassen bzw. optimieren kann.

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
stop();
import flash.events.MouseEvent;

btn1.addEventListener(MouseEvent.CLICK, btn1click);
btn1.addEventListener(MouseEvent.MOUSE_OVER, btn1over);
btn1.addEventListener(MouseEvent.MOUSE_OUT, btn1out);
btn2.addEventListener(MouseEvent.CLICK, btn2click);
btn3.addEventListener(MouseEvent.CLICK, btn3click);
btn4.addEventListener(MouseEvent.CLICK, btn4click);

function btn1click(event:MouseEvent):void{
     gotoAndStop(2)
}

function btn1over(event:MouseEvent):void{
     MovieClip(button).gotoAndPlay(2)
}
function btn1out(event:MouseEvent):void{
     MovieClip(button).gotoAndPlay(11)
}
Schlagwörter: button, code
Kerstin77#2
Benutzerbild von Kerstin77
Beiträge: 1004
Registriert: Jul 2008

04.07.2011, 21:57

Hallo,

was man machen könnte wäre sowas:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
btn1.addEventListener(MouseEvent.MOUSE_OVER, buttonFunctions);
btn1.addEventListener(MouseEvent.MOUSE_OUT, buttonFunctions);
btn1.addEventListener(MouseEvent.CLICK, buttonFunctions);

function buttonFunctions(evt:MouseEvent):void {
     switch(evt.type) {
        case "mouseOver":
           trace("Maus über dem Button");
           break;
        case "mouseOut":
           trace("Maus neben dem Button");
           break;
        case "click":
           trace("Button geklickt");
     }
}


Wirklich kürzer ist das jedoch nicht - vielleicht etwas übersichtlicher.

Grüße
Kerstin
Wer Rechtschreibfehler findet, darf sie gerne behalten.
ashitaka#3
Benutzerbild von ashitaka
Beiträge: 161
Registriert: Apr 2010

05.07.2011, 12:23

Hier noch eine Erweiterung für mehrere buttons.

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
btn1.addEventListener(MouseEvent.MOUSE_OVER, buttonFunctions);
btn1.addEventListener(MouseEvent.MOUSE_OUT, buttonFunctions);
btn1.addEventListener(MouseEvent.CLICK, buttonFunctions);
btn2.addEventListener(MouseEvent.CLICK, buttonFunctions);

function buttonFunctions(evt:MouseEvent):void {
       switch(evt.type) {
          case "mouseOver":
             trace("Maus über dem Button");
             break;
          case "mouseOut":
             trace("Maus neben dem Button");
             break;
          case "click":
              if (evt.currentTarget == btn1) {
                    trace("btn1 geklickt");
             } else   if (evt.currentTarget == btn2) {
                     trace("btn2 geklickt");
             }
       }
}


statt der if-abfrage kann man denk ich auch wieder nen switch machen, kommt schöner.
War mir aber gerade nicht sicher obs dann auch so funktioniert.
Zeitleisten-Programmierung ist böse! löst euch von der Zeitleiste -> benutzt Flashdevelop!
Antworten auf Flash AS3 Fragen.
Flash Programmierer
RustyCake#4
Benutzerbild von RustyCake
Beiträge: 1776
Wohnort: Laimbach 6 1/2
Registriert: Nov 2002

05.07.2011, 13:48

Eine Lösung mit Array!
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
stop();
//
import flash.display.MovieClip;
//
var btnArray:Array = [btn1,btn2,btn3];
var memo:MovieClip;
//
for (var i:uint =0; i<btnArray.length; i++)
{
     btnArray[i].buttonMode = true;
     btnArray[i].ID = i;
     btnArray[i].addEventListener (MouseEvent.CLICK, clickHandler);
     btnArray[i].addEventListener (MouseEvent.MOUSE_OVER, overHandler);
     btnArray[i].addEventListener (MouseEvent.MOUSE_OUT, outHandler);
}
//
function clickHandler (e:MouseEvent):void
{
     if (memo != null)
     {
        memo.gotoAndStop ("out");
     }
     gotoAndStop(e.currentTarget.ID+2);
     e.target.gotoAndStop ("click");
     memo = e.currentTarget as MovieClip;
}
//
function overHandler (e:MouseEvent):void
{
     if (memo != e.currentTarget)
     {
        e.target.gotoAndStop ("over");
     }
}
//
function outHandler (e:MouseEvent):void
{
     if (memo != e.currentTarget)
     {
        e.target.gotoAndStop ("out");
     }
}
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muss erst gehen lernen"
websnake75#5
Benutzerbild von websnake75
Beiträge: 22
Registriert: Oct 2009

Themenautor/in

07.07.2011, 20:23

Hallo, ich versuche gerade den Code von ashitaka in meiner fla-Datei anzuwenden. Bekomme aber in Zeile 23, 4, 5, 6 einen Fehler "Zugriff auf eine nicht definierte Eigenschaft btn2". Hier mal mein Versuch:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
btn1.addEventListener(MouseEvent.MOUSE_OVER, buttonFunctions);
btn1.addEventListener(MouseEvent.MOUSE_OUT, buttonFunctions);
btn1.addEventListener(MouseEvent.CLICK, buttonFunctions);
btn2.addEventListener(MouseEvent.MOUSE_OVER, buttonFunctions);
btn2.addEventListener(MouseEvent.MOUSE_OUT, buttonFunctions);
btn2.addEventListener(MouseEvent.CLICK, buttonFunctions);

function buttonFunctions(evt:MouseEvent):void {
       switch(evt.type) {
          case "mouseOver":
           MovieClip(button1).gotoAndPlay(2)
  //           trace("Maus über dem Button");
         break;
          case "mouseOut":
           if(MovieClip(button1)) MovieClip(button1).gotoAndPlay(11)
  //           trace("Maus neben dem Button");
         break;
          case "click":
  //           trace("Button geklickt");
//         gotoAndStop(2)
              if (evt.currentTarget == btn1) {
                      trace("btn1 geklickt");
               } else if (evt.currentTarget == btn2) {
                       trace("btn2 geklickt");
               }    
        }
}


Kann mir da jemand weiterhelfen? Ich weiß auch nicht wie ich die Zeilen für btn3 und btn4 anlegen muss. Ich hänge die Datei mal dran.

Gruß

Ronald

Angehängte Dateien:
Adobe Flash Quelldatei Frost.fla98.19 KB
ashitaka#6
Benutzerbild von ashitaka
Beiträge: 161
Registriert: Apr 2010

08.07.2011, 12:42

ich frage mich warum überhaupt was funcktioniert und er nicht schon bei btn1 meckert.
Wo ist denn btn1?? hab den in der fla nicht gefunden!
Zeitleisten-Programmierung ist böse! löst euch von der Zeitleiste -> benutzt Flashdevelop!
Antworten auf Flash AS3 Fragen.
Flash Programmierer
websnake75#7
Benutzerbild von websnake75
Beiträge: 22
Registriert: Oct 2009

Themenautor/in

08.07.2011, 17:23

Wenn Du die ebene menu_btn wieder einblendest, und dann den ersten Button wählst, dann siehst Du den Instanznamen btn1.

Gruß

Ronald
RustyCake#8
Benutzerbild von RustyCake
Beiträge: 1776
Wohnort: Laimbach 6 1/2
Registriert: Nov 2002

08.07.2011, 17:46

Das ( if(MovieClip(button1)) MovieClip(button1).gotoAndPlay(11) ), ist ein wenig verwirrend,
was soll das vorstellen?
Und was möchtest Du bei klick erreichen ? Frames ansteuern auf der HTM ??
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muss erst gehen lernen"
websnake75#9
Benutzerbild von websnake75
Beiträge: 22
Registriert: Oct 2009

Themenautor/in

08.07.2011, 18:10

Bin noch Anfänger, was bedeutet HTM?

Beim klicken auf btn1 möchte ich in der Hauptzeitleiste auf bild2 springen. Dabei verschwinden dann ja die Buttons und es wird ja mouse_out ausgelöst.

In z.b. btn1out() wird dann versucht auf
   den button zuzugreifen, was aber nicht geht,
   weil er nicht mehr auf der bühne ist.

   Deshalb wird if (MovieClip(button1)) eingesetzt

Ich habe das so bei einem anderen Code angewendet, mit dem ich die gleiche Datei verlinkt habe. Dort funktioniert es. Leider bin ich mir auch nicht sicher ob das mit dieser Variante auch so geht.
RustyCake#10
Benutzerbild von RustyCake
Beiträge: 1776
Wohnort: Laimbach 6 1/2
Registriert: Nov 2002

08.07.2011, 18:24

HTM hätte eigentlich HTL heissen sollen, und bedeutet Haupttimeline, also die oberste Ebene Deines Movies.
Wenn der "btn1" nicht mehr existiert , dann macht das im zugewiesene Script auch keinen Sinn mehr, also das hier"if(MovieClip(button1)) MovieClip(button1).gotoAndPlay(11)", wird ja auch nicht mehr ausgeführt.
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muss erst gehen lernen"
websnake75#11
Benutzerbild von websnake75
Beiträge: 22
Registriert: Oct 2009

Themenautor/in

08.07.2011, 18:35

Ok, nur selbst wenn ich das rausnehme funktionierts auch nicht.

Ich hänge mal die andere fla dran, bei der es wie gewünscht funktioniert. Dann siehst Du besser wo ich hin will.

Angehängte Dateien:
Adobe Flash Quelldatei Frosttest.fla101.26 KB
RustyCake#12
Benutzerbild von RustyCake
Beiträge: 1776
Wohnort: Laimbach 6 1/2
Registriert: Nov 2002

08.07.2011, 19:14

Die Datei hilft mir nix, da rauscht mein CS5 ab !
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muss erst gehen lernen"
websnake75#13
Benutzerbild von websnake75
Beiträge: 22
Registriert: Oct 2009

Themenautor/in

08.07.2011, 19:46

Das ist ja schade, vielleicht hilft der Code aus der Datei weiter.

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
stop();
import flash.events.MouseEvent;

btn1.addEventListener(MouseEvent.CLICK, btn1click);
btn1.addEventListener(MouseEvent.MOUSE_OVER, btn1over);
btn1.addEventListener(MouseEvent.MOUSE_OUT, btn1out);
btn2.addEventListener(MouseEvent.CLICK, btn2click);
btn2.addEventListener(MouseEvent.MOUSE_OVER, btn2over);
btn2.addEventListener(MouseEvent.MOUSE_OUT, btn2out);
btn3.addEventListener(MouseEvent.CLICK, btn3click);
btn3.addEventListener(MouseEvent.MOUSE_OVER, btn3over);
btn3.addEventListener(MouseEvent.MOUSE_OUT, btn3out);
btn4.addEventListener(MouseEvent.CLICK, btn4click);
btn4.addEventListener(MouseEvent.MOUSE_OVER, btn4over);
btn4.addEventListener(MouseEvent.MOUSE_OUT, btn4out);

//Ausführung auf btn1
function btn1click(event:MouseEvent):void{
     gotoAndStop(2)
}

function btn1over(event:MouseEvent):void{
     MovieClip(button1).gotoAndPlay(2)
}

function btn1out(event:MouseEvent):void{
  /*   MovieClip(button1).gotoAndPlay(11)
     so sah die Funktion ursprünglich aus
     wenn man auf einen button clickt,
     wird im hauptframe das Bild gewechselt.
     Dadurch verschwindet der Button.
     Dadurch wird ein MOUSE_OUT ausgelöst.
 
     in z.b. btn1out() wird dann versucht auf
     den button zuzugreifen, was aber nicht geht,
     weil er nicht mehr auf der bühne ist :)
 
     Deshalb wird if (MovieClip(button1)) eingesetzt
  */
     if(MovieClip(button1)) MovieClip(button1).gotoAndPlay(11)
}

//Ausführung auf btn2
function btn2click(event:MouseEvent):void{
     gotoAndStop(3)
}

function btn2over(event:MouseEvent):void{
     MovieClip(button2).gotoAndPlay(2)
}

function btn2out(event:MouseEvent):void{
     if(MovieClip(button2)) MovieClip(button2).gotoAndPlay(11)
}

//Ausführung auf btn3
function btn3click(event:MouseEvent):void{
     gotoAndStop(4)
}

function btn3over(event:MouseEvent):void{
     MovieClip(button3).gotoAndPlay(2)
}

function btn3out(event:MouseEvent):void{
     if(MovieClip(button3)) MovieClip(button3).gotoAndPlay(11)
}
//Ausführung auf btn4
function btn4click(event:MouseEvent):void{
     gotoAndStop(5)
}

function btn4over(event:MouseEvent):void{
     MovieClip(button4).gotoAndPlay(2)
}

function btn4out(event:MouseEvent):void{
     if(MovieClip(button4)) MovieClip(button4).gotoAndPlay(11)
}
RustyCake#14
Benutzerbild von RustyCake
Beiträge: 1776
Wohnort: Laimbach 6 1/2
Registriert: Nov 2002

08.07.2011, 21:09

Hab es mir auf einem anderen Rechner anschauen können.
Jetzt versteh ich auch das hier,
***************
if(MovieClip(button1)) MovieClip(button1).gotoAndPlay(11)
***************
das ist aber eigentlich nicht nötig, wenn man das Menue respt. die Buttons einfacher gestalten würde.
Ich überlege mir was.
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muss erst gehen lernen"
ashitaka#15
Benutzerbild von ashitaka
Beiträge: 161
Registriert: Apr 2010

09.07.2011, 16:42

ich hab mal den lösungsansatz mit den arrays von RustyCake aufgegriffen und was gebaut mit weniger Zeitleistenkram, dafür Tween per AS.
Ausserdem spart man sich so noch den code in den pages.

Grundsätzlich ist es übersichtlicher, den ganzen code in einem zu haben, anstatt in vielen MC´s versteckt.

Besser sind natürlich eh externe as-files und OOP.

Die Button MouseOvers haben noch nen bug ... sorry ;)

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
stop();
//
import fl.transitions.Tween;
import fl.transitions.easing.*;
import flash.display.MovieClip;
//
var btnArray:Array = [btn1,btn2,btn3];
var pagesArray:Array = [page1, page2, page3]
var memo:MovieClip;
//
for (var i:uint =0; i<btnArray.length; i++)
{
       btnArray[i].buttonMode = true;
       btnArray[i].ID = i;
       btnArray[i].addEventListener (MouseEvent.CLICK, clickHandler);
       btnArray[i].addEventListener (MouseEvent.MOUSE_OVER, overHandler);
       btnArray[i].addEventListener (MouseEvent.MOUSE_OUT, outHandler);
}

for ( i =0; i<pagesArray.length; i++)
{
       pagesArray[i].btn_back.addEventListener(MouseEvent.CLICK, toMainMenu);
      pagesArray[i].ID = i;
      pagesArray[i].y = 80;
}
//
function clickHandler (e:MouseEvent):void
{
     setButtonsVisible(false); // main menu verstecken
   
     var page:MovieClip = pagesArray[e.currentTarget.ID]; // die page, die angezeigt werden soll aus dem array holen
   
     var myTween:Tween = new Tween(page, "x", Strong.easeOut, 550, 290, 1.5, true);
     
}
//
function overHandler (e:MouseEvent):void
{
       if (memo != e.currentTarget)
       {
          e.currentTarget.gotoAndPlay ("over");
       }
}
//
function outHandler (e:MouseEvent):void
{
 
       e.currentTarget.gotoAndPlay ("out");
 
     
}

function toMainMenu(e:MouseEvent):void {
     var page:MovieClip = pagesArray[e.currentTarget.parent.ID]; // parent vom button ist die page
   var myTween:Tween = new Tween(page, "x", Strong.easeOut, page.x, 550, 1.5, true);
     setButtonsVisible(true);
}


//////////////
function setButtonsVisible(val:Boolean):void { // den visible-wert aller buttons setzen
   for (var i:uint =0; i<btnArray.length; i++) {
        btnArray[i].visible = val;
     }
}
Zeitleisten-Programmierung ist böse! löst euch von der Zeitleiste -> benutzt Flashdevelop!
Antworten auf Flash AS3 Fragen.
Flash Programmierer


Angehängte Dateien:
Adobe Flash Quelldatei Frosttest_02.fla102.23 KB
RustyCake#16
Benutzerbild von RustyCake
Beiträge: 1776
Wohnort: Laimbach 6 1/2
Registriert: Nov 2002

09.07.2011, 17:45

Servus nochmal.
Hab jetzt das Ding nach gebaut, so kann ich das anderen auch geben, ohne Photos etc. von Dir zu verwenden.
Bin zum Teil bei meinem Array-Konzept geblieben, aber nur um die Handler, nicht für jeden Button einzeln schreiben zu müssen.
Hab auch die Button vereinfacht, weil mir das mit den einzelnen Textfeldern, den Schaltflächen und den Backgrounds (mit den Fades) nicht eingeleuchtet hat.
Das ist jetzt alles in einem MovieClip zusammen gefasst.
Die Pages werden über ein Array gesteuert, dadurch spart man sich das if-else-Zeug, in der switch-case-Nummer.
Die Hover-Animation hab ich auch ein wenig angepasst, da kann man ohne Bezeichner arbeiten.
** Script von Frame 1 == Start_page**
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
stop();
//
import flash.display.MovieClip;
//
var btnArray:Array = [btn1,btn2,btn3];
var clickZielArray:Array =["page_1","page_2","page_3"];
//
for (var i:uint =0; i<btnArray.length; i++)
{
     btnArray[i].buttonMode = true;
     btnArray[i].ID = i;// jeder Button bekommt eine ID, die ID geht von 0-2, also btn1 bekommt ID 0
   // btn2 bekommt ID 1 und btn3 bekommt ID 2, was dem Array-Index von clickZielArray entspricht.
   // clickZielArray sind die Frame-Bezeichner "page_1 bis page_3" gespeichert.
   btnArray[i].addEventListener (MouseEvent.CLICK, btnHandlerStart);
     btnArray[i].addEventListener (MouseEvent.MOUSE_OVER, btnHandlerStart);
     btnArray[i].addEventListener (MouseEvent.MOUSE_OUT, btnHandlerStart);
}
//
function btnHandlerStart (e:MouseEvent):void
{
     switch(e.type) {
          case "mouseOver":
           e.currentTarget.play();
             break;
          case "mouseOut":
           e.currentTarget.gotoAndPlay(e.currentTarget.totalFrames-e.currentTarget.currentFrame);
             break;
          case "click":
           gotoAndStop (clickZielArray[e.currentTarget.ID]);// hier werden die Einträge aus dem,
       // clickZielArray übergeben, bei btn1 zb. ist das der Eintrag "page_1"
     }
}

**Script von Frame 2**
Bis auf die Instanznamen unterscheiden sich die Scripte in den Frames 2-4 nicht.
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
page1_mc.back_btn.buttonMode = true;
page1_mc.back_btn.mouseChildren = false;
page1_mc.back_btn.addEventListener (MouseEvent.CLICK, btnHandlerBack1);
page1_mc.back_btn.addEventListener (MouseEvent.MOUSE_OVER, btnHandlerBack1);
page1_mc.back_btn.addEventListener (MouseEvent.MOUSE_OUT, btnHandlerBack1);
//
function btnHandlerBack1 (e:MouseEvent):void
{
     switch(e.type) {
          case "mouseOver":
           e.currentTarget.play();
             break;
          case "mouseOut":
           e.currentTarget.gotoAndPlay(e.currentTarget.totalFrames-e.currentTarget.currentFrame);
             break;
          case "click":
           gotoAndStop ("start_page");
       }
}
Bitte keine Fragen, zu Flash per PM. Dazu ist das Forum da. Danke MFG_RustyCake!
"Wer tanzen will, muss erst gehen lernen"

Angehängte Dateien:
Adobe Flash Quelldatei btnStateFadeAS3.fla18.10 KB

AntwortenRegistrieren Seite1  

Schnellantwort

Du musst registriert sein, um diese Funktion nutzen zu können.

 
Ähnliche Beiträge zum Thema
Partner Webseiten: art-and-law.de  Mediengestalter.info   phpwelt.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Impressum
© 1999-2022 Sebastian Wichmann - Flashhilfe.de