Repaint w pętli

Repaint w pętli
BA
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 3 lata
  • Postów:43
0

Cześć,

mam pewien problem z używaniem procedury repaint() w pętli. Otóż w momencie, kiedy wrzucam w programie repaint() do pętli for, to zamiast wykonywać się on n razy, wykonuje się tylko raz. Kody źródłowe potrzebne do analizy wrzucam poniżej:

Kopiuj

public class paintWorld extends JPanel  {

//procedura przechwytujaca wcisniety przycisk
    void catchKeyPressed()
    {
        
        //Sztuczny timer
        if(mainCharacter.moves == 0)
        {
            mainCharacter.moves = 1; //Ustawiam flage, ze postac sie rusza
   
            for (int i=0; i<32; i++)
            {
                try
                {
                    System.out.println(i);
                    
                    Thread.sleep(5);
                    mainCharacter.moveCharacter(widthOfMap, heigthOfMap);
                    repaint();
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
                
            }

        }
        
    }


@Override
    protected void paintComponent(Graphics g)
    {
        System.out.println("Leci repaint");
        super.paintComponent(g);
        Graphics2D g2d = (Graphics2D) g;   
        
        widthOfMap = world.getMapWidth();
        heigthOfMap = world.getMapHeigth();
        
        BufferedImage worldImage = new BufferedImage(widthOfMap*32, heigthOfMap*32, 2);
        Graphics paintWorldImage = worldImage.getGraphics();
    
[...]

        mainCharacter.moves = 0;

    }

}

Wrzuciłem sobie System.out.println w celu sprawdzenia, czy repaint rzeczywiście wchodzi do paintComponent i z logów wyszło takie coś:

Kopiuj
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Leci repaint

Ma ktoś może pomysł dlaczego tak się dzieje, że procedura ta jest uruchamiana tylko raz, a nie tak jak jest to w kodzie programu 32 razy?

1

Hej, zobacz tutaj:
https://github.com/bartlomiej-gora/JPong2/blob/master/src/pl/bgora/game/MainFrame.java

Kopiuj
private void startThread() {
    Runnable runner = new Runnable() {
      
      @Override
      public void run() {
        Random rand = new Random();
        int leftRight = rand.nextInt(2);
        if (leftRight == 0) {
          ball.setSpeedx(Ball.DEFAULT_SPEED);
        } else {
          ball.setSpeedx(-Ball.DEFAULT_SPEED);
        }
        while (left.getScore() < 5 && right.getScore() < 5) {
            // move objects
          move();
          // Check collisions
          // collisions for players vs. court
          checkCollision(rand);
          //3. Paint!
          myPaint(getGraphics());
          try {
            Thread.sleep(0,10);
          } catch (InterruptedException e) {
            LOGGER.error("InterruptedException", e);
          }
        }
        
      }

Mam nadzieję ze to pomoże

gk1982
  • Rejestracja:prawie 14 lat
  • Ostatnio:około miesiąc
  • Lokalizacja:Łódź
  • Postów:541
0

Don't give up learning JavaScript!
It is enjoyable to make things visible which are invisible.
Każdy programista przybywający z innego miasta jest fachowcem.
Anyone who stops learning is old, whether at twenty or eighty.
Anyone who keeps learning stays young.
The greatest thing in life is to keep your mind young.
edytowany 4x, ostatnio: gk1982
BA
  • Rejestracja:ponad 10 lat
  • Ostatnio:ponad 3 lata
  • Postów:43
0
Smutny Samiec napisał(a):

Hej, zobacz tutaj:
https://github.com/bartlomiej-gora/JPong2/blob/master/src/pl/bgora/game/MainFrame.java

Kopiuj
private void startThread() {
    Runnable runner = new Runnable() {
      
      @Override
      public void run() {
        Random rand = new Random();
        int leftRight = rand.nextInt(2);
        if (leftRight == 0) {
          ball.setSpeedx(Ball.DEFAULT_SPEED);
        } else {
          ball.setSpeedx(-Ball.DEFAULT_SPEED);
        }
        while (left.getScore() < 5 && right.getScore() < 5) {
            // move objects
          move();
          // Check collisions
          // collisions for players vs. court
          checkCollision(rand);
          //3. Paint!
          myPaint(getGraphics());
          try {
            Thread.sleep(0,10);
          } catch (InterruptedException e) {
            LOGGER.error("InterruptedException", e);
          }
        }
        
      }

Mam nadzieję ze to pomoże

Mega, działa, mimo, że jeszcze z niewielkimi problemami (jak dłużej przytrzymam przycisk, to mimo wszystko wątki się gubią). Dziękuję bardzo. Poniżej kawałek kodu co poprawiłem dla potomnych

Kopiuj
//procedura przechwytujaca wcisniety przycisk
    void catchKeyPressed()
    {
        
        //Sztuczny timer
        if(mainCharacter.moves == 0)
        {    
            //Dodany kawalek kodu stad
            Runnable runner = new Runnable() {         
            
            @Override
            public void run() {
                
            //Dodany kawalek kodu dotad 
                
            mainCharacter.moves = 1; //Ustawiam flage, ze postac sie rusza
   
            for (int i=0; i<32; i++)
            {
                try
                {
                    System.out.println(i);
                    
                    Thread.sleep(5);
                    mainCharacter.moveCharacter(widthOfMap, heigthOfMap);
                    repaint();
                } catch (Exception e)
                {
                    e.printStackTrace();
                }
                
            }

            }
                
            };
            
            //Uruchomienie wielowatkowosci
            Thread t = new Thread(runner);
            t.start();
                
        }  
        
    }

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.