Nillerh Ответов: 2

Переключение между изображениями, без белой вспышки, происходящей в java.


Привет, я пытаюсь сделать этот обратный отсчет через JFrame.

package yasuharu.takanashi;

import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class TitanBall extends JPanel{

    
    static int FrameHeight = 1320, FrameLength = 700; //Bestemmer Højde og længde af frame.
    static int Tid = 31; //Til countdown
   
    public static void main(String[] args) throws InterruptedException 
    {
        
        
                    //Laver frame
    JFrame TitanBall = new JFrame("Yasuharu Takanashi");
    TitanBall.pack();
    TitanBall.setSize(FrameHeight, FrameLength);
    TitanBall.setVisible(true);
    TitanBall.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    new MusicIntro(); // Intro musik til "Loading screen"
   
    TitanBall StartScreen = new TitanBall();
    TitanBall.add(StartScreen);
        
     while(Tid > 0){          //Countdown
     TitanBall.validate();   
     TitanBall.repaint();     //Repainter det nye billede
     Tid--;                   //Tæller en ned
     Thread.sleep(1000);      //Stopper koden i 1 sekund. 
      }
     
    TitanBall.add(new Grafik_Bane()); //Caller banen ind.
    TitanBall.validate(); //Painter banen.
        
     new MusicIngame(); // Starter musik i spillet. 
    }
    
                // Start screen og countdown. 
    
    
    @Override
    public void paint(Graphics g)
    {
            super.paint(g);
            
            if(Tid == 30){
                // 30 sekunder
                Image StartScreen30 = Toolkit.getDefaultToolkit().getImage("StartScreen30.png");
                g.drawImage(StartScreen30, 0, 0, 1320, 700, this);
            }
            
            
            if(Tid == 29){
                // 29 sekunder
                Image StartScreen29 = Toolkit.getDefaultToolkit().getImage("StartScreen29.png");
                g.drawImage(StartScreen29, 0, 0, 1320, 700, this);
            }
            
            
            if(Tid == 28){
                // 28 sekunder
                Image StartScreen28 = Toolkit.getDefaultToolkit().getImage("StartScreen28.png");
                g.drawImage(StartScreen28, 0, 0, 1320, 700, this);
            }
            
            
            if(Tid == 27){
                // 27 sekunder
                Image StartScreen27 = Toolkit.getDefaultToolkit().getImage("StartScreen27.png");
                g.drawImage(StartScreen27, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 26){
                // 26 sekunder
                Image StartScreen26 = Toolkit.getDefaultToolkit().getImage("StartScreen26.png");
                g.drawImage(StartScreen26, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 25){
                // 25 sekunder
                Image StartScreen25 = Toolkit.getDefaultToolkit().getImage("StartScreen25.png");
                g.drawImage(StartScreen25, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 24){
                // 24 sekunder
                Image StartScreen24 = Toolkit.getDefaultToolkit().getImage("StartScreen24.png");
                g.drawImage(StartScreen24, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 23){
                // 23 sekunder
                Image StartScreen23 = Toolkit.getDefaultToolkit().getImage("StartScreen23.png");
                g.drawImage(StartScreen23, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 22){
                // 22 sekunder
                Image StartScreen22 = Toolkit.getDefaultToolkit().getImage("StartScreen22.png");
                g.drawImage(StartScreen22, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 21){
                // 21 sekunder
                Image StartScreen21 = Toolkit.getDefaultToolkit().getImage("StartScreen21.png");
                g.drawImage(StartScreen21, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 20){
                // 20 sekunder
                Image StartScreen20 = Toolkit.getDefaultToolkit().getImage("StartScreen20.png");
                g.drawImage(StartScreen20, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 19){
                // 19 sekunder
                Image StartScreen19 = Toolkit.getDefaultToolkit().getImage("StartScreen19.png");
                g.drawImage(StartScreen19, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 18){
                // 18 sekunder
                Image StartScreen18 = Toolkit.getDefaultToolkit().getImage("StartScreen18.png");
                g.drawImage(StartScreen18, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 17){
                // 17 sekunder
                Image StartScreen17 = Toolkit.getDefaultToolkit().getImage("StartScreen17.png");
                g.drawImage(StartScreen17, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 16){
                // 16 sekunder
                Image StartScreen16 = Toolkit.getDefaultToolkit().getImage("StartScreen16.png");
                g.drawImage(StartScreen16, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 15){
                // 15 sekunder
                Image StartScreen15 = Toolkit.getDefaultToolkit().getImage("StartScreen15.png");
                g.drawImage(StartScreen15, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 14){
                // 14 sekunder
                Image StartScreen14 = Toolkit.getDefaultToolkit().getImage("StartScreen14.png");
                g.drawImage(StartScreen14, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 13){
                // 13 sekunder
                Image StartScreen13 = Toolkit.getDefaultToolkit().getImage("StartScreen13.png");
                g.drawImage(StartScreen13, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 12){
                // 12 sekunder
                Image StartScreen12 = Toolkit.getDefaultToolkit().getImage("StartScreen12.png");
                g.drawImage(StartScreen12, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 11){
                // 11 sekunder
                Image StartScreen11 = Toolkit.getDefaultToolkit().getImage("StartScreen11.png");
                g.drawImage(StartScreen11, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 10){
                // 10 sekunder
                Image StartScreen10 = Toolkit.getDefaultToolkit().getImage("StartScreen10.png");
                g.drawImage(StartScreen10, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 9){
                // 9 sekunder
                Image StartScreen9 = Toolkit.getDefaultToolkit().getImage("StartScreen9.png");
                g.drawImage(StartScreen9, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 8){
                // 8 sekunder
                Image StartScreen8 = Toolkit.getDefaultToolkit().getImage("StartScreen8.png");
                g.drawImage(StartScreen8, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 7){
                // 7 sekunder
                Image StartScreen7 = Toolkit.getDefaultToolkit().getImage("StartScreen7.png");
                g.drawImage(StartScreen7, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 6){
                // 6 sekunder
                Image StartScreen6 = Toolkit.getDefaultToolkit().getImage("StartScreen6.png");
                g.drawImage(StartScreen6, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 5){
                // 5 sekunder
                Image StartScreen5 = Toolkit.getDefaultToolkit().getImage("StartScreen5.png");
                g.drawImage(StartScreen5, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 4){
                // 4 sekunder
                Image StartScreen4 = Toolkit.getDefaultToolkit().getImage("StartScreen4.png");
                g.drawImage(StartScreen4, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 3){
                // 3 sekunder
                Image StartScreen3 = Toolkit.getDefaultToolkit().getImage("StartScreen3.png");
                g.drawImage(StartScreen3, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 2){
                // 2 sekunder
                Image StartScreen2 = Toolkit.getDefaultToolkit().getImage("StartScreen2.png");
                g.drawImage(StartScreen2, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 1){
                // 1 sekunder
                Image StartScreen1 = Toolkit.getDefaultToolkit().getImage("StartScreen1.png");
                g.drawImage(StartScreen1, 0, 0, 1320, 700, this);
            }
            
            if(Tid == 0){
                // 0 sekunder
                Image StartScreen = Toolkit.getDefaultToolkit().getImage("StartScreenGameStarting.png");
                g.drawImage(StartScreen, 0, 0, 1320, 700, this);
            }
        }
    }


Поэтому здесь я стараюсь нарисовать каждый образ, каждую секунду с помощью

while(Tid > 0){          //Countdown
   TitanBall.validate();
   TitanBall.repaint();     //Repainter det nye billede
   Tid--;                   //Tæller en ned
   Thread.sleep(1000);      //Stopper koden i 1 sekund.
    }



Обратный отсчет работает. Но каждый раз, когда он переключается между следующим изображением, происходит белая вспышка.

Что я уже пробовал:

Я уже пробовал использовать;
repaint();
и
validate();
чаще всего, но ничего не получалось, и я знал, что у меня закончились идеи.

Richard Deeming

Предложение: Все это if (Tid == x) высказывания, вероятно, были бы лучше как единое целое switch (Tid) заявление.
Оператор switch (учебники Java™ > изучение языка Java > основы языка)[^]

2 Ответов

Рейтинг:
15

Richard MacCutchan

Не ставьте все это if высказывания внутри вашего paint метод. И избавьтесь от всего этого дубликата кода, есть гораздо более простые способы обработки такого выбора.

То paint метод должен быть связан только с рисованием "текущего" изображения на экране. Вы выполняете тесты в другом месте, устанавливаете текущее изображение на выбранное и принудительно перекрашиваете его.


CPallini

5.

Maciej Los

5ed!

Рейтинг:
0

CPallini

В дополнение к Ричард предложения, взгляните на Живопись в AWT и Swing[^].


Maciej Los

5ed!

CPallini

Большое спасибо!

Nillerh

Спасибо вам обоим. Я избавился от дубликата кода и создал функцию с массивом, которая вызывает файлы. Я также избавился от мигания. Еще раз спасибо за советы / помощь и ссылку, я посмотрю на это

CPallini

Добро пожаловать.