Paint Imagens

9 respostas
F

Olá, como vocês podem ver sou novo a programar em Java.

Aqui está o código:

public void paint (Graphics g)
    {
    	
       
		sp1 = getImage (getCodeBase (), "ss2.gif"); 
        g.drawImage(sp1, x_pos, y_pos, this);
        g.setColor(Color.yellow);
g.drawString(String.format("secs: %d ", secs), 30, 30);
        

     
    
    	sp2= new Image[100];
    	
    	
    	
    		for(int i =0; i<100; i++) {
    			if (secs==5*i)
    		{
    				
    			
    			sp2[i] = getImage (getCodeBase (), "ss2.gif"); 
    	g.drawImage(sp2[i], (i*10), e_pos*10*1, this);
    
    
    		}}
    	}

Supostamente eu faço aparecer uma imagem, em que posso a movimentar no eixo x .(sp1)

E de segundo a segundo queria fazer aparecer uma imagem que etá contida no array.
No segundo 0 aparece sp2[0]
No segundo 5 aparece sp2[1] etc...

Mas o problema é que a iamgem sp2[0] aparece, depois desaparece e ao fim de 5 segundoss aparece a sp2[1].

Alguem sabe como faço as imagens aparecerem e ficarem lá sem desparecerem?

9 Respostas

JoaoBluSCBR

OK, já que você é novo, comece certo a se organizar.

paint é um método de desenho, coloque nele apenas o que deve ser desenhado e não o carregamento de variáveis.

Teu código carrega as imagens durante o processo de desenho e isso já causa um problema sério pois você carrega as num loop que vai fazer isso acontecer toda vez que a tela for repintada:

public void paint(Graphics g) {
        sp1 = getImage(getCodeBase(), "ss2.gif");
        g.drawImage(sp1, x_pos, y_pos, this);
        g.setColor(Color.yellow);
        g.drawString(String.format("secs: %d ", secs), 30, 30);
        sp2 = new Image[100];
        for (int i = 0; i < 100; i++) {
            if (secs == 5 * i) {
                sp2[i] = getImage(getCodeBase(), "ss2.gif");
                g.drawImage(sp2[i], (i * 10), e_pos * 10 * 1, this);
            }
        }
    }

então vamos mudar um pouco. Primeiro separando num método o que é carregamento de imagens:

private Image sp1; 
    private Image sp2[] = new Image[100];
    
    public void carregarImagens() {
        sp1 = getImage(getCodeBase(), "ss2.gif");
        for (int i = 0; i < 100; i++) {
            sp2[i] = getImage(getCodeBase(), "ss2.gif");            
        }
    }

Pronto, agora tua classe rodada terá uma Imagem simples e mais um array de 100 imagens.
Se bem que essa tua carga dentro do for é meio estranha, até por que ela carrega o mesmo gif
do sp1, e ainda por cima carrega ele em 100 posições de array. Bem, mas isso você tem que
resolver. Se o array terá cem imagens diferentes, terá de esquecer o loop e carregar cada
uma dela individualmente ou usando uma lista.

Agora sim podemos refazer o teu paint apenas com aquilo que será desenhado:

But…

Temos um porem, paint se repete toda vez que a tela for repintada. Então quer dizer que
se você troca a imagem ele será re-executado e isso faz com que teu redezenho aconteça
novamente e por isso que a imagem de sp1 vai aparecer de novo e de novo, por que o
código inteiro do método vai para a pilha e será re-executado todo. Não só o loop for.

Então é preciso escolher a imagem em outro lugar e não dentro do método pain.

Então sugiro, por exemplo um método rodarImagens(), assim:

private Image imagemEscolhida;

    public void rodarImagens(){        
        imagemEscolhida = sp1;
        repaint();
        //Aqui tem que ir o código para esperar os 5 segundos.
        for (int i = 0; i < 100; i++) {
            imagemEscolhida = sp2[i];
            repaint();
            //Aqui tem que ir o código para esperar os 5 segundos.
        }                
    }

e por último o novo paint que só terá de fato, o redesenho da imagem

