Repaint w pętli

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:


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ś:

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

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

0
Smutny Samiec napisał(a):

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

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

//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();
                
        }  
        
    }

1 użytkowników online, w tym zalogowanych: 0, gości: 1