我想要显示总共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));
}
答案 0 :(得分:0)
您应该为此提供更多代码。在您的情况下,g2d
为null
。根据您的评论,您在字段中持有Graphics
个对象。 Graphics
对象由AWT传递给绘图方法,您可能会将其分配给您的字段,但您忘记为g2d
字段分配新值。
我认为没有必要在2个不同类型的字段中保留单个对象。如果我是你,我只会在Graphics2d
类型对象上操作。这将结束你所做的代码中的混乱。您正在威胁与2个单独实体相同的Graphics
对象,但您的字段引用同一个对象。为什么?没必要。
((Graphics2d)offG).setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, transparency));
和NPE
走了吗?