Me dêm ideias para animar em java2d porfavor

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.

1 curtida

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.

1 curtida

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.

1 curtida

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.

1 curtida

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…