Comparar objeto sorteado

Estou fazendo um jogo semelhante ao Tetris…porém ao invés de peças caírem são lixos que devem cair no cesto.O meu problema está ao sortear um objeto(que é um JLabel) eu o armazeno em uma outra JLabel chamado objEscolhido.Como faço para saber a imagem que sorteei?
Como faço por exemplo para saber se o objeto é uma garrafa ou jornal??

 private final JLabel garrafa = new JLabel(new ImageIcon(getClass().getResource("garrafa.png")));
 private final JLabel jornal = new JLabel(new ImageIcon(getClass().getResource("jornal.png")));
 private final ArrayList<JLabel> lista=new ArrayList<JLabel>();
 private JLabel objEscolhido = new JLabel();
 objEscolhido = objAtual.sorteiaObj();

 public NovoObj(){
        garrafa.setBounds(posX, posY, 33, 113);
        jornal.setBounds(posX, posY, 106, 77);
    
        lista.add(garrafa);
        lista.add(jornal);
}

    public JLabel sorteiaObj(){
            Random r=new Random();
            int x=r.nextInt(2);
            return lista.get(x);
            
        }

Algum motivo para usar JLabel para representar garrafas e jornais?
Eu criaria uma estrutura de dados própria para representar os itens que caem no jogo.

Se você não quiser refatorar tudo, o mais simples é deixar de usar diretamente JLabel.
Estende JLabel criando classes distintas para Garrafa, Jornal e tudo mais que você tiver.

É que não sou tão avançado em Java.Se eu criasse uma classe especifica para cada objeto como poderia sorteá-los depois?? Ou como poderia criar uma estrutura de dados?? Poderia me dar exemplos por favor,agradeceria e me ajudaria demais!

Qual seria melhor solução pro meu caso??Este é o meu projeto
package NovoObj;

import java.awt.Component;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Random;
import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class NovoObj{

private final JLabel garrafa = new JLabel(new ImageIcon(getClass().getResource("garrafa.png")));
private final JLabel jornal = new JLabel(new ImageIcon(getClass().getResource("jornal.png")));
private final ArrayList<JLabel> lista=new ArrayList<JLabel>();
int posX=300;
int posY=0;

public NovoObj(){
    garrafa.setBounds(posX, posY, 33, 113);
    jornal.setBounds(posX, posY, 106, 77);
    
    lista.add(garrafa);
    lista.add(jornal);
}

public JLabel sorteiaObj(){
    Random r=new Random();
    int x=r.nextInt(2);
    return lista.get(x);
    
}

 public boolean Colisao(Component a, Component b) {
    int aX = a.getX();
    int aY = a.getY();
    int ladoDireitoA = aX + a.getWidth();
    int ladoEsquerdoA = aX;
    int ladoBaixoA = aY + a.getHeight();
    int ladoCimaA = aY;

    int bX = b.getX();
    int bY = b.getY();
    int ladoDireitoB = bX + b.getWidth();
    int ladoEsquerdoB = bX;
    int ladoBaixoB = bY + b.getHeight();
    int ladoCimaB = bY;

    boolean colidiu = false;

    boolean cDireita = false;
    boolean cCima = false;
    boolean cBaixo = false;
    boolean cEsquerda = false;

    if (ladoDireitoA >= ladoEsquerdoB) {
        cDireita = true;
    }
    if (ladoCimaA <= ladoBaixoB) {
        cCima = true;
    }
    if (ladoBaixoA >= ladoCimaB) {
        cBaixo = true;
    }
    if (ladoEsquerdoA <= ladoDireitoB) {
        cEsquerda = true;
    }
    if (cDireita && cEsquerda && cBaixo && cCima) {
        colidiu = true;
    }
    return colidiu;
}

}

package Apresentacao;

import NovoObj.NovoObj;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import static java.lang.Thread.sleep;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

//---------------------------------------------------Segunda classe
public class DesignTela extends JFrame {

private final ImageIcon fundo = new ImageIcon(getClass().getResource("fundoparque.png"));
private final JLabel cestoVid = new JLabel(new ImageIcon(getClass().getResource("cestovid.png")));
private final JLabel cestoPla = new JLabel(new ImageIcon(getClass().getResource("cestoplas.png")));
private final JLabel cestoMet = new JLabel(new ImageIcon(getClass().getResource("cestomet.png")));
private final JLabel cestoPap = new JLabel(new ImageIcon(getClass().getResource("cestopap.png")));
private final Panel painel = new Panel();
private final NovoObj objAtual = new NovoObj();
private final Cair desce = new Cair();
private JLabel objEscolhido = new JLabel();

private static int posX = 300;
private static int posY = 0;

//pontuação
private static int pontuacao = 0;
private final JLabel pontos = new JLabel("Pontos:" + pontuacao);

public DesignTela() {
    super("Jogo Ambiental");

    pontos.setForeground(Color.red);
    pontos.setFont(new Font("Arial", Font.BOLD, 20));

    //posicionamento dos elementos
    pontos.setBounds(0, -50, 150, 150);
    cestoVid.setBounds(490, 320, 115, 140);
    cestoPla.setBounds(360, 320, 113, 141);
    cestoMet.setBounds(230, 320, 117, 142);
    cestoPap.setBounds(100, 320, 112, 141);

    this.add(painel);
    painel.setLayout(null);
    painel.add(pontos);
    painel.add(cestoVid);
    painel.add(cestoPla);
    painel.add(cestoMet);
    painel.add(cestoPap);
    addObjTela();

    Toolkit tKit = getToolkit();
    Dimension dim = tKit.getScreenSize();
    this.setBounds(dim.width / 2 - 350, dim.height / 2 - 250, 700, 500);
    this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    this.setResizable(false);
    this.Movimento();
    desce.start();

}

public class Panel extends JPanel {

