Como pausar?

7 respostas
Viera

Estou desenvolvendo um jogo da memoria para um trabalho da faculdade e estou com um problema e n consigo resolver

estou usando labels e o evento mouseClicked
o problema é o seguinte, quando clico na segunda carta(segundo label), faço ela ser mostrada no label(desvirda) e comprada com a primeira carta clicada
como na execução isso acontece muito rapido o usuario não tem tempo de ver a exibição da carta no segundo label
quero usar um método para travar(pausar) a execução por alguns segungos(2/3seg no max) antes q as cartas sejam comparadas para q o usuario possa ver a exibição

ja tentei varias formas e pesquisei muito, thread.sleep, ateh mesmo tentei realizar uma parada na gambiarra com um método

//método pausa, faz uma pause de n segundos
    public void pausa(int n){   
        long t0, t1;

        t0 = System.currentTimeMillis();

        do{
            t1 = System.currentTimeMillis();
        }while ((t1 - t0) < (n * 1000)) ;
     }

mas o problema eh que quando chamo o método para pausar, seja ele esse ou ateh mesmo o thread.sleep ou outro
no momento do click o método de pausa eh chamado primerio doq os métodos de exibição e comparação das cartas
ou seja, quando clico na segunda carta, o sistema trava por 3 segundos(por exemplo) e depois faz as comparações e exibição

não sei como resolver isso, se eh problema em chamar o evento mouseClicked ou usar um label
n faço a minima idéai de como solucionar e ja tentei varias formas
se alguem souber alguma coisa ou tiver alguma idéia manda ai

esse é o código do evento mouseClicked dos meus labels se for preciso

//verifica se a carta ja não esta sendo exibida
        if(cartas[0].getEstado()==false){           
        //verifica se o label está habilitado
        if(lbCarta1.isEnabled()!=false){
            //verifica se é o primeiro click
            if(click<1){
                //incrementa o numero de clicks para 1(um)
                click=1;

                //mostra a carta clickada
                lbCarta1.setIcon(new ImageIcon(cartas[0].changeEstado()));

                //salva a carta do primeiro click
                carta1 = new Carta(cartas[0].getId(), cartas[0].getImgCarta());
            }
            //verifica se é o segundo click
            else if(click==1){

                //incrementa o numero de jogadas
                jogadas++;

                //preenche o campo das jogadas
                textJogadas.setText(jogadas.toString());

                //mostra a carta clickada
                lbCarta1.setIcon(new ImageIcon(cartas[0].changeEstado()));

                //salva a carta do segundo click
                carta2 = new Carta(cartas[0].getId(), cartas[0].getImgCarta());

                //-----
                //AQUI DEVERIA SER FEITA UMA PAUSA
                //-----

                //verifica se as cartas formam um par
                if(engine.verificaJogada(carta1, carta2)==true){//se sim

                    //busca as cartas no array das cartas as salva dizendo que foram descobertas
                    for(int i=0;i<cartas.length;i++){
                        if(carta1.getId()==cartas[i].getId())
                            cartas[i].setDescoberta(true);

                        if(carta2.getId()==cartas[i].getId())
                            cartas[i].setDescoberta(true);
                    }

                    //incrementa o score
                    score=score+30;

                    //preenche o campo dos pontos
                    textPontos.setText(score.toString());
                }

                //retorna o numero de clicks para 0(zero)
                click=0;

                //verifica o fim do jogo
                if(engine.getFim(cartas)==true){
                    //avisa fim do jogo
                    Object[] opcoes1 = {"Sim", "Não"};
                    int op = JOptionPane.showOptionDialog(null, "Fim do jogo!\n Continuar jogando?\n", "Fim de Jogo",
                                                          JOptionPane.YES_NO_OPTION,
                                                          JOptionPane.QUESTION_MESSAGE, null, opcoes1, opcoes1[0]);

                    if(op==0){
                        cartas=engine.startJogo(dif, categ);

                        //faz o score final - score=score-(jogadas*2)
                        score=score-(jogadas*2);
                        //preenche o campo de pontos
                        textPontos.setText(score.toString());

                        //zera as jogadas
                        jogadas=0;
                        //preenche o campo das jogadas
                        textJogadas.setText(jogadas.toString());
                    }
                    else{
                        dispose();
                    }
                }

                //vira as cartas novamente
                inicializaCartas();
            }
        }
        }

7 Respostas

drsmachado

Dispara uma thread e só executa após um determinado tempo.

rmendes08

Simplifique! Adicione mais um clique. Por exemplo: 1o clique - vira a 1a carta, 2o clique - vira a segunda carta, 3o - clique se iguais retira, senão vira novamente!

rmendes08

De qualquer maneira, você pode acionar o componente javax.swing.Timer para contar o tempo. Ao virar a segunda carta você liga o timer, e no evento do timer você coloca o tratamento das cartas e o desligamento do timer.

Viera

