Flashhilfe.de - Flash Community

mc anhand mausposition bewegen [Flash 8]

 


AntwortenRegistrieren Seite1  

Atticus#1
Benutzerbild von Atticus
Beiträge: 1411
Wohnort: Leverkusen
Registriert: Jul 2006

07.08.2007, 04:35

Hallo, ich habe ein riesen problem. Ich habe eine bühne die ist 285 Pixel hoch und darin befindet sich ein MC. Alles was ich möchte ist das der MC sich anhand der mausposition bewegt. Das heißt die hälfte der bühne ist ja dann bei 285 pixeln genau 142.5 pixel. Ich möchte also das wenn die Maus sich auf der Y Achse zwischen 0 und 142.5 befindet der MC genau und höchstens bis zu 40 Picel nach unten bewegt und zwar langsam. und wenn die maus sich zwischen 142.5pixeln und 285pixeln befindet soll der mc bis zu 40 pixel nach oben bewegen, aber langsam.

Ich wäre wirklich sehr dankbar wenn mir jemand erklären könnte wie man sowas hinbekommt!

Gruß Atticus^^

Werbung
Beiträge: 0
Registriert: Feb 2016


pact kiz reman#2
Benutzerbild von pact kiz reman
Beiträge: 172
Registriert: May 2006

07.08.2007, 11:10

Aloha,

ich hätte da was für dich. Ich schlage vor, du probierst das mal in einem komplett neuen FLA um unvorhersehbare Effekte mit bereits vorhandenem Code etc. auszuschließen.

1. Neue FLA anlegen und leeren MC erstellen (muss auf Bühne legen, egal wo)
2. Bühnengröße (hier hab ich mal 500 x 285 px angenommen) ändern und FPS auf 25 stellen (flutscht besser)
3. zu bewegenden MC erstellen und Instanznamen vergeben (ich hab den move_mc genannt), dann am besten mal mittig platzieren
4. Folgenden Code kopieren:

Code für leeren MC für Mouse-Tracing
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
// ---> MouseTracer: Führt Aktion aus, wenn Maus innerhalb
// bzw außerhalb eines bestimmten Bereichs ist.

onClipEvent(enterFrame){
    if(_xmouse > (Stage.width) || _xmouse < 0 || _ymouse < 0 || _ymouse > (Stage.height/2))
   {
   _root.move_mc.newYPos = (Stage.height/2)-(_root.move_mc._height/2)-40;
   }
   else{
   _root.move_mc.newYPos = (Stage.height/2)-(_root.move_mc._height/2)+40;
   }
}


Code für zu bewegenden MC
ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
onClipEvent (load) {
    smooth = 4;
   newYPos = (Stage.height/2)-(this._height/2);
}

onClipEvent (enterFrame) {
   if (_y != newYPos) {
       if (this._y < newYPos) {
           step = (newYPos -  this._y) / smooth;
           this._y += step;
       } else {
           step = (this._y - newYPos) / smooth;
           this._y -= step;
    }
   if (step < 1) this._y = newYPos;
   }   
}


Das Ganze funktioniert so, dass bei betreten des Frames (daher ist die Framerate auch wichtig) der MC immer ein Stück weiter bewegt wird. Genauso wird die Maus getraced und je nach Ergebnis, die enstprechende Variable an den move_mc übergeben. -
Du solltest also kein Stop in deiner Zeitleiste haben, bzw. den aktuellen Frame immer wieder laden lassen, damit das funkioniert. Probier mal dram rum. Du kannst ja alles noch anpassen. Ich finde es ist ne schnelle Lösung.

Gruß!

Gruss + Dank!
Patrick
pact kiz reman#3
Benutzerbild von pact kiz reman
Beiträge: 172
Registriert: May 2006

07.08.2007, 11:14

Ach ja, also je höher die Framerate umso kleiner werden die Schritte.
Veränderst du den Wert Smooth, wird auch die Größe des Schrittes festgelegt. Somit können Geschwindigkeit und Sanftheit der Bewegung beeinflusst werden.

Zusätzlich kannst du noch folgenden Code in den leeren MC fürs Mouse-Tracing einfügen:
ActionScript:
1
2
3
4
5
6
7
8
9
10
// überprüft, ob Maus sich bewegt und startet Aktion
onClipEvent (mouseMove) {
    if(mouseMove)
   {
    //Aktion wenn Maus bewegt wird
   }
   else{
   //Aktion wenn Maus nicht bewegt wird
   }
}


Damit kann man die Sache noch erweitern, wenn man kreativ ist. Empfehlenswert ist vielleicht auch ein Intervall, dass die Bewegung erst nach einer gewissen Zeit startet oder sie nach x-Sekunden wieder auf 0 setzt, wenn die Maus sich nicht bewegt.
Viel Spaß!

