WebHU - Programozási kérdések és válaszok

Doobers kicsapott – hogyan kell csinálni egy tween? Teszteset + képernyőkép csatolva

A legtöbb közösségi játékban (mint például a CastleVille (c) Zynga vagy a Magic Land (c) Wooga) vannak dooberek – érmék, csillagok stb., amelyeket a játékos kap néhány egyszerű műveletért, például favágásért.

Úgy tűnik, hogy a dooberek több tweent is végrehajtanak:

  1. Először kipattannak, ugrálnak. És a méreteik is ugrálnak.
  2. Ezt követően egy bezier görbében felrepülnek a pontozósávhoz.

Készítettem egy nagyon egyszerű tesztesetet és egy képernyőképet a kérdésemhez. A teszteset Flexben van, mert ezt használtam legutóbb, de a kérdésem általánosabb (ActionScript, Tween). A com.greensock.TweenMax könyvtárat használom.

Az én problémám: rájöttem, hogyan kell elkészíteni a második, bezier részt. De nem tudom, hogy kell csinálni az első, pattogós részt?

adja meg itt a kép leírását

MyApp.mxml (nem kell Flexnek lennie, lehet Flash):

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" 
               applicationComplete="init()">

    <fx:Script>
        <![CDATA[
            import mx.collections.ArrayList;
            import spark.core.SpriteVisualElement;
            import com.greensock.TweenMax;
            import com.greensock.easing.Cubic;

            private function init():void {
                var g:Graphics = myComp.graphics;
                g.clear();
                g.beginFill(0xCCCCCC);
                g.drawRect(0, 0, myComp.width, myComp.height);
                g.endFill();                
            }           

            private function handleClick(event:MouseEvent):void {
                var star:SpriteVisualElement = new Star();
                star.x = event.localX;
                star.y = event.localY;
                myComp.addChild(star);

                TweenMax.to(star, 1, {
                    delay: 2,
                    ease:  Cubic.easeOut,
                    bezier: [
                        {x: myComp.width - star.width, y: Math.max(event.localY, myComp.height/2)}, 
                        {x: myComp.width - star.width, y: 0}
                    ]
                });
            }

        ]]>
    </fx:Script>    

    <mx:UIComponent id="myComp" width="100%" height="100%" click="handleClick(event)" />

</s:Application>

Star.fxg:

<?xml version='1.0' encoding='UTF-8'?>
<!-- fxg/star.fxg -->
<fxg:Graphic xmlns:fxg="http://ns.adobe.com/fxg/2008" version="2">    
    <fxg:Path x="9.399" y="10.049" data="M 82.016 78.257 L 51.895 69.533 L 27.617 89.351 L 26.621 58.058 L 0.231 41.132 L 29.749 30.52 L 37.714 0.241 L 56.944 24.978 L 88.261 23.181 L 70.631 49.083 Z">
        <fxg:fill>
            <fxg:SolidColor color="#FFFFFF"/>
        </fxg:fill>
        <fxg:stroke>
            <fxg:SolidColorStroke 
                caps="none" 
                color="#4769C4" 
                joints="miter" 
                miterLimit="4" 
                weight="20"/>
        </fxg:stroke>
    </fxg:Path>
</fxg:Graphic>

Arra is kíváncsi lennék, hogyan lehet a legvégére hozzáadni egy "Polaroid fényképezőgép vaku" effektust?

FRISSÍTÉS:

A LondonDrugs_MediaServices segítségével (köszönöm!) az ügyeskedők szorítanak és ugrálnak (a kód lent), de még mindig van 3 nyitott problémám:

  1. Hogyan futtassuk a flyTweent az egérrel az esemény fölé?
  2. Hogyan adjuk hozzá a "polaroid blitz" tween-t a legvégére?
  3. Nem tudom, hogyan kell eltávolítani az egeret a kezelőről a végén - mivel ez egy névtelen lezárás

Kérdésemet a a GreenSock fórum.

Köszönöm az esetleges tippeket

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" 
               applicationComplete="init()">

    <fx:Script>
        <![CDATA[
            import com.greensock.TweenMax;
            import com.greensock.easing.Bounce;
            import com.greensock.easing.Cubic;
            import spark.core.SpriteVisualElement;

            private function init():void {
                var g:Graphics = myComp.graphics;
                g.clear();
                g.beginFill(0xCCCCCC);
                g.drawRect(0, 0, myComp.width, myComp.height);
                g.endFill();                
            }           

            private function handleClick(event:MouseEvent):void {
                var star:SpriteVisualElement = new Star();
                star.x = event.localX;
                star.y = event.localY;
                myComp.addChild(star);

                TweenMax.to(star, 2, {
                    bezier: [
                        {x:star.x + 10, y:star.y - 20, scaleX: 1,   scaleY: 1}, 
                        {x:star.x + 20, y:star.y + 20, scaleX: 1.2, scaleY: .8}, 
                        {x:star.x + 20, y:star.y + 30, scaleX: 1,   scaleY: 1}], 
                    orientToBezier: false, 
                    ease: Bounce.easeOut
                });

                var flyTween:TweenMax = TweenMax.to(star, 1, {
                    delay: 10,
                    ease:  Cubic.easeOut,
                    bezier: [
                        {x: myComp.width - star.width, y: Math.max(event.localY, myComp.height/2)}, 
                        {x: myComp.width - star.width, y: 0}
                    ],
                    onComplete: function():void {
                        myComp.removeChild(star);
                        // XXX how to remove the mouse over handler here?
                    }
                });

                star.addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
                    // XXX how to force flyTween to execute right now, without the delay?
                    flyTween.complete();
                });
            }
        ]]>
    </fx:Script>    

    <mx:UIComponent id="myComp" width="100%" height="100%" click="handleClick(event)" />

