javascript - 如何打造类似魔兽世界的冷却效果?

标签 javascript css gwt

我目前正在尝试制作类似于 the ones you can see in World of Warcraft 的冷却效果. (看到上面有 2m 文字的正方形了吗?这个想法是以圆形方式让正方形“变亮”,也在 http://www.youtube.com/watch?v=R51QXmkyelQ 0:23 中说明。)我正在使用 GWT,所以我主要是在寻找一种使用纯 CSS 和/或 javascript 来完成此操作的方法。

为了实现这一点,我只需要能够创建一个类似于 1 中暗区的方形图像。 .然后我可以将此图像叠加到我的主图像上,并使用计时器来产生运动的错觉。

但是我不知道如何创建这样的图像。似乎可以create shapes using CSS only ,但我不明白是否可以以及如何创建我需要的东西。

我也是found something使用 Silverlight,但它不是我的选择。

我不确定我是否足够清楚地表达了我的需求。如果是这样的话,我很乐意补充说明。

提前感谢您的任何提示,
塞巴斯蒂安·特龙普

最佳答案

这是我想出来的。基本上它所做的是,它将一个图像和一个 0.5 不透明度的 Canvas 封装在一个复合小部件中。动画在给定的时间间隔内以圆形方式在 Canvas 上从中心向边缘绘制线条。 Canvas 有一个 clickHandler 来启动动画。希望能帮助到你。它使用 GWT Canvas,因此可能并非所有浏览器都支持此小部件。

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);
    }
}

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);
    }
}

最后 onModuleLoad 结束:

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

关于javascript - 如何打造类似魔兽世界的冷却效果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7043514/

相关文章:

javascript - jQuery:我需要 keyUp 和 Change 事件吗?

javascript - 将 Flash 视频输出捕获到 mp4 文件的脚本方式?

javascript - 如何在 php 中捕获 JSON 数据并将其发送到我的电子邮件

html - CSS 绝对位置

javascript - jQuery FadeIn 将内容推离位置

java - 我如何在 GWT 中序列化一个复杂的类?

GWT 和 MVP 模式中的 Mock View

java - 对话框阻止后台事件

javascript - 如何编辑 JavaScript 警告框标题?

javascript - 看起来像 Spotify 网站的单页应用程序