Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

alphasil

Problema com disparo

Mensagens Recomendadas

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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.