Tenho exame prático de java2d na próxima semana, me dêm ideias para animar em java2d porfavor…
Animar o quê exatamente? Um personagem em um spritesheet?
Em Java 2D, você pode carregar uma imagem em um bufferedimage e desenhar apenas parte dessa imagem na tela.
Abraço.
Bom, eu não sei exatamente o que o professor está preparando para nós, mas eu quero aprender de tudo um pouco para correr tudo bem.
Pode ser de spritesheet?? você pode ensinar porfavor??
Não é um assunto muito rápido, então é complicado ensinar por aqui. O ideal é você tentar fazer alguma coisa e voltar com dúvidas mais pontuais. Dê uma pesquisada em algo como Java2d spritesheet animation, deve trazer algo similar ao que você precisa. A ideia geral é:
- carregar uma imagem ou conjunto de imagens;
- usar um tipo de timer para alternar entre partes dessa imagem (fazendo cropping) ou entre as diferentes imagens carregadas;
- exibir as imagens na aplicação (ex: em um JPanel)
Abraço.
Pretendo criar um programa de paint em java
e a minha maior dificuldade é permitir que o usuario desenhe qualquer forma(figura 2d)??
Desenhar rectangulos, etc com a classe point e move-los na tela
preciso de ajuda
Isso não requer animações, então você não precisa do que descrevi acima. Mas mesmo um programa estilo “paint” pode ser razoavelmente complexo. É preciso investir em aprender a criar aplicações (ex: Swing).
Um programa Swing para desenhar formas geométricas e permitir movê-las seria algo como:
- um JFrame para conter a aplicação (botões e área de desenho);
- uma barra de botões no topo (ex: seleção, criar círculo, retângulo, selecionar cor, etc);
- um JPanel customizado, sobrescrevendo o método paintComponent;
- classes para cada forma geométrica suportada, com parâmetros como posição, tamanho, cor da borda e de preenchimento);
- ao clicar no JPanel customizado, você realiza a ação de acordo com a ferramenta selecionada;
- para arrastar algo, basta selecioná-lo e usar o evento mouseDragged do Swing, para mudar a posição do elemento selecionado.
Dê uma olhada na documentação do Swing e do Java2D.
Abraço.
Já estruturei o programa, criei as classes para cada figura, jpanel para pintar mas n consegui ainda mover as figuras
Talvés esteja fazendo tudo errado
public class Desenho extends JPanel implements Runnable,MouseListener,MouseMotionListener{
ArrayList<Chape> shapes = new ArrayList<Chape>();
Chape aux;
Dimension Dimensao = Toolkit.getDefaultToolkit().getScreenSize();
// Criando local onde ficará armazenadas as imagens.
private BufferedImage Buffered_da_Imagem = new BufferedImage((int)Dimensao.getWidth(),
(int)Dimensao.getHeight(), BufferedImage.TYPE_INT_RGB);
private BufferedImage Buffered_da_Reta = new BufferedImage((int)Dimensao.getWidth(),
(int)Dimensao.getHeight(), BufferedImage.TYPE_INT_RGB);
private int valor;
private Color Ultima_Cor;
private int x;
private int y;
Thread t=new Thread(this);
JLabel status=new JLabel("Mouse fora do painel");
Mouse hand;
int cont=0;
private int idChape=1;
private List<Chape> listachape;
public Desenho(){
Graphics g_Imagem = Buffered_da_Imagem.createGraphics();
g_Imagem.setColor(Color.WHITE);
g_Imagem.fillRect(0, 0, Buffered_da_Imagem.getWidth(), Buffered_da_Imagem.getHeight());
g_Imagem.dispose();
Graphics g_Reta = Buffered_da_Reta.createGraphics();
g_Reta.setColor(Color.WHITE);
g_Reta.fillRect(0, 0, Buffered_da_Reta.getWidth(), Buffered_da_Reta.getHeight());
g_Reta.dispose();
if (Ultima_Cor == null)
Ultima_Cor = Color.RED;
this.addMouseListener(this);
this.addMouseMotionListener(this);
add(status);
setBackground(Color.LIGHT_GRAY);
setFocusable(true);
setSize(50,50);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.WHITE);
g2.fillRect(0, 0, Buffered_da_Imagem.getWidth(), Buffered_da_Imagem.getHeight());
g2.drawImage(Buffered_da_Reta, 0, 0, null);
g2.dispose();
}
public void setForma(int newValor, Color newCor){
valor = newValor;
Ultima_Cor = newCor;
}
public void paint_retangulo(int x2, int y2){
Graphics2D g_retangulo = Buffered_da_Reta.createGraphics();
g_retangulo.drawImage(Buffered_da_Imagem, 0, 0, null);
g_retangulo.setColor(Ultima_Cor);
g_retangulo.setStroke(new BasicStroke(2.0f));
Rectangulo rect;
if (x2>x && y2>y){
rect = new Rectangulo(x,y,x2-x,y2-y);
g_retangulo.drawRect(rect.getPosx(),rect.getPosy(),rect.getLargura(),rect.getAltura());
aux=rect;
// g_retangulo.drawRect(x,y,x2-x,y2-y);
}
if (x2>x && y>y2)
{
System.out.println("PINTOU RECTANGULO 2");
rect = new Rectangulo(x,y2,x2-x,y-y2);
g_retangulo.drawRect(rect.getPosx(),rect.getPosy(),rect.getLargura(),rect.getAltura());
aux=rect;
//g_retangulo.drawRect(x,y2,x2-x,y-y2);
}
if (x>x2 && y>y2)
{
System.out.println("PINTOU RECTANGULO 3");
rect = new Rectangulo(x2,y2,x-x2,y-y2);
g_retangulo.drawRect(rect.getPosx(),rect.getPosy(),rect.getLargura(),rect.getAltura());
aux=rect;
// g_retangulo.drawRect(x2,y2,x-x2,y-y2);
}
if (x>x2 && y2>y)
{
System.out.println("PINTOU RECTANGULO 4");
rect = new Rectangulo(x2,y,x-x2,y2-y);
g_retangulo.drawRect(rect.getPosx(),rect.getPosy(),rect.getLargura(),rect.getAltura());
// g_retangulo.draw((Shape)rect);
aux=rect;
}
//shapes.add(rect);
//g_retangulo.dispose();
}
public void paint_Circulo(int x2, int y2){
Graphics2D g_Circulo = Buffered_da_Reta.createGraphics();
g_Circulo.drawImage(Buffered_da_Imagem, 0, 0, null);
g_Circulo.setColor(Ultima_Cor);
g_Circulo.setStroke(new BasicStroke(2.0f));
Elipse eli;
if (x2>x && y2>y){
eli=new Elipse(x,y,x2-x,y2-y);
g_Circulo.drawOval(eli.getPosx(),eli.getPosy(),eli.getLargura(),eli.getAltura());
aux=eli;
}
if (x2>x && y>y2){
eli=new Elipse(x,y2,x2-x,y-y2);
g_Circulo.drawOval(eli.getPosx(),eli.getPosy(),eli.getLargura(),eli.getAltura());
aux=eli;
}
if (x>x2 && y>y2){
eli=new Elipse(x2,y2,x-x2,y-y2);
g_Circulo.drawOval(eli.getPosx(),eli.getPosy(),eli.getLargura(),eli.getAltura());
aux=eli;
}
if (x>x2 && y2>y){
eli=new Elipse(x2,y,x-x2,y2-y);
g_Circulo.drawOval(eli.getPosx(),eli.getPosy(),eli.getLargura(),eli.getAltura());
aux=eli;
}
//g_Circulo.dispose();
}
public void paint_Reta(int x2, int y2){
Graphics2D g_Reta = Buffered_da_Reta.createGraphics();
g_Reta.drawImage(Buffered_da_Imagem, 0, 0, null);
// Definindo a Cor da linha
g_Reta.setColor(Ultima_Cor);
// Definindo a espessura da linha
g_Reta.setStroke(new BasicStroke(2.0f));
// Desenhando a linha
Linha linha = new Linha(x, y, x2, y2);
g_Reta.drawLine(x, y, x2, y2);
aux=linha;
// Atualizando a tela
// g_Reta.dispose();
}
public void teste(){
if(shapes.size()>0){
if(shapes.get(0) instanceof Rectangulo){
Graphics2D g_retangulo = Buffered_da_Reta.createGraphics();
g_retangulo.drawImage(Buffered_da_Imagem, 0, 0, null);
g_retangulo.setColor(Ultima_Cor);
g_retangulo.drawRect(shapes.get(0).getPosx(), shapes.get(0).getPosy(), shapes.get(0).getLargura(), shapes.get(0).getAltura());
//g_retangulo.dispose();
}
}
}
public void dormir(){
try {
t.sleep(100);
} catch (InterruptedException ex) {
Logger.getLogger(Desenho.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public void run() {
while(true){
if(!shapes.isEmpty()){
shapes.get(0).setPosx(shapes.get(0).getPosx()+10);
System.out.println("RUN X:"+shapes.get(0).getPosx()+" Y : "+shapes.get(0).getPosy());
teste();
}
// System.out.println("Valores posx “+hand.getPosx()+” posy “+hand.getPosy()
// +” alt “+hand.getAltura()+” larg "+hand.getLargura());
}
}
@Override
public void mouseClicked(MouseEvent me) {
x = me.getX();
y = me.getY();
Forma(me.getX(), me.getY());
//repaint(); // Atualiza a imagem do Jpanel
}
@Override
public void mousePressed(MouseEvent me) {
// Obtendo as coordenadas do mouse
x = me.getX();
y = me.getY();
// Chamando o método Forma
Forma(me.getX(), me.getY());
repaint();
}
@Override
public void mouseReleased(MouseEvent me) {
Forma(me.getX(), me.getY());
Graphics g_Imagem = Buffered_da_Imagem.createGraphics();
g_Imagem.drawImage(Buffered_da_Reta, 0, 0, null);
g_Imagem.dispose();
repaint();
shapes.add(aux);
System.out.println("Rect X:"+shapes.get(0).getPosx()+" Y : "+shapes.get(0).getPosy());
t.start();
}
@Override
public void mouseEntered(MouseEvent me) {}
@Override
public void mouseExited(MouseEvent me) {}
@Override
public void mouseDragged(MouseEvent me) {
Forma(me.getX(), me.getY());
repaint();
}
@Override
public void mouseMoved(MouseEvent me) {}
public void Forma(int x, int y){
if (valor==0)
paint_retangulo(x, y);
if (valor==1)
paint_Circulo(x, y);
if (valor==2)
paint_Reta(x, y);
}
public boolean contem(int x1,int y1,int al,int la,int px, int py){
int x2=la+x1;
int y2=al+y1;
if(x1<=px && px<=x2)
if(y1<=py && py<=y2)
{
return true;
}
else
return false;
return false;
}
}
Está é a classe responsavel pelo desenho, e estou usando BuffedImage, praticamente copiei um codigo para desenhar e estou alterando ele
Não tenho como rodar seu código no momento.
Explica melhor o seu objetivo exatamente. Quando você fala animação, está implicando que as figuras vão se mover sozinhas, conforme o tempo passa (ex: de um lado pra outro da tela).
Seguir o mouse quando ele se movimenta não é se mover sozinha. Você não precisa de nada especial para a figura acompanhar o mouse. Não precisa de threads nem nada. Basta passar as coordenadas do mouse para a figura quando mover o mouse e, quando ela for desenhada, será desenhada nas coordenadas passadas (x e y). Pelo que vi do seu código, está próximo disso já. Você só precisa deixar de lado essa ideia de que você precisa animar o movimento da figura para ela seguir o mouse.
Abraço.
Sim, muito obrigada, já consegui mover as figuras com o mouse…
Agora quero criar animações que dependem de eventos, como clicar num botão e o retangulo rotacionar ou se mover durante um certo tempo…