Gruss + Dank!
Patrick
Atticus#4
Benutzerbild von Atticus
Beiträge: 1411
Wohnort: Leverkusen
Registriert: Jul 2006

Themenautor/in

07.08.2007, 20:34

Super, vielen Dank für deine Mühe !!!

Gruß Atticus^^

Werbung
Beiträge: 0
Registriert: Feb 2016


Atticus#5
Benutzerbild von Atticus
Beiträge: 1411
Wohnort: Leverkusen
Registriert: Jul 2006

Themenautor/in

08.08.2007, 04:38

So, habe doch noch eine Frage^^

Ich benutze jetzt folgendes Script:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
onClipEvent (load) {
    smooth = 65;
    //newXPos = (Stage.height/2)-(this._height/2);
}

onClipEvent (enterFrame) {
    if (_x != newXPos) {
        if (this._x < newXPos) {
            step = (newXPos -  this._x) / smooth;
            this._x += step;
        } else {
            step = (this._x - newXPos) / smooth;
            this._x -= step;
    }
    //if (step < 1) this._y = newYPos;
    }   
}
}


Das ist auf dem Mausabfrage MC:

ActionScript:
1
2
3
4
5
6
7
8
9
onClipEvent(enterFrame){
    if(_xmouse > (Stage.width) || _xmouse < 0 || _xmouse < 0 || _xmouse > (Stage.width/2))
    {
    _root.background02.newXPos = (Stage.width/2)-(_root.background02._width/2)-250;
    }
    else{
    _root.background02.newXPos = (Stage.width/2)-(_root.background02._width/2)+400;
    }
}


Was ich gerne noch hätte wäre das wenn die maus den Flashfilm Verlässt der MC wieder an die Startposition also mittig zurück scrollt das wäre x = 0. Außerdem Scroll der MC schon am anfang bevor die Maus auf dem Flashfilm ist schon nach rechts, ich hätte gerne das das auch unterbunden wird und der MC am anfang bei x = 0 stehen bleibt. Noch zur info, ich habe das umgeändert sods der MC nicht nach unten und oben sondern nach links und rechts scrollt^^ Und der zu Scrollende MC ist 912 Pixel breit, genau wie der Flashfilm. Der AusgangsPunkt des zu Scrollenden MC liegt links. Es wäre super wenn du mir zeigen könntest was ich da noch ergänzen muß damit das funktioniert!!!

Gruß Atticus^^
Geändert von Atticus am 08.08.07 um 05:27 Uhr
pact kiz reman#6
Benutzerbild von pact kiz reman
Beiträge: 172
Registriert: May 2006

08.08.2007, 10:32

Hallo,

mal so generell zur Erklärung:

1. Das Zurücksetzen machen wir gleich (schreibe nachher was dazu)

2. die Startposition des MCs kannst du ja einfach durch Platzierung auf der Bühne bestimmen oder z.B. direkt im MC unter "onClipEvent(enterFrame)" feste Koordinaten setzen. Dazu folgender Code:
ActionScript:
1
2
3
4
5
6
7
onClipEvent (load) {
    smooth = 4;
   newYPos = (Stage.height/2)-(this._height/2); //setzt Koordinate die durch die sanfte Bewegung erreicht werden soll, kann auch weggelassen werden
//newXPos ebenfalls möglich
   this._y = (Stage.height/2)-(this._height/2); //setzt mc sofort auf Koordinate
   // auch möglich: this._x = (Stage.width/2)-(this._width/2);
}


3. die "Smooth"-Funktion im MC kann natürlich auch mit Y, X, Alpha oder sonstewas für Eigenschaften genutzt werden. Einfach den Code innerhalb von "EnterFrame" kopieren (gesamte if-Schleife) und abändern. Passende Variable nicht vergessen. - "if (step < 1)" dient dazu die Funktion zu beenden, wenn der MC seine Position erreicht hat. Sonst läuft die Funktion immer durch und das braucht ne Menge Rechenleistung. Step 0.1 ist auch okay und sanfter.

4. Wenn der Ankerpunkt deines MCs nicht in der Mitte liegt, brauchst du bei der Positionsangabe nicht "-(_root.background02._width/2)" abziehen. (Stage.width/2) reicht dann. (Oder du gibst nen festen Wert an wie 120 oder so.) Dann wird der Ankerpunkt links am MC angenommen.

to be continued... ;)

Gruss + Dank!
Patrick
pact kiz reman#7
Benutzerbild von pact kiz reman
Beiträge: 172
Registriert: May 2006

08.08.2007, 10:49

