Avatar billede phineas_phreak Nybegynder
07. juni 2006 - 17:19 Der er 5 kommentarer og
1 løsning

snake spil grafik

er igang med noget snakespil og er løbet ind i nogle problemer i forbindelse med repaint.

Mit spilbræt består af 100x75 felter der blir tegnet ved brug af 2 for løkker i min paint metode.

Problemet er at når spillet endelig kører og jeg kalder repaint så ryger cpu usage op på 100%, og jeg har den ide af at den kalder paint metoden og gennemløber alle felter hver gang den opdaterer. Hvordan sørger jeg for at denne metode kun køres når brættet initialiseres, så jeg ka nøjes med at male enkelte metoder.
Jeg har prøvet at kalde repaint(x,x,x,x) metoden for at male en lille del af brættet, men det er stadig det samme.

på forhånd tak.
Avatar billede mikkelbm Nybegynder
07. juni 2006 - 18:11 #1
Mon ikke nærmere det har noget med din måde at køre spillet på? Husker du at køre det i en tråd? Det burde ikke koste alverden cpu at tegne de felter.
Avatar billede phineas_phreak Nybegynder
07. juni 2006 - 18:17 #2
Kører det som følger:

SwingUtilities.invokeLater(new Runnable() {

    public void run() { 
          Variables.snakespil.snakeBoard.repaint();
               
    }
});

og hvis jeg fjerner repaint og lader modellen spille uden at male, så ligger cpu usage  normalt
Avatar billede mikkelbm Nybegynder
07. juni 2006 - 19:43 #3
Har du en tråd kørende udenom den stump kode eller looper du bare i gui-tråden?

Normalt når man laver spil, har man et main-loop, som kører i sin egen tråd:

Altså noget a la:

new Thread ()
{
    public void run()
    {
        while (gameRunning)
        {
            // repaint all nødvendige elementer:
            // baggrund, flytbare elementer etc...
           
            // Giv lidt plads til cpu'en.
            try { Thread.sleep (50); } catch (Exception e){}
        }
    }
}.start();
Avatar billede phineas_phreak Nybegynder
07. juni 2006 - 19:50 #4
det er en client-server del, så jeg modtager gametick fra serveren og har ingen mulighed for at sætte sleep selv. Derfor skal grafikken opdateres i hvert gametick.

Jeg har lige prøvet at eksperimentere med simpel gui der bare flytter en kasse rundt på en model bestående af 30 rækker og 50 søjler. Her kører det fint hvis jeg sætter gameTick ned til 10 ms. Men hæver jeg antallet af søjler, rækker til 75, 100 hvilket jo giver 7500 gennemløb pr. repaint blir cpu'en sendt i knæ allerede ved gametick på 100 ms. Derfor søger jeg en alternativ metode til at klare de her ting.
Avatar billede phineas_phreak Nybegynder
07. juni 2006 - 19:55 #5
når jeg siger looper er det mit spilbræts paintcomponent jeg tænker på. Koden ser således ud:

public void paintComponent(Graphics g)
    {
        super.paintComponent(g);
       
        g.setColor(new Color (255, 255, 255));
        g.fillRect(0, 0, getWidth(), getHeight());
        g.setColor(new Color(0, 0, 0));

    final int rows = Model.rows;
    final int cols = Model.cols;

        g.drawLine(getWidth()-1,  0, getWidth()-1, getHeight()-1);
    g.drawLine(0, getHeight()-1, getWidth()-1, getHeight()-1);

        for(int c=0; c < cols; c++)
        {
            g.drawLine(c*getWidth()/cols, 0, c*getWidth()/cols,getHeight());
            for(int r = 0; r < rows; r++)
            {             
                g.drawLine(0, r*getHeight()/rows, getWidth(), r*getHeight()/rows);
                if (mod.board[c][r] == 1)
                {
                    g.setColor (new Color(200, 0, 0));
                    g.fillOval((int)(c*getWidth()/cols), (int)(r*getHeight()/rows), getWidth()/cols, getHeight()/rows);
                    g.setColor (new Color(0, 0, 0));
                }
                if (mod.board[c][r] == 2)
                {
                    g.setColor (new Color(0, 0, 200));
                    g.fillOval((int)(c*getWidth()/cols), (int)(r*getHeight()/rows), getWidth()/cols, getHeight()/rows);
                    g.setColor (new Color(0, 0, 0));
                }
            }
        }
    }
Avatar billede phineas_phreak Nybegynder
10. juni 2006 - 16:13 #6
Fik løst problemet. Det viste sig som forventet at java er røvhamrende langsom og bruger uanede mængder kraft på kommandoer som g.setColor og andre. Løsningen blev at lave en simplere GUI.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester