Jump to content
Sign in to follow this  
alphasil

Problema com disparo

Recommended Posts

alphasil

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
alphasil

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

Share this post


Link to post
Share on other sites
HappyHippyHippo

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

Share this post


Link to post
Share on other sites
alphasil

Bem agora partiste-me todo :P

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.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.