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