    public void paintComponent(Graphics g) { //define o background do painel
        super.paintComponent(g);
        Image img = fundo.getImage();
        g.drawImage(img, 0, 0, this);
    }
}


public void addObjTela() {
    objEscolhido = objAtual.sorteiaObj();
    painel.add(objEscolhido);
}


public class Cair extends Thread {

    public void run() {
        while (true) {
            try {
                sleep(25); //atualizar jlabel após 25ms
            } catch (Exception erro) {
                System.out.println("Erro!");
            }
            objEscolhido.setBounds(posX, objEscolhido.getY() + 2, objEscolhido.getWidth(), objEscolhido.getHeight());
            if (objAtual.Colisao(objEscolhido, cestoVid)) {
                pontuacao++;
                pontos.setText("Pontos:" + pontuacao);
                posX = 300;
                posY = 0;
                painel.remove(objEscolhido);
                addObjTela();
                objEscolhido.setBounds(posX, posY, objEscolhido.getWidth(), objEscolhido.getHeight());
            }
        }
    }
}

public void Movimento() {
    this.addKeyListener(new KeyListener() {
        @Override
        public void keyTyped(KeyEvent e) {
        }

        @Override
        public void keyPressed(KeyEvent e) {

            if (e.getKeyCode() == 37) { //esquerda
                posX -= 10;
            }
            if (e.getKeyCode() == 39) { //direita
                posX += 10;
            }
            objEscolhido.setBounds(objEscolhido.getX(), objEscolhido.getY(), objEscolhido.getWidth(), objEscolhido.getHeight());
        }

        @Override
        public void keyReleased(KeyEvent e) {
        }
    });
}

public static void main(String[] args) {
    DesignTela janela = new DesignTela();
    janela.setVisible(true);
}

}

Há infinitas formas de implementar, um exemplo seria mais ou menos assim:

Classe para os objetos da tela:

import java.awt.Rectangle;
import java.util.Random;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

@SuppressWarnings("serial")
public class Objeto extends JLabel {

    public static final Objeto CESTO_VIDRO = new Objeto("cestovid.png", 490, 320, 115, 140);
    public static final Objeto CESTO_PLASTICO = new Objeto("cestoplas.png", 360, 320, 113, 141);
    public static final Objeto CESTO_METAL = new Objeto("cestomet.png", 230, 320, 117, 142);
    public static final Objeto CESTO_PAPEL = new Objeto("cestopap.png", 100, 320, 112, 141);

    public static final Objeto GARRAFA = new Objeto("garrafa.png", 300, 0, 33, 113);
    public static final Objeto JORNAL = new Objeto("jornal.png", 300, 0, 106, 77);

    public static Objeto sortear() {
        Objeto[] todos = { GARRAFA, JORNAL };
        int limite = todos.length;
        int sorteado = new Random().nextInt(limite);
        return todos[sorteado];
    }

    private Objeto(String imagem, int x, int y, int largura, int altura) {
        super(new ImageIcon(Objeto.class.getResource(imagem)));
        setBounds(x, y, largura, altura);
    }

    public boolean colidiuCom(Objeto outro) {
        Rectangle este = this.getBounds();
        Rectangle aquele = outro.getBounds();
        return este.intersects(aquele);
    }

}

A tela em si:

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

import modelo.Objeto;

@SuppressWarnings("serial")
public class DesignTela extends JFrame {

    private class AreaDesenho extends JPanel {

        private final Image fundo = new ImageIcon(getClass().getResource("fundoparque.png")).getImage();

        public void paintComponent(Graphics g) { // define o background do painel
            super.paintComponent(g);
            g.drawImage(fundo, 0, 0, this);
        }
    }

    private class Gravidade extends Thread {

        public void run() {
            while (true) {
                try {
                    Thread.sleep(25); // atualizar jlabel após 25ms
                } catch (Exception e) {
                    e.printStackTrace();
                }
                Point p = objEscolhido.getLocation();
                p.x += 2;
                objEscolhido.setLocation(p);

                trataColisoes();
            }
        }
    }

    // pontuação
    private static int pontuacao = 0;

