alphasil Posted December 22, 2012 at 12:45 PM Report #488095 Posted December 22, 2012 at 12:45 PM Olá ppl; Mais uma vez ficou pendurado numa situação que não estou a ver o porquê, já li e reli o código e não vejo o que está mal, o par de olhos extras não fariam mal 🙂 Tenho esta classe. import java.awt.Graphics; import java.awt.Image; import java.awt.Rectangle; import java.awt.Toolkit; import java.util.ArrayList; //Cria a classe Balas que vamos precisar para o jogo public class Balas extends Objetos //Extensão da classe Objetos que tem as variaveis { //Variavel que vai definir movimento da bala. private int MovBala; //Variavel para o jogador private jogador jogad; public Balas(final jogador jogad, final int posX, final int posY, final int altura, final int largura, final String jog) { //Set define o jogad como utilizador de balas this.jogad =jogad; this.jog= getImage(jog); this.posX= posX; this.posY= posY; this.altura=altura; this.largura=largura; //Colisão this.rect= new Rectangle(posX, posY, altura, largura); } //Construtos para balas no arrayList public Balas(ArrayList<alvos> bugs, int i, int j, int k, String string) { // TODO Auto-generated constructor stub } //Metodo para desenhar, vai ser instanciado na classe Main public void desenho(Graphics g) { g.drawImage(jog, posX, posY, altura, largura, null); } @Override //Quando houver colisão void atualizar(final main principal, final int id) { if(rect.intersects(jogad.rect)) { main.bala.remove(this); } else if(posX <10 || posX >570) { main.bala.remove(this); } } @Override Image getImage(String jog) { return Toolkit.getDefaultToolkit().getImage(jog); } //Retorno public int getMovBala() { return MovBala; } //Definição public void setMovBala(int movBala) { MovBala = movBala; } public jogador getJogad() { return jogad; } public void setJogad(jogador jogad) { this.jogad = jogad; } } Quando executado dá-me erro nesta linha if(rect.intersects(jogad.rect)) e erro na classe principal que é esta import java.awt.Color; import java.awt.Event; import java.awt.Graphics; import java.awt.Image; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.util.ArrayList; import java.util.Iterator; import java.util.concurrent.CopyOnWriteArrayList; import javax.swing.JFrame; /** * @author * */ public class main extends JFrame implements KeyListener{ private static final long serialVersionUID = 1L; private jogador jg; //Array que vai armazenar 12 alvos private ArrayList<alvos> bugs = new ArrayList<alvos>(); private Image img; private Graphics graphics; //Variaveis Boolean que vão movimentar o canhão (static por causa do métoso atualizar) public static boolean movEsquerda = false; public static boolean movDireita = false; //Arraylist para as balas static CopyOnWriteArrayList<Balas> bala = new CopyOnWriteArrayList<>(); public main() { setTitle("Trabalho Final GMC"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(600,400); setBackground(Color.WHITE); setResizable(true); //Adiciona "escuta de keys do teclado" addKeyListener(this); //Poe a janela como visivel setVisible(true); //Instancia o canhao jg= new jogador(300, 350 , 20, 20,"imagens/cannon.gif"); //Instancia os alvos bugs.add(new alvos(50, 50 , 70, 70,"imagens/bug.gif")); bugs.add(new alvos(145, 50 , 70, 70,"imagens/bug1.gif")); bugs.add(new alvos(225, 50 , 70, 70,"imagens/bug.gif")); bugs.add(new alvos(305, 50 , 70, 70,"imagens/bug1.gif")); bugs.add(new alvos(385, 50 , 70, 70,"imagens/bug.gif")); bugs.add(new alvos(480, 50 , 70, 70,"imagens/bug.gif")); bugs.add(new alvos(60, 100 , 50, 50,"imagens/bug1.gif")); bugs.add(new alvos(155, 100 , 50, 50,"imagens/bug.gif")); bugs.add(new alvos(235, 100 , 50, 50,"imagens/bug1.gif")); bugs.add(new alvos(315, 100 , 50, 50,"imagens/bug.gif")); bugs.add(new alvos(395, 100 , 50, 50,"imagens/bug1.gif")); bugs.add(new alvos(490, 100 , 50, 50,"imagens/bug.gif")); } public void paint(Graphics g) { img = createImage(getWidth(), getHeight()); graphics =img.getGraphics(); g.fillRect(0, 0, getWidth(), getHeight()); paintComponent(graphics); g.drawImage(img, 0, 0, null); repaint(); } public void paintComponent(Graphics g) { jg.desenho(g); //Iteraçao sobre o Arraylist dos bugs e depois chama o metodo do desenho for(alvos bg: bugs) { bg.desenho(g); } //Iteraçao sobre o Arraylist das balas e depois chama o metodo do desenho for(Balas bal: bala) { bal.desenho(g); //Metodo atualizar pede (main principal e um int) bal.atualizar(this, 0); } //Metodo para metodo de movimento canhão jg.atualizar(this, 1); } public void ActionPerformed(ActionEvent e) { repaint(); } @Override public void keyPressed(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_LEFT) { movEsquerda=true; } else if(e.getKeyCode() == KeyEvent.VK_RIGHT) { movDireita=true; } else if(e.getKeyCode()==KeyEvent.VK_SPACE) { Balas balaJogada= new Balas(bugs, jg.getPosX() + 20, 4, 4, "imagens\bullet_red.gif"); bala.add(balaJogada); } } @Override public void keyReleased(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_LEFT) { movEsquerda=false; } else if(e.getKeyCode() == KeyEvent.VK_RIGHT) { movDireita=false; } } public static int getPosX() { return getPosX(); } @Override public void keyTyped(KeyEvent e) { // TODO Auto-generated method stub } public static void main(String args[]) { new main(); } } Quando executado dá-me erro nesta linha e seguindo a classe de cima, dá também este erro bal.atualizar(this, 0); Como na classe Balas tenho um método: void atualizar(final main principal, final int id) { if(rect.intersects(jogad.rect)) { main.bala.remove(this); } else if(posX <10 || posX >570) { main.bala.remove(this); } } Tem uma variavel final main principal e um final int, na classe principal(main) tenho de usar estes dois argumentos, certo? Mas aí já me dá erro Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException at Balas.atualizar(Balas.java:43) at main.paintComponent(main.java:91 que são as linhas que identifiquei como dando erro, já sei que é um NullPoint mas já não estou a ver cumps gmc11
HappyHippyHippo Posted December 22, 2012 at 08:14 PM Report #488118 Posted December 22, 2012 at 08:14 PM Quando executado dá-me erro nesta linha if(rect.intersects(jogad.rect)) ou rect ou jogad ou jogad.rect teem o valor de nulo IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alphasil Posted December 23, 2012 at 01:43 PM Author Report #488164 Posted December 23, 2012 at 01:43 PM Oi HHH, mais uma vez a chatear-te 🙂 Enganei-me no código, eu quero que ao colidir eles desapareçam. a minha classe alvos não está nula pois está instanciada no main. como faço para chamar o array onde estão os alvos nessa linha? Bom natal para ti e para os teus cumps gmc11
HappyHippyHippo Posted December 23, 2012 at 02:08 PM Report #488166 Posted December 23, 2012 at 02:08 PM eu, como não tenho o código e não posso passar isso por um debugger, vou mandar um tiro: - assumindo que realmente tens tudo instânciado, e tudo parece porreiro. o problema está na remoção de um elemento de uma lista que se encontra a ser iterada. por outras palavras, é normal haver erros em código que existe manipulação dos elementos de uma lista que se encontra a ser iterada seja por iteradores ou (pelos vistos) por um foreach uma solução para resolver isto é ter uma segunda lista de indices(ou outro identificador que torne o acesos possível ao elemento da lista) de elementos a serem removidos e ter um segundo ciclo de remoção após o ciclo de actualização IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alphasil Posted December 23, 2012 at 05:26 PM Author Report #488184 Posted December 23, 2012 at 05:26 PM Bem agora partiste-me todo 😛 Antes de passar para isso tenho de reseolver este Null O Null que me aparece é devido a só ter as variáveis iniciadas, e não estou a conseguir resolver este problema. gmc11
HappyHippyHippo Posted December 23, 2012 at 05:52 PM Report #488186 Posted December 23, 2012 at 05:52 PM envia-me o código que eu dou uma vista de olhos IRC : sim, é algo que ainda existe >> #p@p Portugol Plus
alphasil Posted December 23, 2012 at 06:04 PM Author Report #488187 Posted December 23, 2012 at 06:04 PM Para onde envio? Para o teu email? gmc11
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now