So, zum Thema "Wenn die Maus nicht mehr auf der Bühne ist..." gibt's folgendes zu sagen: Flash kann nicht erkennen ob die Maus nicht da ist, sondern nur ob (also dass) sie da ist.
Daher machen wir das so: Es gibt ein Intervall das alle x-Sekunden den bewegten MC zurücksetzt (also auf eine Position deiner Wahl). Das passiert also immer in einer Schleife. - Nur wenn das Intervall unterbrochen wird, wird der MC nicht zurückgesetzt. Und unterbrochen wird es durch den Mousetracer. Erkennt dieser ne Bewegung, keine Bewegung oder, dass die Maus über dem definierten Bereich ist, setzt er das Intervall zurück und nix passiert mit dem MC.

Code in 1. Frame der Zeitleiste
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
// Funktion bringt bewegten MC an Ausgangsposition
ClipsZurück = function () {
   // was soll mit bewegtem MC passieren?
   // z.B.: _root.move_mc.newYPos = (Stage.height/2)-(_root.move_mc._height/2);
   // z.B.: _root.move_mc.newXPos = (Stage.width/2)-(_root.move_mc._width/2);
   // denke dran, entsprechende Funktionen im MC benötigt
}


// Intervall läuft in Schleife und setzt bewegten MC alle x-ms zurück,
// es sei denn, Mouse-Tracer stellt Mausbewegung fest und setzt Intervall zurück.
function ResetMCs(was) {
   if(was) {
      loop = setInterval(function() {ClipsZurück();}, 1000);
   }else {
      clearInterval(loop);
   }
}

// Funktionen setzen Intervall zurück, aufgerufen wenn Maus festgestellt
MouseIn = function() {
      ResetMCs(false);
      ResetMCs(true);
}
MouseMove = function() {
      ResetMCs(false);
      ResetMCs(true);
}
MouseHold = function() {
      ResetMCs(false);
}



Code für Mouse-Tracer (kann zusätzlich zum vorhandenen genutzt werden
Achtung! Natürlicht geht nur ein enterFrame-Event etc. also if-Schleife Kopieren und einfügen
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
onClipEvent(enterFrame){
   // Bereich der Überwacht werden soll: rechter Rand, linker Rand, oberer Rand, unterer Rand
   // min. 10px zum Bühnenrand sollten gelassen werden, denn sonst erkennt Flash nicht,
      // das Maus nicht mehr im Bereich ist, da ja die Bühne zu ende ist.
    if(_xmouse > (Stage.width-10) || _xmouse < 10 || _ymouse < 10 || _ymouse > (Stage.height-10))
   {
   //Wenn Maus nicht im Bereich:
   //Intervall wird nicht unterbrochen, MC wird zurückgesetzt
   }
   else{
   _root.MouseIn();
   }
}

// Dient dazu festzustellen ob die Maus sich bewegt (ergo: Zeiger ist über Bühne)
onClipEvent (mouseMove) {
    if(mouseMove)
   {
    _root.MouseMove();
   }
   else{
   _root.MouseHold();
   }
}




Wenn du alles miteinander Kombinierst, klappt schon alles.
Gruß!

Gruss + Dank!
Patrick
Atticus#8
Benutzerbild von Atticus
Beiträge: 1411
Wohnort: Leverkusen
Registriert: Jul 2006

Themenautor/in

08.08.2007, 14:01

Hallo, und erstmal vielen Dank für deine Mühe!!! Also ich habe jetzt das hier auf dem zu verschiebenen MC:

ActionScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
onClipEvent (load) {
    smooth = 65;
    //newXPos = (Stage.height/2)-(this._height/2);
}

onClipEvent (enterFrame) {
    if (_x != newXPos) {
        if (this._x < newXPos) {
            step = (newXPos -  this._x) / smooth;
            this._x += step;
        } else {
            step = (this._x - newXPos) / smooth;
            this._x -= step;
    }
    if (step < 0.1) this._x = newXPos;
    }   
}


Das hier auf dem Mausbeweger MC:

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
onClipEvent(enterFrame) {
   if(_xmouse > (Stage.width-10) || _xmouse < 10 || _ymouse < 10 || _ymouse > (Stage.height-10)) {
    //Wenn Maus nicht im Bereich:
    //Intervall wird nicht unterbrochen, MC wird zurückgesetzt
    }
    else {
    _root.MouseIn();
    }
   
    if(_xmouse > (Stage.width) || _xmouse < 0 || _xmouse < 0 || _xmouse > (Stage.width/2)) {
       _root.background02.newXPos = (Stage.width/2)-(_root.background02._width/2)-250;
    }
    else {
    _root.background02.newXPos = (Stage.width/2)-(_root.background02._width/2)+400;
    }
}

onClipEvent (mouseMove) {
    if(mouseMove)
    {
    _root.MouseMove();
    }
    else{
    _root.MouseHold();
    }
}


Und das hier in der _root leiste:

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
// Funktion bringt bewegten MC an Ausgangsposition
ClipsZurück = function () {
    // was soll mit bewegtem MC passieren?
    // z.B.: _root.move_mc.newYPos = (Stage.height/2)-(_root.move_mc._height/2);
    _root.background02.newXPos = 0;
    // denke dran, entsprechende Funktionen im MC benötigt
}


// Intervall läuft in Schleife und setzt bewegten MC alle x-ms zurück,
// es sei denn, Mouse-Tracer stellt Mausbewegung fest und setzt Intervall zurück.
function ResetMCs(was) {
    if(was) {
        loop = setInterval(function() {ClipsZurück();}, 1000);
    }else {
        clearInterval(loop);
    }
}

// Funktionen setzen Intervall zurück, aufgerufen wenn Maus festgestellt
MouseIn = function() {
        ResetMCs(false);
        ResetMCs(true);
}
MouseMove = function() {
        ResetMCs(false);
        ResetMCs(true);
}
MouseHold = function() {
        ResetMCs(false);
}


Aber das geht alles nicht. Der MC geht immernoch am anfang direkt nach links obwohl ich mit der Maus noch nicht auf der Bühne war und zurück geht der MC nach verlassen der Bühne auch nicht. Weist du wo mein Fehler liegt ??

Gruß Atticus^^

Atticus#9
Benutzerbild von Atticus
Beiträge: 1411
Wohnort: Leverkusen
Registriert: Jul 2006

Themenautor/in

08.08.2007, 14:22

Hallo, ich habe jetzt auch das hier gefunden das funktioniert auch wunderbar:

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
background02.onEnterFrame = function() {
   
   var obenBereichgrenze = (Stage.height/2) - 37;
   var untenBereichgrenze = (Stage.height/2) + 37;
   
   var linksBereichgrenze = (Stage.width/2) - 300;
   var rechtsBereichgrenze = (Stage.width/2) + 300;

   if(this._y >= obenBereichgrenze) {
      this._y += ((_root._ymouse < Stage.height/2)?(0): (-3));
   }

   if(this._y <= untenBereichgrenze) {
      this._y += ((_root._ymouse < Stage.height/2)?(3): (0));
   }
   
   if(this._x >= linksBereichgrenze) {
      this._x += ((_root._xmouse < Stage.width/2)?(0): (-3));
   }

   if(this._x <= rechtsBereichgrenze) {
      this._x += ((_root._xmouse < Stage.width/2)?(3): (0));
   }
};


Hier geht der MC auch nach oben und unten. Nach oben und unten funktioniert, aber links und rechts macht wieder Probleme. Am anfang bewegt der MC sich einfach wieder ungewollt nach recht. Obwohl der x un y punkt jetzt in der mitte des MC liegen. Und wofür stehen diese werte:

ActionScript:
1?(3): (0)); //????


