淡化Java 2d / AWT中的效果

时间:2014-09-17 05:55:41

标签: java fadeout

我想要显示总共6.5秒的图像,并在最后1.5秒内淡出。我在线获得NPE:

g2d.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, transparency));

我读了一些,我认为这是因为gameLogo不是BufferedImage,只是一个简单的Image。我用paint.net制作它,所以它默认应该有一个alpha通道。我搜索了一些关于制作BufferedImage的论坛,但仍然感到困惑。

下面的代码片段在我添加额外的行以追逐最后1.5秒之前完美运行。

提前感谢您的帮助!

编辑:

添加强制转换(Graphics2D)NPE如果已修复但仍然不会完全淡出...

我应该使用吗?     offG.dispose(); 某处?

offG.setColor(Color.BLACK);
offG.fillRect(0, 0, 800, 480);
counter += deltaTime;
// start fade out after 4 seconds
if (counter < 4000)
    offG.drawImage(devLogo, 0, 0, this);
else {
    transparency = (float)(1 - (counter - 4000) / 50 * 0.02);
    if (transparency < 0)
    transparency = 0;
    ((Graphics2D) offG).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, transparency));
    offG.drawImage(devLogo, 0, 0, this);
}
// wait 6,5 seconds
if (counter > 6500) {
    gameState = 2;
    counter = 0;
    transparency = 1;
    ((Graphics2D) offG).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, transparency));
}

1 个答案:

答案 0 :(得分:0)

您应该为此提供更多代码。在您的情况下,g2dnull。根据您的评论,您在字段中持有Graphics个对象。 Graphics对象由AWT传递给绘图方法,您可能会将其分配给您的字段,但您忘记为g2d字段分配新值。 我认为没有必要在2个不同类型的字段中保留单个对象。如果我是你,我只会在Graphics2d类型对象上操作。这将结束你所做的代码中的混乱。您正在威胁与2个单独实体相同的Graphics对象,但您的字段引用同一个对象。为什么?没必要。

  ((Graphics2d)offG).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, transparency));

NPE走了吗?