public void paint(Graphics g) {
        g.drawImage(imagemEscolhida, x_pos, y_pos, this);        
        //Se precisar desenhar um texto aqui, também terá de colocá-lo em variável, fora daqui e aqui  fazer o desenho.
    }

Nada é muito simples em programação, em qualquer linguagem.
Tudo tem seu lugar, não dá para simplesmente misturar um código no outro e querer
que tudo aconteça diretamente.

abs, boa sorte .

JoaoBluSCBR

Só mais uma coisa que esqueci.

Quando postar algo no fórum, coloque o nome do post algo que explique seu problema.

Poderia ser “Trocando imagens” ou “Paint de imagens”, qualquer coisa que já desse uma idéia do teu problema.

Palavras como Dúvida, ajuda, socorro, são óbvias, ninguém vem ao fórum se não for para procurar ajuda e
a maioria aqui nem abre tópicos com nomes como esse, por isso o teu ficou um bom tempo sem resposta…

abs

F

Ok, eu segui os seus passos e percebi o objectivo.

O problema é que se eu não defenir as variáveis no método paint, ele não desenha nada.

Eu experimentei também só desenhar a imagem sp1.

-Criei o método carregarImagens();
sp1 = getImage(getCodeBase(), “ss2.gif”);

-Criei o método rodarImagens();

imagemEscolhida = sp1;

repaint();

-Depois no método paint;
g.drawImage(imagemEscolhida, x_pos, y_pos, this);

e não desenha nada

só desenha se fizer load da imagem no paint.

PS: eu tou a usar Applet não sei se isso tem interfere.

JoaoBluSCBR

Você está disparando os métodos na sequencia???

Só criar os métodos não assegura que eles sejam executados.

No método que inicia tua classe, mande primeiro executar o

carregaImagens()

e depois o

rodarImagens()

Como o rodarImagens manda fazer repaint, o paint será disparado automaticamente.

É claro que se você não carregou, nem rodou, nada vai se desenhar sozinho.

O único método que roda sozinho aí, é o paint, mas ele vai mostrar apenas o que já estiver
carregado.

Tudo que eu fiz é necessário para que a coisa toda funciona.

Mas eu imaginei que você veria que seria preciso executar os métodos a partir de um
que rode a classe.

Você deve ter um método init, run, sei lá, coloque nele a chamada do carregaImagens e depois o rodaImagens.

JoaoBluSCBR

Se não conseguir poste a tua classe toda e dou uma olhada.

F

Tinha testado no método run não deu.

Mas criei o init e deu.

Eu sabia que era perciso um método para iniciá-los.

Mas naõ tinha experimentado o init.

Obrigado pela ajuda.

F

Joao mas mesmo assim não consegui fazer o que queria.

Eu quero desenhar cada imagem do array no seu respectivo segundo.
E com o passar dos segundos, a imagem de cada array fica numa posição diferente.

public void rodarImagens(){          
        imagemEscolhida = sp1;  
        repaint();  
      
        for (int i = 0; i < 10; i++) {  
       if (secs==i)
       {
        	imagemEscolhida = sp2[i];
repaint();
       }
  }                  
    }  
  
    

    public void paint (Graphics g)
    {
    	g.drawImage(imagemEscolhida, x_pos, y_pos, this);     
      
    	  for (int i = 0; i < 10; i++) {  
    	g.drawImage(imagemEscolhida, i*10, i*10, this);
    	   
    	  }
}

Este código desenha logo o array de imagens no segundo 0.
Mas eu quero que ele desenhe as imagens em cada segundo e não logo tudo de uma vez..
Eu penso que fiz mal em criar o loop no paint, mas não tou a ver outra maneira.

F

Sorry este post.

JoaoBluSCBR

Não tem essa de pedir desculpas pelo post.

É uma dúvida, tá aprendendo. Tudo é válido.

Tem muita gente com a mesma dúvida no começo. Por isso é importante colocar um bom título, assim, o próximo com essa dúvida pode pesquisar e já terá a resposta.

isso aqui é um imenso banco de soluções.

Já encontrei respostas para tantos problemas aqui, e em vários níveis.

Criado 10 de julho de 2011
Ultima resposta 11 de jul. de 2011
Respostas 9
Participantes 2