2 Stimmen

Wie kann man einen WoW-ähnlichen Abkling-Effekt erzeugen?

Ich versuche derzeit, einen Abkling-Effekt ähnlich wie bei die man in World of Warcraft sehen kann . (Sehen Sie das Quadrat mit dem 2m-Text darauf? Die Idee ist, das Quadrat kreisförmig zu "erhellen", wie es auch in http://www.youtube.com/watch?v=R51QXmkyelQ bei 0:23.). Ich benutze GWT, so dass ich hauptsächlich auf der Suche nach einem Mittel, dies mit reinen CSS und/oder Javascript zu tun.

Um dies zu erreichen, muss ich nur ein quadratisches Bild erstellen können, das dem dunklen Bereich in 1 . Ich könnte dieses Bild dann als Overlay auf mein Hauptbild anwenden und einen Timer verwenden, um die Illusion einer Bewegung zu erzeugen.

Ich weiß jedoch nicht, wie ich ein solches Bild erstellen soll. Es scheint möglich zu sein Formen nur mit CSS erstellen aber ich konnte nicht verstehen, ob und wie es möglich war, das zu schaffen, was ich brauchte.

Ich habe auch etwas gefunden die Silverlight verwendet, aber das ist keine Option für mich.

Ich bin mir nicht sicher, ob ich mein Bedürfnis deutlich genug zum Ausdruck gebracht habe. Wenn das der Fall sein sollte, bin ich gerne bereit, weitere Erklärungen abzugeben.

Vielen Dank im Voraus für jeden Hinweis,
Sébastien Tromp

6voto

pistolPanties Punkte 1880

Das habe ich mir ausgedacht. Im Grunde, was es tut, ist, es kapselt ein Bild und eine 0,5 Deckkraft Leinwand über einander in einem zusammengesetzten Widget. Die Animation zeichnet Linien auf der Leinwand von der Mitte zu den Rändern in einer kreisförmigen Weise in einem bestimmten Zeitintervall. Canvas hat einen clickHandler, um die Animation zu starten. Hoffentlich hilft das. Es verwendet GWT Canvas, so dass dieses Widget möglicherweise nicht von allen Browsern unterstützt wird.

Klasse CoolDownAnimation :

    public class CoolDownAnimation extends Animation {

    Canvas canvas;
    Context2d context;
    int centerX;
    int centerY;
    static final CssColor BLACK = CssColor.make("rgba(0,0,0,0.6)");
    static final CssColor WHITE = CssColor.make("rgba(255,255,255,0.6)");

    public CoolDownAnimation(Canvas canvas) {
        this.canvas = canvas;
        canvas.setCoordinateSpaceHeight(20);
        canvas.setCoordinateSpaceWidth(20);
        canvas.getElement().getStyle().setOpacity(0.5);
        this.context = canvas.getContext2d();
        centerX = canvas.getCoordinateSpaceWidth() / 2;
        centerY = canvas.getCoordinateSpaceHeight() / 2;
    }
    @Override
    protected void onStart() {
        context.beginPath();
        context.setStrokeStyle(BLACK);
        context.fillRect(0, 0, centerX * 2, centerY * 2);
        context.setStrokeStyle(WHITE);
        super.onStart();
    }
    @Override
    protected void onUpdate(double progress) {
        context.moveTo(centerX, centerY);
        context.lineTo(
                centerX + 2 * centerX * Math.cos((progress * Math.PI * 2)-Math.PI/2),
                centerY + 2 * centerY * Math.sin((progress * Math.PI * 2)-Math.PI/2));
        context.stroke();
    }   
    @Override
    protected void onComplete() {
        super.onComplete();
        context.closePath();
        context.clearRect(0, 0, centerX*2, centerY*2);
    }
}

Klasse CoolDownWidget :

    public class CoolDownWidget extends Composite {

    private CoolDownAnimation coolDown;
    private AbsolutePanel wrapper;
    private Image image;
    private Canvas canvas;
    private int sizeX = 50;
    private int sizeY = 50;
    private int coolDownDuration = 5000;

    public CoolDownWidget(){
        canvas = Canvas.createIfSupported();
        if (canvas==null){
            Window.alert("Fail! You dont have canvas support");
        }
        canvas.getElement().getStyle().setOpacity(0.5);
        canvas.setPixelSize(sizeX,sizeY);
        coolDown = new CoolDownAnimation(canvas);
        image = new Image("images/icon.png");
        image.setPixelSize(sizeX, sizeY);
        canvas.addClickHandler(new ClickHandler() {
            @Override
            public void onClick(ClickEvent event) {
                coolDown.cancel();
                coolDown.run(coolDownDuration);
            }
        });
        wrapper = new AbsolutePanel();
        wrapper.setPixelSize(sizeX, sizeY);
        wrapper.add(image, 0, 0);
        wrapper.add(canvas,0,0);
        initWidget(wrapper);
    }
}

schließlich onModuleLoad, um die Sache abzuschließen:

    public void onModuleLoad() {
    RootPanel.get().add(new CoolDownWidget());
}

1voto

bert Punkte 1506

Dies ist eine javascript/css-Version, die jquery verwendet.

Finden Sie die Live-Version http://codepen.io/anon/pen/aZzNbY .

    <html>
      <head>
          <script src="https://code.jquery.com/jquery-2.2.4.min.js"></script>
          <style type="text/css">
            .box{
                width:128px;
                height:128px;
                background-color:black;
                overflow:hidden;
                padding:5px;
                border:4px solid #ddd;
                border-radius:12px;
                position:relative;
            }

            input[type="submit"] {
                width: 100%;
                height: 100%;
                border: 0;
                background: url('http://icons.iconseeker.com/png/fullsize/smoothicons-12/warcraft-1.png') no-repeat ;
            }

            .cooldown{
                position:absolute;
                top:5%;
                left:5%;
                width:90%;
                height:90%;
                overflow:hidden;
                opacity:0;
            }   

            .cooldown-half{
                width:50%;
                height:100%;
                overflow:hidden;
                position:relative;
                float:left;
            }

            .cooldown-half-rotator{
                width:200%;
                height:200%;
                top:-50%;
                position:absolute;
                background-color:rgba(1,1,1,0.5);
            }

            .cooldown-half-rotator-right{
                transform-origin:left center;
            }

            .cooldown-half-rotator-left{
                right:0;
                transform-origin:right center;
            }

          </style>
      </head>
      <body>
          <div class='box'>
              <input   type="submit" value="" ><div></div></input>
              <div class='cooldown'>

                  <div class='cooldown-half'>
                      <div class='cooldown-half-rotator cooldown-half-rotator-left'>
                      </div>                         
                  </div>            
                  <div class='cooldown-half'>
                      <div class='cooldown-half-rotator cooldown-half-rotator-right'>           
                      </div>                              
                  </div>            

              </div>
          </div>
          Click me

          <script>
              function setCooldown( time, stopper ){
                    $(".cooldown").css({"opacity":1});
                        $(".cooldown-half-rotator-right").css({
                            "transform":"rotate(180deg)",
                            "transition":"transform "+(time/2000)+"s",
                            "transition-timing-function":"linear"
                        });
                        setTimeout( function(){
                            $(".cooldown-half-rotator-left").css({
                                "transform":"rotate(180deg)",
                                "transition":"transform "+(time/2000)+"s",
                                "transition-timing-function":"linear"
                            });
                            setTimeout( function(){
                                $(".cooldown-half-rotator-right").css({"transform":"rotate(0deg)","transition":"transform 0s"});
                                $(".cooldown-half-rotator-left").css({"transform":"rotate(0deg)","transition":"transform 0s"});
                                $(".cooldown").css({"opacity":0});
                            }, time/2 );
                        }, time/2 );
              }
              window.onload = function(){
                  $(".box").click(function(){                        
                      setCooldown( 3000 );
                  });
              }
          </script>
      </body>
    </html>

0voto

joon Punkte 810

Könnten Sie verwenden Jquery Drehen

Blick auf Beispiel 3

Alternativ dazu: können Sie das Quadrat in kleine Tortenstücke unterteilen (etwas schwer zu erkennen, aber etwa so pizza ). Machen Sie ein transparentes Bild für jeden, und nur zeigen/verstecken sie in der Reihenfolge einer nach dem anderen mit jquery. Dies ist wahrscheinlich die einfachste und schnellste Lösung.

0voto

Sébastien Tromp Punkte 575

Eine weitere Variante der von pistolPanties vorgeschlagenen Lösung für die Methode onUpdate():

this.context.clearRect(0, 0, this.width, this.height);

// Black background
this.context.setFillStyle(BLACK);
this.context.fillRect(0, 0, this.width, this.height);

// White to show the progress
this.context.setFillStyle(WHITE);
this.context.beginPath();
this.context.moveTo(this.centerX, this.centerY);
this.context.arc(this.centerX, this.centerY, this.width, -Math.PI / 2, 2 * Math.PI * progress - Math.PI / 2, false);
this.context.lineTo(this.centerX, this.centerY);
this.context.fill();
this.context.closePath();

Der Vorteil ist, dass der gesamte Bereich, der als Weiß wiedergegeben werden soll, abgegrenzt und ausgefüllt wird. Dadurch wird sichergestellt, dass der Bereich immer richtig eingefärbt ist - und damit widerstandsfähiger gegen die Verlangsamung des Browsers.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X