Olá, estou tendo o seguinte erro na linha 56 do Scenario.java, não consegui achar o erro!
Obrigado desde já
Java.lang.NullPointerException
23 Respostas
Por que não posta as classes aqui entre as tags ? Tem gente que não vai poder baixar isso, por estar no trabalho.
Desculpe, eu tinha achado extensas pra postar, mas vamos lá
Scenario.java
package principal;
import GameLib.Gfx;
import GameLib.Sentido;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class Scenario extends JPanel implements Runnable {
private ImageIcon fundo = null;
private Thread gameThread;
private int x = 0;
private int speed = 4;
private Image sprImg;
private Gfx gfx;
private boolean isRunning = true;
public Scenario(){
}
public boolean isIsRunning() {
return isRunning;
}
public void setIsRunning(boolean isRunning) {
this.isRunning = isRunning;
}
public void Init(){
gfx = new Gfx(this, getFundo().getImage());
gfx.setSentido(Sentido.DIREITA);
sprImg = Toolkit.getDefaultToolkit().createImage(getClass().getResource("/resources/picture.gif"));
}
public void start(){
if (gameThread == null){
gameThread = new Thread(this);
gameThread.start();
}
}
public void stop(){
if (gameThread != null){
gameThread.interrupt();
gameThread = null;
}
}
public void paint(Graphics g){
gfx.cls();
gfx.drawImage(sprImg, x, 45);
gfx.refresh();
}
public void update(Graphics g){
paint(g);
}
public ImageIcon getFundo() {
return fundo;
}
public void setFundo(String caminho) {
this.fundo = new ImageIcon(getClass().getResource(caminho));
}
public void checkSentido(){
switch(gfx.getSentido()){
case DIREITA:
x += speed;
case ESQUERDA:
x -= speed;
}
if (x > getWidth()){
gfx.setSentido(Sentido.ESQUERDA);
checkSentido();
} else if (x < 0){
gfx.setSentido(Sentido.DIREITA);
checkSentido();
}
}
@Override
public void run() {
while(isRunning){
checkSentido();
repaint();
try{
gameThread.sleep(40);
} catch (InterruptedException e){}
}
}
}
Gfx.Java
package GameLib;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
/**
*
* @author Rafael
*/
public class Gfx {
private Component comp;
private Image offImage, offBGImage;
private Graphics offG;
private Sentido sentido = Sentido.PARADO;
public void setSentido(Sentido sentido) {
this.sentido = sentido;
}
public Sentido getSentido() {
return sentido;
}
public Gfx(Component component, Color color) {
comp = component;
offImage = comp.createImage(comp.getWidth(), comp.getHeight());
offBGImage = comp.createImage(comp.getWidth(), comp.getHeight());
Graphics bgG = offBGImage.getGraphics();
bgG.setColor(color);
bgG.fillRect(0, 0, comp.getWidth(), comp.getHeight());
offG = offImage.getGraphics();
}
public Gfx(Component component, Image backImg) {
comp = component;
offImage = comp.createImage(comp.getWidth(), comp.getHeight());
offBGImage = backImg;
offG = offImage.getGraphics();
}
public void drawImage(Image img, int x, int y) {
offG.drawImage(img, x, y, comp);
}
public void cls() {
offG.drawImage(offBGImage, 0, 0, comp);
}
public void refresh() {
comp.getGraphics().drawImage(offImage, 0, 0, comp);
}
public void setBGImage(Image backImg) {
offBGImage = backImg;
}
public Image getBGImage() {
return (offBGImage);
}
public void cls(Color color) {
offG.setColor(color);
offG.fillRect(0, 0, comp.getWidth(), comp.getHeight());
}
public Image getOffImage() {
return (offImage);
}
}
gfx não está instanciado( e se você está recebendo um Graphcs por parametro, deveria usa-lo, né?).
bom, sua variável gfx está com valor null quando você tenta utilizá-la.
Esse seu método é estranho, pois você envia um argumento que nunca é utilizado.
O graphics do paint é só pra sobrescrever o método, eu achei que o new Gfx() no método Init istanciaria minha variavel.
Ele instancia, mas você invoca ele antes de invocar o outro ?
O método Init não deveria ser chamado antes do paint?
Não sei, aonde você viu que deveria?
eu imaginei que fosse o método que inicia os componentes, então foi engano meu, vou tentar arrumar aqui, vlw pela ajuda cara
Abraços
Chamar o método Init() no construtor da classe não seria uma boa ideia né?
tentei fazer isso só pra ver se funcionaria e deu problema no new Gfx()
É, como ainda está no construtor acho que não dá certo enviar o this
O que seria mais indicado de fazer para contornar meu problema?
Não sei, você poderia ocultar o construtor e criar um método estático para retornar a instância, mas como não sei qual é o seu caso não sei se é a melhor solução.
o problema é que eu rodo tudo num loop pra executar as ações em tempo real, se eu chamar um método que crie a instancia de um outro método como o paint() isso pode fazer com que ele fique recriando a instancia dentro do laço ai vai ficar esquisito! vou pensar numa solução, assim que achar posto aqui
Não precisa, você pode controlar as instâncias no método estático, pode criar um Singleton caso seja o que a situação pede.
tem como me dar um exemplo?
public class Singleton{
private Singleton me;
private Singleton(){} // Construtor privado sem argumentos
public static Singleton getInstance(){
if(me == null){
me = new Singleton();
}
return me;
}
}
mas no meu caso que eu preciso passar os parametros pro construtor do Gfx pra poder criar meu fundo certinho, isso não funcionaria, certo?
Claro que sim, o getInstance é um método como outro qualquer, você pode passar argumentos pra ele, e depois passar os mesmos para o construtor, caso queira.
Cara, desculpe o transtorno, mas sou novato nessa parte e não estou conseguindo aplicar o que me falou no meu código, o getInstance, tem que ser para minha classe Scenario ou para Gfx?
No caso eu creio que para o Scenario, para que você possa invocar o construtor e em seguida o método init, mas essa solução parece gambiarra hehehe
Creio que minha cabeça não esteja funcionando hoje, hehe
vou postar o código de novo, pra ver qual besteira estou fazendo, mas acho que não compreendi bem como usar o getInstance();
Scenario.java
package principal;
import GameLib.Gfx;
import GameLib.Sentido;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class Scenario extends JPanel implements Runnable {
private ImageIcon fundo = null;
private Thread gameThread;
private int x = 0;
private int speed = 4;
private Image sprImg;
private Gfx gfx;
private boolean isRunning = true;
public Scenario(){
Init();
}
public void Init(){
gfx = Gfx.getInstance(this, Color.BLACK);
gfx.setSentido(Sentido.DIREITA);
sprImg = Toolkit.getDefaultToolkit().createImage(getClass().getResource("/resources/picture.gif"));
}
public boolean isIsRunning() {
return isRunning;
}
public void setIsRunning(boolean isRunning) {
this.isRunning = isRunning;
}
public void start() {
if (gameThread == null) {
gameThread = new Thread(this);
gameThread.start();
}
}
public void stop() {
if (gameThread != null) {
gameThread.interrupt();
gameThread = null;
}
}
public void paint(Graphics g) {
gfx.cls();
gfx.drawImage(sprImg, x, 45);
gfx.refresh();
}
public void update(Graphics g) {
paint(g);
}
public ImageIcon getFundo() {
return fundo;
}
public void setFundo(String caminho) {
this.fundo = new ImageIcon(getClass().getResource(caminho));
}
public void checkSentido() {
switch (gfx.getSentido()) {
case DIREITA:
x += speed;
case ESQUERDA:
x -= speed;
}
if (x > getWidth()) {
gfx.setSentido(Sentido.ESQUERDA);
checkSentido();
} else if (x < 0) {
gfx.setSentido(Sentido.DIREITA);
checkSentido();
}
}
@Override
public void run() {
while (isRunning) {
checkSentido();
repaint();
try {
gameThread.sleep(40);
} catch (InterruptedException e) {
}
}
}
}
Gfx.java
package GameLib;
import java.awt.Color;
import java.awt.Component;
import java.awt.Graphics;
import java.awt.Image;
/**
*
* @author Rafael
*/
public class Gfx {
private Component comp;
private Image offImage, offBGImage;
private Graphics offG;
private Sentido sentido = Sentido.PARADO;
private static Gfx me;
private Gfx(){}
public static Gfx getInstance(Component comp, Color color){
if (me == null){
me = new Gfx(comp, color);
}
return me;
}
public void setSentido(Sentido sentido) {
this.sentido = sentido;
}
public Sentido getSentido() {
return sentido;
}
public Gfx(Component component, Color color) {
comp = component;
offImage = comp.createImage(comp.getWidth(), comp.getHeight());
offBGImage = comp.createImage(comp.getWidth(), comp.getHeight());
Graphics bgG = offBGImage.getGraphics();
bgG.setColor(color);
bgG.fillRect(0, 0, comp.getWidth(), comp.getHeight());
offG = offImage.getGraphics();
}
public Gfx(Component component, Image backImg) {
comp = component;
offImage = comp.createImage(comp.getWidth(), comp.getHeight());
offBGImage = backImg;
offG = offImage.getGraphics();
}
public void drawImage(Image img, int x, int y) {
offG.drawImage(img, x, y, comp);
}
public void cls() {
offG.drawImage(offBGImage, 0, 0, comp);
}
public void refresh() {
comp.getGraphics().drawImage(offImage, 0, 0, comp);
}
public void setBGImage(Image backImg) {
offBGImage = backImg;
}
public Image getBGImage() {
return (offBGImage);
}
public void cls(Color color) {
offG.setColor(color);
offG.fillRect(0, 0, comp.getWidth(), comp.getHeight());
}
public Image getOffImage() {
return (offImage);
}
}
Exatamente