    public static void main(String[] args) {
        try {
            DesignTela janela = new DesignTela();
            janela.setVisible(true);
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }

    private final JLabel pontos;
    private AreaDesenho painel;
    private Objeto objEscolhido;

    public DesignTela() {
        super("Jogo Ambiental");

        pontos = new JLabel("Pontos:" + pontuacao);
        pontos.setForeground(Color.red);
        pontos.setFont(new Font("Arial", Font.BOLD, 20));
        pontos.setBounds(0, -50, 150, 150);

        painel = new AreaDesenho();
        painel.setLayout(null);
        painel.add(pontos);
        painel.add(Objeto.CESTO_VIDRO);
        painel.add(Objeto.CESTO_PLASTICO);
        painel.add(Objeto.CESTO_METAL);
        painel.add(Objeto.CESTO_PAPEL);
        this.add(painel);

        Toolkit tKit = getToolkit();
        Dimension dim = tKit.getScreenSize();
        this.setBounds(dim.width / 2 - 350, dim.height / 2 - 250, 700, 500);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setResizable(false);

        registraListeners();

        adicionaObjeto();

        new Gravidade().start();
    }

    public void registraListeners() {
        this.addKeyListener(new KeyAdapter() {

            @Override
            public void keyPressed(KeyEvent e) {
                Point p = objEscolhido.getLocation();
                switch (e.getKeyCode()) {
                    case KeyEvent.VK_LEFT:
                        p.x -= 10;
                        break;
                    case KeyEvent.VK_RIGHT:
                        p.x += 10;
                        break;
                }
                objEscolhido.setLocation(p);
            }
        });
    }

    private void adicionaObjeto() {
        objEscolhido = Objeto.sortear();
        painel.add(objEscolhido);
    }

    private void removeObjeto() {
        painel.remove(objEscolhido);
    }

    private void trataColisoes() {
        if (objEscolhido.colidiuCom(Objeto.CESTO_VIDRO) && objEscolhido.equals(Objeto.GARRAFA)) {
            pontuacao++;
            pontos.setText("Pontos:" + pontuacao);
            removeObjeto();
            adicionaObjeto();
        }
    }
}

Muito obrigado cara! Funcionou perfeitamente… Só faltou isso pra rodar certinho

 private void adicionaObjeto() {
        objEscolhido = Objeto.sortear();
        objEscolhido.setLocation(300, 0);
        painel.add(objEscolhido);
    }

É muito legal sempre poder aprender com quem sabe.Você simplificou aquilo que eu tava tornando um bicho de 7 cabeças kkk abraços!

1 curtida

Legal, se sempre tem que setar o x e o y após o sorteio, então até pode tirar o x e o y do construtor da classe Objeto.

Cara desculpa te incomodar novamente kkk mas vc sabe como posso deixar o objeto que cai dentro do JFrame apenas?? Eu quero dizer,impedir que o objeto saia da tela quando o jogador apertar muitas vezes as teclas direcionais,para que haja um limite.

Após calcular o ponto de movimento, você compara o ponto com os limites da área do painel que contém o objeto.

Exemplo:

public void registraListeners() {
    this.addKeyListener(new KeyAdapter() {

        @Override
        public void keyPressed(KeyEvent e) {
            Point p = objEscolhido.getLocation();
            switch (e.getKeyCode()) {
                case KeyEvent.VK_LEFT:
                    p.x -= 10;
                    break;
                case KeyEvent.VK_RIGHT:
                    p.x += 10;
                    break;
            }
            p = validaPosicao(p); // ajusta a posição para ficar nos limites
            objEscolhido.setLocation(p);
        }
    });
}

private Point validaPosicao(Point p) {
    Rectangle areaPainel = painel.getBounds();
    Rectangle areaObjeto = objEscolhido.getBounds();
    if (p.x < areaPainel.x) { // limite à esquerda
        p.x = areaPainel.x;
    } else if (p.x + areaObjeto.width > areaPainel.width) { // limite à direita
        p.x = areaPainel.width - areaObjeto.width;
    }
    return p;
}
1 curtida

painel.repaint()
É isso mesmo kkk consegui

Eu prometo que agora é a ultima pergunta pra finalizar o jogo kkk quero acrescentar níveis no jogo.Por exemplo,a cada 30 segundos o jogo parar,mostrar um OptionPane com a pontuação e aumentar o nível(até 3) e a Gravidade ficar mais “rápida”.Tenho que usar Timer e TimerTask certo? Se elas também são de certa forma Threads como implemento elas dentro da outra thread?

E como você implementaria se não fosse dentro de uma Thread? :wink:

Não vejo necessidade de usar TimerTask, pois você tem um loop que é executado o tempo todo, basta você contabilizar o tempo na execução desse loop.

Veja:

private class Gravidade extends Thread {

    private int velocidade = 2;

    public void run() {
        long tempo = System.currentTimeMillis();
        while (true) {
            try {
                Thread.sleep(25); // atualizar jlabel após 25ms
        } catch (Exception e) {
            e.printStackTrace();
        }
        if (System.currentTimeMillis() - tempo > 30000) {
            tempo = System.currentTimeMillis();
            velocidade += 2; // a cada 30 s aumenta a velocidade em 2
        }
        Point p = objEscolhido.getLocation();
        p.x += velocidade;
        objEscolhido.setLocation(p);

        trataColisoes();
    }
}
1 curtida