</s:Application>

UPDATE2: Köszönöm LondonDrugs_MediaServices, ismét itt a frissített képernyőkép + kód.

Jó móka játszani a dooberekkel, de van még két kisebb probléma:

  1. Valóban meg kell ölnöm a (késleltetett) legyet? Nem tudom ehelyett valahogy módosítani a késleltetését (0-ra állítani), ha az egeret fölé viszem?
  2. Jó lenne a "fényképezőgép vaku" effektusa a végén. Csak nem emlékszem, hogyan csinálták - valami szabványos Flash MX effekt...

adja meg itt a kép leírását

MyApp.mxml:

<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" 
               xmlns:s="library://ns.adobe.com/flex/spark" 
               xmlns:mx="library://ns.adobe.com/flex/mx" 
               applicationComplete="init()">

    <fx:Script>
        <![CDATA[
            import com.greensock.TweenMax;
            import com.greensock.easing.Bounce;
            import com.greensock.easing.Cubic;
            import flash.filters.GlowFilter;
            import spark.core.SpriteVisualElement;

            private function init():void {
                var g:Graphics = myComp.graphics;
                g.clear();
                g.beginFill(0xCCCCCC);
                g.drawRect(0, 0, myComp.width, myComp.height);
                g.endFill();                
            }           

            private function goFlyTween(star:DisplayObject, delay:Number = 0):void {
                TweenMax.to(star, 1, {
                    delay: delay,
                    ease:  Cubic.easeOut,
                    bezier: [
                        {x: myComp.width - star.width, 
                         y: Math.max(star.y, myComp.height/2)}, 
                        {x: myComp.width - star.width, y: 0}
                    ],
                    onComplete: function():void {
                        if(star.parent)
                            star.parent.removeChild(star);
                    }
                });
            }

            private function handleClick(event:MouseEvent):void {
                var star:SpriteVisualElement = new Star();
                star.filters = [
                    new GlowFilter(0xffffff, 1, 4, 4, 10, 2), 
                    new GlowFilter(0x0, 1, 1.5, 1.5, 10, 2)
                ];
                star.x = event.localX;
                star.y = event.localY;
                myComp.addChild(star);

                TweenMax.to(star, 2, {
                    bezier: [
                        {x:star.x + 10, y:star.y - 20, scaleX: 1,   scaleY: 1}, 
                        {x:star.x + 20, y:star.y + 20, scaleX: 1.2, scaleY: .8}, 
                        {x:star.x + 20, y:star.y + 30, scaleX: 1,   scaleY: 1}], 
                    orientToBezier: false, 
                    ease: Bounce.easeOut,
                    onComplete: goFlyTween,
                    onCompleteParams: [star, 3]
                });

                star.addEventListener(MouseEvent.MOUSE_OVER, function(event:MouseEvent):void {
                    // instead of killing + recreating, can't we just reset the delay?
                    TweenMax.killTweensOf(star);
                    goFlyTween(star);
                }, false, 0, true);
            }
        ]]>
    </fx:Script>    

    <mx:UIComponent id="myComp" width="100%" height="100%" click="handleClick(event)" />

</s:Application>

  • Az első rész ugyanúgy elkészíthető, mint a második, használd a TweenMax bezier tween-t, de az easyOut-ot állítsd visszapattanásnak köbös helyett. A visszapattanást az igényeinek megfelelően is testreszabhatja 18.08.2012
  • Igen ám, de hogyan lehet egy példabeszédben repülni a doober-t, és megváltoztatni a méreteit (szorítás - azaz nagyobb szélesség, kisebb magasság) - mindezt egyszerre? 18.08.2012
  • Csinálhat egy külön tween-t a scaleX tulajdonsághoz, és használhatja a rugalmas lazítás funkciót. 18.08.2012
  • Létrehozhat egy egyéni függvényt is, amelyet a tween onUpdate paraméterével hív meg, és méretezi az x tengelyt a visszapattanó tween helyzete alapján. Valójában attól függ, hogyan szeretnél kinézni a végén 18.08.2012
  • Vagy még egyszerűbb, csak állítsa be a scaleX-et a visszapattanó pont(ok)on 18.08.2012
  • +1 az ajtósoknak, a fiókoknak és a kérdésnek. Szintén kíváncsi a polaroid blitzre. Kaphatunk még ilyet? 18.08.2012

