+

Mausfolgen

Zuerst hatte ich das Mausfolgen mit Processing ausprobiert. In der alten Variante ging es nur um Gravitation, allerdings treten dort bei kleinem Abstand von Maus und Verfolger große Kräfte auf, die den Ball davonschnellen lassen.

Darum verhält sich der Verfolger in dieser Version mit haxe als würde er durch eine Feder angezogen, wenn er nahe am Mauszeiger ist. Im Header habe ich dann diese Variante benutzt, um den Weg der Rauchfahne zu besitmmen.



import flash.MovieClip;

class Mausfolgen {

    static var mc : MovieClip; // der gesamte film
    static var trabant : MovieClip;
    static var gravitation : Bool = true;

    static var movemouse : Bool = false;
    static var play : Bool = false;
    static var zeit : Int = 100;

    static var zentrumX : Int = 200; // zentrum der Bühne
    static var zentrumY : Int = 200;

    static function main() {
        mc = flash.Lib.current;
        denTrabantenMalen();
        mc.onEnterFrame = frame;
        mc.onMouseMove = maus;
    } // main()

    static function frame() {
        movemouse=true; // ist nötig, da "onMouseMove" öfter aufgerufen wird als "onEnterFrame"
        if (play) {
            denTrabantenBewegen();
            if (zeit > 0) { // maus steht still seit <zeit> Frames
                // trace(zeit);
            }
            zeit++;
            /* die animation anhalten, wenn der trabant den Zielort erreicht hat */
            if ( Math.abs(trabant.vecX)<0.15 && Math.abs(trabant.vecY)<0.15 ) { // geschwindigkeit = 0
                if ( Math.abs(trabant.posX-zentrumX)<0.25 && Math.abs(trabant.posY-zentrumY)<0.25 ) { // auslenkung = 0
                    denTrabantenInsZentrum(); // anfangszustand herstellen
                    play=false;
                }
            }
        } // if play
    } // frame()

    static function maus() {
        if (movemouse) { // ist nötig, da "onMouseMove" öfter aufgerufen wird als "onEnterFrame"
            movemouse = false;
            play = true;
            zeit = 0;
        }
    } // maus()

    static function denTrabantenBewegen() {
        var schwingungsdaempfung = 1.125;
        var federkraft = 0.1;
        if (gravitation) { // Gravitation (aber mit federeffekt nahe am gravitationszentrum)
            var entfernung = Math.sqrt( Math.pow(trabant.posX-mc._xmouse,2)+Math.pow(trabant.posY-mc._ymouse,2) );
            var mausVecX = trabant.posX-mc._xmouse;
            var mausVecY = trabant.posY-mc._ymouse;
            var neuVecX = -100/Math.pow(entfernung,2) * mausVecX;
            var neuVecY = -100/Math.pow(entfernung,2) * mausVecY;
            var kraefte = 15;
            var sinus = 0.5-Math.cos(entfernung/(Math.PI*kraefte) )/2.0; // 0...1
            var hyperbel = ( (-1.0*kraefte*kraefte/(entfernung+kraefte))+kraefte )*(1.0/kraefte);
            // trace(sinus+"  "+hyperbel2);
            trabant.vecX = trabant.vecX/schwingungsdaempfung + (sinus)*neuVecX - (1-hyperbel)*(mausVecX*federkraft);
            trabant.vecY = trabant.vecY/schwingungsdaempfung + (sinus)*neuVecY - (1-hyperbel)*(mausVecY*federkraft);

            // trace(neuVecX);
            // trace(entfernung);

        } else { // Feder
            var graviVecX = (zentrumX-trabant.posX)*federkraft;
            var graviVecY = (zentrumY-trabant.posY)*federkraft;
            var zeitspanne = 25; // nach dieser anzahl von Frames hat das Zentrum vollständig die Maus abgelöst
            if (zeit<zeitspanne) {
                var ix =(zeit/(3.1415926*(zeitspanne/10))); //
                var reihe1 = (Math.cos(ix)/2)+0.5; // von 1 runter bis 0
                var reihe2 = 1-reihe1; // von 0 bis 1
                var mausVecX = ( (mc._xmouse-trabant.posX)*federkraft )*reihe1 ;
                var mausVecY = ( (mc._ymouse-trabant.posY)*federkraft )*reihe1 ;
                graviVecX  = ( (graviVecX*reihe2) + mausVecX )/2;
                graviVecY  = ( (graviVecY*reihe2) + mausVecY )/2;
            }
            trabant.vecX = trabant.vecX/schwingungsdaempfung + graviVecX;
            trabant.vecY = trabant.vecY/schwingungsdaempfung + graviVecY;
        } // Gravitation o. Feder
        trabant.posX += trabant.vecX;
        trabant.posY += trabant.vecY;
        trabant._x = trabant.posX;
        trabant._y = trabant.posY;
    } // denTrabantenBewegen()

    static function denTrabantenMalen() {
        trabant = mc.createEmptyMovieClip ("trabant", mc.getNextHighestDepth());
        trabant.beginFill(0x234090,90);
        trabant.moveTo(-20,-20);
        trabant.lineTo(-20,20);
        trabant.lineTo(20,20);
        trabant.lineTo(20,-20);
        trabant.endFill();
        denTrabantenInsZentrum();
    } // denTrabantenMalen()

    static function denTrabantenInsZentrum() {
        trabant.posX = 0.0+zentrumX;
        trabant.posY = 0.0+zentrumY;
        trabant.vecX = 0.0;
        trabant.vecY = 0.0;
        trabant._x = trabant.posX;
        trabant._y = trabant.posY;
    } // denTrabantenInsZentrum()

} // class Mausfolgen