1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Duvidas sobre thread e animacoes

Bom dia.

Estou tentando fazer uma animação simples usando canvas e thread. Estou tendo uma dúvida em relação a um NullPOinterException que ocorre no momento em que esecuto o método run de uma classe que implementa a interface runnable.

Para deixar mais claro vou colocar trechos de codio das minhas classes

// classe Principal // responsavel por criar a janela e receber uma Canvas

    public SimpleBounce() {
        super.setTitle("Estudo sobre animacao.");
        addWindowListener(new MyWindowAdapter());
        setSize(400,400);
        Thread t = new Thread(new Animation());
        t.start();
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                // Eh uma boa pratica deixar quem cria ser responsavel pela visibilidade do Frame
                SimpleBounce s = new SimpleBounce();
                s.add("Center", new Animation());
                s.setVisible(true);
            }
        });
    }

Na classe que estende o Canvas tenho o metodo paint e um metodo run porque ela implementa runnable, fiz dessa forma pois acho que é responsabilidade da classe que "sabe desenhar" criar a animacao

    public void run() {    
        while(true) {
            this.ball.centerX += ball.speedX;
            ball.centerY += ball.speedY;
            // verificar se a bola está fora da tela
            if( (ball.centerX - ball.radius) < 0) {
                ball.speedX = ball.speedX * (-1);
                ball.centerX = ball.radius;
            } else if ( (ball.centerX + ball.radius) > (d.width - 1)) {
                ball.speedX = ball.speedX * (-1);
                ball.centerX = d.width - ball.radius; 
            }

            if((ball.centerY - ball.radius) < 0){
                ball.speedY = ball.speedY * (-1);
                ball.centerY = ball.radius;
            } else if( (ball.centerY +  ball.radius) > (d.height - 1)) {
                ball.speedY = ball.speedY * (-1);
                ball.centerY = d.height - ball.radius; 
            }

            repaint();

            try {
                Thread.sleep(1000 / ball.UPDATE_RATE);
            } catch(InterruptedException e){}
        }
    }

Tenho o metodo paint, mas nao vou colocar aqui pois nao acho necessario; Minha duvida é, qual executa primeiro, run ou paint ? Pergunto isso pois no metodo paint, chamo um metodo init(), que inicializa minha forma geometrica com suas dimensoes, eu desenho da forma que preciso, depois acreidto que a thread inicia, adiciona valores ou retira conforme a minha logica da forma geometrica e chama o metodo repaint. O problema é que depois da chamada do metodo paint, depois que eu instancio uma forma geometrica, quando chega no metodo run, a instancia ball está nula. Isso pra mim nao faz sentido, acredito eu porque nao entendo bem o funcionamento de thread, mas se eu criar um construtor na classe responsavel por desenhar, chamar o metodo init, ball possui valor dentro do metodo run.

Obrigado pela atenção

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

0 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags java threads orientação-a-objetos ou faça a sua própria pergunta.