@drsmachado
não sei implementar threads em java mas ja pegei uma pronta que faz isso que voce comentou
ela dava um start e fazia uma contagem de 3 segundos e apos isso voltava a execução do jogo normalmente

mas aconteceu o mesmo problema que descrevi no topic-post

@rmendes

não posso implementar um 3º clique, vai contra as regras do jogo, senão posso virar a segunda carta e ficar olhando para ela o tempo que quiser para decora-la

a questão do Timer ja implementei e não funcionou, aconteceu o mesmo problema q descrevi no topic-post

problema eh que quando chamo o método para pausar, seja ele esse ou ateh mesmo o thread.sleep ou outro
no momento do click o método de pausa eh chamado primerio doq os métodos de exibição e comparação das cartas
ou seja, quando clico na segunda carta, o sistema trava por 3 segundos(por exemplo) e depois faz as comparações e exibição

rmendes08

Cara, to viajando … já tentou usar Thread.sleep() ?

Viera

também não funcionou, como ja falei no topic-post

Viera

consegui

fiz a thread começar apartir do momento do segundo click

//verifica se a carta ja não esta sendo exibida
        if(cartas[0].getEstado()==false){           
        //verifica se o label está habilitado
        if(lbCarta1.isEnabled()!=false){
            //verifica se é o primeiro click
            if(click<1){
                //incrementa o numero de clicks para 1(um)
                click=1;

                //mostra a carta clickada
                lbCarta1.setIcon(new ImageIcon(cartas[0].changeEstado()));

                //salva a carta do primeiro click
                carta1 = new Carta(cartas[0].getId(), cartas[0].getImgCarta());
            }
            //verifica se é o segundo click
            else if(click==1){

                //começa uma thread que irá pausar a execução para
                new Thread(new Runnable(){
                public void run(){

                //incrementa o numero de jogadas
                jogadas++;

                //preenche o campo das jogadas
                textJogadas.setText(jogadas.toString());

                //mostra a carta clickada
                lbCarta1.setIcon(new ImageIcon(cartas[0].changeEstado()));

                //salva a carta do segundo click
                carta2 = new Carta(cartas[0].getId(), cartas[0].getImgCarta());

                //pausa a execução para as cartas serem exibidas
                try{
                    Thread.sleep(1500);
                }catch (InterruptedException ex){
                    Logger.getLogger(TelaJogoFacil.class.getName()).log(Level.SEVERE, null, ex);
                }

                //verifica se as cartas formam um par
                if(engine.verificaJogada(carta1, carta2)==true){//se sim

                    //busca as cartas no array das cartas as salva dizendo que foram descobertas
                    for(int i=0;i<cartas.length;i++){
                        if(carta1.getId()==cartas[i].getId())
                            cartas[i].setDescoberta(true);

                        if(carta2.getId()==cartas[i].getId())
                            cartas[i].setDescoberta(true);
                    }

                    //incrementa o score
                    score=score+30;

                    //preenche o campo dos pontos
                    textPontos.setText(score.toString());
                }

                //retorna o numero de clicks para 0(zero)
                click=0;

                //verifica o fim do jogo
                if(engine.getFim(cartas)==true){
                    //faz o score final - score=score-(jogadas*2)
                    score=score-(jogadas*2);
                    //preenche o campo de pontos
                    textPontos.setText(score.toString());

                    //avisa o fim do jogo
                    Object[] opcoes1 = {"Sim", "Não"};
                    int op = JOptionPane.showOptionDialog(null, "Fim do jogo!\n Continuar jogando?\n", "Fim de Jogo",
                                                          JOptionPane.YES_NO_OPTION,
                                                          JOptionPane.QUESTION_MESSAGE, null, opcoes1, opcoes1[0]);

                    if(op==0){//se sim
                        cartas=engine.startJogo(dif, categ);

                        //zera as jogadas
                        jogadas=0;
                        //preenche o campo das jogadas
                        textJogadas.setText(jogadas.toString());
                    }
                    else{//se não
                        //pergunta se deseja salvar o score
                        Object[] opcoes2 = {"Sim", "Não"};
                        op = JOptionPane.showOptionDialog(null, "Deseja salvar o score?", "Salvar Score",
                                                        JOptionPane.YES_NO_OPTION,
                                                        JOptionPane.QUESTION_MESSAGE, null, opcoes2, opcoes2[0]);
                        //se sim
                        if(op==0)
                        {
                            String nome = JOptionPane.showInputDialog("Digite seu nome:");//pega o nome do jogador

                            if(nome==null || nome.equals(""))
                                dispose();
                            else
                            {
                                rank=new Rank();
                                jogador=new Jogador(score,nome);//cria o jogador
                                rank.addJogador(jogador);//e adiciona o jogador no rank
                            }
                        }
                        dispose();
                    }
                }

                //vira as cartas novamente
                inicializaCartas();
            }//fim do run
            }).start();//fim da thread
            }//fim do segundo click
        }
        }
Criado 8 de junho de 2011
Ultima resposta 10 de jun. de 2011
Respostas 7
Participantes 3