É na minha primeira tentativa não usei Threads.
Bom galera andei pesquisando e acabei por modificar um exemplo que achei na internet que ficou bem proximo do que eu pretendia, porém ainda faltam algumas melhorias.
Gostaria de pedir a ajuda dos amigos aqui também para resolver estes problemas.
Vale lembrar que eu sou bem burrinho e só consegui gerar esse codigo porque me baseie em um exemplo, portanto por favor tenham paciencia comigo.
No codigo há nos comentarios varias duvidas que se for possivel vocês olharem e responderem eu agradeceria.
Como diria Jack o Estripador, vamos por partes! Bom o primeiro problema que estou encontrando no momento é como deixar o rastro de onde o barquinho passou? Eu consegui fazer isso com base de uma gambiarra, deixando de lado o desenho de background e correndo o risco de numa minimização e maximização da janela o rastro seja perdido, sei que o que eu fiz esta incorreto e estou em busca da resposta correta. Obrigado pela atenção amigos!
[code]package TCC;
import javax.swing.*;
public class Frame{
public Frame(){
JFrame frame = new JFrame();
frame.add(new Junta());//Populando o interior da frame
frame.setTitle(“Programa Rastreador de barquinho”); // Titulo da Frame
frame.setSize(800,600);// Tamanho da Frame
frame.setVisible(true);// Torna visivel
frame.setLocationRelativeTo(null);// O Local onde a janela sera atribuida
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public static void main (String args[])
{
new Frame();//Chamo o Frame
}
}[/code]
[code]package TCC;
import java.awt.event.KeyEvent;
import java.awt.;
import java.awt.event.;
import javax.swing.*;
public class Junta extends JPanel implements ActionListener {
Barquinho p; // Cria a variavel p do tipo Barquinho
public Image img; // Cria a variavel img do tipo Image
Timer time;// Cria a variavel time do tipo Timer
public Junta()
{
p = new Barquinho();// Atribui os valores da varivel p do tipo Barquinho.
addKeyListener(new AL()); // Adiciona um ouvinte do tipo teclado
setFocusable(true); // Permite que o componente conversse com teclado ou mouse caso esteja em primeira instancia
ImageIcon i = new ImageIcon(“C:/mar.png”); // Atribui o valor que esta contido no diretorio na variavel i do tipo ImageIcon.
img = i.getImage();// Atribuiu o valor de i a variavel img do tipo Image
time = new Timer(5, this); // Gera um timer de atualização a cada 5 milissegundos
time.start();// Começa a contagem
}
public void actionPerformed(ActionEvent e) { // Como o evento já é disparado se nem ao menos houve entrada no teclado?
p.move();//Chama o metodo move da variavel p
repaint();// Chamam novamente o metodo paint
}
public void paint(Graphics g) {// O que seria esse Graphics g? Só o uso porque todo mundo usa.
{
super.paint(g);// Chama o metodo paint da classe pai
Graphics2D g2d = (Graphics2D) g; // Não sei ao certo o fundamento disso, só uso porque é o que todo mundo usa.
g2d.drawImage(img, 0, 0, null);// Desenha a imagem img nas coordenadas 0 e 0. (Qual a utilidade do campo com null?)
g2d.drawImage(p.getImage(), p.getX(), p.getY(), null);// Desenha p.getImage(barco) nas coordenadas vindas de p.getX (X) e p.getY (Y).
g.drawString(“Coordenadas: (”+p.getX()+","+p.getY()+")", 645, 550);// Desanha a string que mostra as coordenadas.
}
}
private class AL extends KeyAdapter {
public void keyReleased(KeyEvent e) { // Caso a tecla seja liberada ocorrera o corpo do metodo, passando como parametro o Key event.
p.keyReleased(e);// chama o metodo da classe da variavel p
}
public void keyPressed(KeyEvent e) { // Caso a tecla seja apertada ocorrera o corpo do metodo, passando como parametro o Key event.
p.keyPressed(e);// chama o metodo da classe da variavel p
}
}
}
[/code]
Agora a gambiarra! Deixando de fora o chamado do metodo da classe pai e não desenhando o background. :
Gostaria de solucionar este problema. ;[
public void paint(Graphics g) {
{
//super.paint(g); // CANCELADO
Graphics2D g2d = (Graphics2D) g;
//g2d.drawImage(img, 0, 0, null); // CANCELADO
g2d.drawImage(p.getImage(), p.getX(), p.getY(), null);
}
package TCC;
import java.awt.*;
import java.awt.event.KeyEvent;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class Barquinho extends JPanel{// Por que tenho que criar a herança vinda de JPanel? Pela variavel do ImageIcon?
int x, dx, y, dw;// Criada variaveis int. (OBS: Não sei porque se eu uso dy ele não funciona corretamente!)
Image barco;// Crio a variavel barco do tipo Image
public Barquinho()
{
ImageIcon i = new ImageIcon("C:/ship.png");// Atribui o valor contido no caminho em um tipo de variavel ImageIcon criada.
barco = i.getImage();// Atribuo o valor a barco referente a i;
x=0;// atribui valor 0 a x.
y=0;// atribui valor 0 a y.
}
public void move()
{
x=x+dx;//Adiciona a x o valor de dx.
y=y+dw;//Adiciona a y o valor de dy.
System.out.println("("+x+","+y+")"); // Gera no console uma mensagem contendo as coordenadas.
}
public int getX() // Cria um metodo getX para que possa ser lido o valor de x.
{
return x;// Retorna o valor de x.
}
public int getY() // Cria o metodo getY para que possa ser lido o valor de y.
{
return y;// Retorna o valor de y.
}
public Image getImage() // Cria um metodo para que possa ser passado uma image.
{
return barco;// Retorna barco que tem em seu conteudo a imagem usada.
}
public void keyPressed(KeyEvent e) // Quando o evento de tecla pressionada é chamado pela classe junta com o parametro do tipo Key Event
{
int key = e.getKeyCode(); // Pega o codigo do evento e armazena na variavel do tipo int key
if (key == KeyEvent.VK_DOWN) // If Comparando o codigo de Key com o codigo da seta para baixo
dw = 1; //Dw é atribuido o valor 1.
if (key == KeyEvent.VK_UP) // idem
dw = -1;
if (key == KeyEvent.VK_LEFT)
dx = -1;
if (key == KeyEvent.VK_RIGHT)
dx = 1;
}
public void keyReleased(KeyEvent e) {// Quando o evento de tecla solta é chamado pela classe junta com o parametro do tipo Key Event
int key = e.getKeyCode(); // Pega o codigo do evento e armazena na variavel do tipo int key
if (key == KeyEvent.VK_LEFT)// If Comparando o codigo de Key com o codigo da seta para esquerda
dx = 0; //Dx é atribuido o valor 1.
if (key == KeyEvent.VK_RIGHT) // idem
dx = 0;
if (key == KeyEvent.VK_UP)
dw = 0;
if (key == KeyEvent.VK_DOWN);
dw = 0;
}
}
Obrigado pela atenção galera!
PS: Dei um update contendo as coordenadas na tela!