2014-09-17 3 views
0

Я хотел бы отобразить изображение для 6.5s в целом и исчезнуть в последние 1,5 секунды. Я получаю NPE в строке:Эффект затухания в Java 2d/AWT

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

Я прочитал некоторые, и я думаю, что это потому, что gameLogo не BufferedImage, только простое изображение. Я сделал это с paint.net, поэтому он должен иметь альфа-канал по умолчанию. Я искал некоторые форумы о создании BufferedImage, но все еще смущен.

Фрагмент кода ниже работал отлично, прежде чем я добавил дополнительные строки, чтобы пробить последние 1,5 секунды.

Благодарим за помощь!

EDIT:

с добавлением бросание (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

Откуда берется 'g2d'? – MadProgrammer

+0

'g2d', вероятно, null. Должно быть, это не 'offG' ?? – Antoniossss

+0

@MadProgrammer частная графика offG; private Graphics2D g2d = (Graphics2D) offG; – Kokufuu

ответ

0

Вы должны предоставить больше кода для этого. В вашем случае g2d является null. Согласно вашему комментарию вы держите Graphics объектов в полях. Graphics объект передается методу чертежа AWT, и вы, вероятно, назначаете его в свое поле, но вы забыли назначить новое значение для поля g2d. Я думаю, что нет необходимости хранить один объект в двух разных типизированных полях. Если бы я был вами, я бы работал только на объекте типа Graphics2d. Это положило бы конец путанице в коде, который вы сделали. Вы создаете тот же объект Graphics, что и два отдельных объекта, но ваши поля относятся к одному и тому же объекту. Зачем? Нет необходимости в этом.

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

и NPE ушло право?

+0

Большое спасибо, теперь я понимаю. – Kokufuu