Gruß Atticus^^

Olli_K#10
Benutzerbild von Olli_K
Beiträge: 1413
Wohnort: Hauptstadt
Registriert: Dec 2004

08.08.2007, 14:27

Selbe Thematik inklusive Lösung wurde heute schon erfolgreich gelöst und das ohne 300 Seiten AS.

http://flashhilfe.de/forum/flash/bewegungradius-einschraenken-215895-215895.html

Olli K.
http://www.bithotel.de
LG | Olli

pixbox
Geändert von Olli_K am 08.08.07 um 14:27 Uhr
pact kiz reman#11
Benutzerbild von pact kiz reman
Beiträge: 172
Registriert: May 2006

08.08.2007, 16:14

Danke Olli, ist ein guter Tipp.
Allerdings glaube ich, dass dieser Beitrag schon auch seine Berechtigung hat.

Ich bastel heute Abend mal ne Fla zusammen, dann haben wir das auch erledigt. Gruß!

Gruss + Dank!
Patrick
Atticus#12
Benutzerbild von Atticus
Beiträge: 1411
Wohnort: Leverkusen
Registriert: Jul 2006

Themenautor/in

08.08.2007, 16:51

Super, vielen Dank für deine Mühe und ich freue mich schon auf deine FLA!!!

Gruß Atticus^^

Atticus#13
Benutzerbild von Atticus
Beiträge: 1411
Wohnort: Leverkusen
Registriert: Jul 2006

Themenautor/in

09.08.2007, 05:31

Also ich habe es jetzt so wie oben beschrieben gemacht und es funktioniert jetzt wunderbar!!! Ich möchte an dieser Stelle allen für Ihre Mühe sehr danken!!!

Gruß Atticus^^


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   php-resource.de   phpforum.de   phpwelt.de   Pixelio.de   Scubacube.de  
Haftungsausschluss   Datenschutzerklärung   Hier Werben   Impressum
© 1999-2019 Sebastian Wichmann - Flashhilfe.de