Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien
Toon posts:

Java drawing repaint problem

Pagina: 1
Acties:
  • 463 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo,

Tijdens het maken van het spel bomberman ben ik tegen het volgende probleem aan gelopen maar ik heb na veel zoeken nogsteeds geen oplossing kunnen vinden.

Als ik het speelveld en alle spelers opnieuw teken dan loopt het spel niet snel genoeg. Dus teken ik alleen een rechthoek om de spelers om de 30 miliseconden opnieuw. Dit werkt helemaal prima met 1 speler en alles gaat dan 100% soepel.

Maar zodra ik meer spelers toevoeg en de repaint(Rectangle) methode dus heel snel achterelkaar aanroep..dan wordt de paintComponent methoden niet direct uitgevoerd maar pas na een aantal aanroepen van de repaint(Rectangle) methode. En de paintComponent tekent dan een grote rechthoek waar alle spelers in vallen. Dus als 1 speler helemaal linksbovenin staat en 1 speler rechtsonderin wordt het hele scherm opnieuw getekent en is het dus weer niet snel genoeg..

Java:
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
        //Paint component methode
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
            Graphics2D g2d = (Graphics2D)g;
            this.drawField(g2d,true);
            this.drawPlayers(g2d);
                
            Rectangle r = new Rectangle(g.getClipBounds().x,
                        g.getClipBounds().y, 
                        g.getClipBounds().width, 
                        g.getClipBounds().height);

            System.out.println("DOES Redraw this = " + r.toString());
    }

        //Aangeroepen om de 30 miliseconden..
        private void Redraw()
    {
        //Draw players
        for(Player player :this.field.getPlayers())
        {
            Rectangle rect = getPlayerIntersectionRectangle(player);
            System.out.println("Should Redraw this = " + rect.toString());
            repaint(rect);
        }
    }


De output voor 2 spelers is dan
//Speler links bovenin
Should Redraw this = java.awt.Rectangle[x=10,y=10,width=100,height=100]
//Speler rechts onderin
Should Redraw this = java.awt.Rectangle[x=670,y=630,width=100,height=140]
//De rechthoek die daadwerkelijk getekend wordt
DOES Redraw this = java.awt.Rectangle[x=10,y=10,width=750,height=750]

Hoe kan ik dit oplossen ? er er een methode waarmee ik ervoor kan zorgen dat de paintComponent wel direct uitgevoerd wordt ? Ik heb al een heletijd op google gezocht en vanalles geprobeerd maar heb nog niks goeds kunnen vinden..

Iemand een idee ? Alvast bedankt..

  • Groeneg2
  • Registratie: November 2007
  • Laatst online: 05-10 13:49
Ik ken dit programma verder niet, heb wel veel met realtime embedded software te maken gehad.
Zoals het nu lijkt heb je het klassieke probleem dat je de timer interupt te intensief gerbuikt om een job af te handelen waardoor er vervolgens te weinig tijd is voor de andere taken. Hierdoor ontstaat dan backlog.
Er zijn 2 mogelijke oplossingen:
1. De frequentie (elke 30milliseconde) te verlagen naar bv 100 ms
2. Het tekenen van de rectangle procedure zelf in assembly te herschrijven en te optimaliseren zodat hij sneller uitgevoerd wordt.

Mijn pagina op youtube http://www.youtube.com/groeneg


  • L01
  • Registratie: December 2003
  • Laatst online: 17-11 21:53

L01

Volgens mij moet je iets met meerdere threads doen als ik het me goed herinner, ik ga even voor je zoeken, brb.

Misschien heb je iets aan deze Thread [JAVA] direct grafiek repainten

[ Voor 30% gewijzigd door L01 op 17-01-2008 12:20 ]

Hi, I'm a signature virus. Put me in your signature to help me spread.


  • BtM909
  • Registratie: Juni 2000
  • Niet online

BtM909

Watch out Guys...

Enig idee wat ik heb (zonder je topic door te lezen) is je topic verplaatsen naar Programming aangezien het om programmeren gaat.

Daarnaast is het de bedoeling dat je zelf laat zien waar je op hebt gezocht en waarom de resultaten geen oplossing boden :) Pas je topicstart dus ook even aan met deze extra informatie

Ace of Base vs Charli XCX - All That She Boom Claps (RMT) | Clean Bandit vs Galantis - I'd Rather Be You (RMT)
You've moved up on my notch-list. You have 1 notch
I have a black belt in Kung Flu.


Verwijderd

Topicstarter
Eindelijk een oplossing gevonden!

Dit ..
this.paint(rect);
Veranderen in dit..
this.paintImmediately(rect);

En het werkt!!..
Bedankt voor de hulp