Válaszok:


1

Ugyanúgy meg tudod csinálni, mint a második részt. Csak használja a Bounce easing funkciót, és adjon hozzá néhány scaleX módosítást a tweenhez: (Természetesen be kell állítania az x/y értékeket a forgatókönyvének megfelelően)

TweenMax.to(star, 3, {bezier:[{x:star.x + 20, y:star.y - 10, scaleX: 1}, {x:star.x + 40, y:star.y + 20, scaleX: 2}, {x:star.x + 40, y:star.y + 30, scaleX: 1}], orientToBezier:false, ease:Bounce.easeOut});

SZERKESZTÉS

További kérdések a szerkesztésben:

Azt javaslom, hogy készítsenek külön funkciót a flyTween-hez, nem szükséges, de véleményem szerint tisztábbá teszi az életet. Ha gyenge figyelő a mouseOver kezelőjén, akkor ez nem okoz problémát, lásd a frissítést az alábbi kódban. Nem tudom, mit értesz „Poloroid Blitz” alatt, ezért ezt tovább kell magyaráznod.

      private function goFlyTween(star:DisplayObject, delay:Number = 0):void {
           TweenMax.to(star, 1, {
               delay: delay,
               ease:  Cubic.easeOut,
               bezier: [
                   {x: myComp.width - star.width, y: Math.max(event.localY, myComp.height/2)}, 
                   {x: myComp.width - star.width, y: 0}
               ],
               onComplete: function():void {
                    if(star.parent){
                        star.parent.removeChild(star);
               }
           });
       }



       private function handleClick(event:MouseEvent):void {
            var star:SpriteVisualElement = new Star();
            star.x = event.localX;
            star.y = event.localY;
            myComp.addChild(star);

            TweenMax.to(star, 2, {
                bezier: [
                    {x:star.x + 10, y:star.y - 20, scaleX: 1,   scaleY: 1}, 
                    {x:star.x + 20, y:star.y + 20, scaleX: 1.2, scaleY: .8}, 
                    {x:star.x + 20, y:star.y + 30, scaleX: 1,   scaleY: 1}], 
                orientToBezier: false, 
                ease: Bounce.easeOut,
                onComplete: goFlyTween,
                onCompleteParams: [star, 3]
            });

            star.addEventListener(MouseEvent.MOUSE_OVER,function(event:MouseEvent):void {
                TweenMax.killTweensOf(star);
                goFlyTween(star);
            },false,0,true); //use a weak listener (last parameter true on addEventListener), then you don't have to worry about removing the listener.  OR just don't use an anonymous function for this...
        }

A visszapattanó tweenhez rögzítsen egy onComplete paramétert:

17.08.2012
  • Bár soha nem játszottam az említett meccseken, így nincs igazi hivatkozási pontom a célodhoz. 18.08.2012
  • Meg kell, mert nagyon függőséget okoznak, és megpróbálnak nagy összegeket kihúzni a zsebéből ;-) Van valami tanácsa a frissített kérdéseimre? 18.08.2012
  • Érthető a star.parent, köszönöm. A polaroid effektus alatt azt az effektust értem, amikor a doober (csillag, érme, ...) nagyon világos egy rövid ideig - mielőtt eltűnnek, mint egy fényképezőgép vaku effektusában. Kíváncsi vagyok, hogyan érhetem el (egyes színek között?) 18.08.2012
  • Nem lehet-e kikényszeríteni a késleltetett legyek azonnali végrehajtását - ahelyett, hogy az egészet megölnék és újrateremtnék? 19.08.2012
  • megölöd az előző tween-t (pattanás), ha az még folyamatban van, amikor eljött az idő, hogy a pontozósávhoz repülj. A poloroid effektus nagyon egyszerű a colorMatrixFilter beépítésével a max: colorMatrixFilter:{brightness:3} tweenbe, mivel az egyik értéke fehérre mosott megjelenést kölcsönöz. 19.08.2012
  • Csak hogy tisztázzuk, ettől függetlenül új tween-t hoz létre a memóriában. Ez a killTweensOf csak arról gondoskodik, hogy megállítsa a visszapattanást (ami teljesen más tween, mint az egyikre repülés). a késleltetés valójában kevésbé hatékony - mert ez egy időzítőt hoz létre a háttérben, amely kipipál, és sokkal korábban helyezi el a tween-t a memóriában. 19.08.2012
  • Nagyszerű köszönöm. Van egy tippem a GreenSock fórumban, hogy használjam a flyTween.restart()-t, ha a késleltetett tween-t azonnali végrehajtásra akarom kényszeríteni. 19.08.2012
  • Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..