Gå til innhold

Hvordan tegne en sirkel på nytt i Java.


Anbefalte innlegg

Hei.

 

Har laget en kode hvor en sirkel spretter rundt innenfor en ramme, men jeg får ikke sletta forrige sirkel for hver gang jeg tegner en ny så det ser bare ut som en slange til slutt. Noen som kan hjelpe meg? Trodde repaint() var løsningen men fikk det ikke til å virke.

 

Her er koden:

 

import java.awt.*;
import java.applet.*;

public class rect extends Applet
 {
   boolean run = true;
   int x1 = 50;
   int y1 = 150;
   int xspeed = 2;
   int yspeed = 1;

    public void paint (Graphics g)
      { 
         g.setColor(Color.black);
         g.drawRect(0,0,599,599);
         do 
           {
             g.setColor(Color.blue);
             g.fillOval(x1,y1,60,60);
             x1 = x1 + xspeed;
             y1 = y1 + yspeed;
             if (x1 > 538)
               {
                 xspeed = -xspeed;
               }
             if (y1 > 538)
               {
                 yspeed = -yspeed;
               }
             if (x1 < 1)
               {
                 xspeed = -xspeed;
               }
             if (y1 < 1)
               {
                 yspeed = -yspeed;
               }
             try
             {Thread.sleep(10);}
             catch (InterruptedException e){}
           } while (run=true);


       g.setColor(Color.pink);
       g.fillOval(150,150,60,60);
      }
 }

Lenke til kommentar
Videoannonse
Annonse

g.drawRect er kun rammen rundt. Det er g.fillOval som "flytter" på seg. Det jeg lurer på er hvordan jeg sletter en sirkel før den tegner en ny? Eller sletter alt som er tegnet i det heletatt, slik at for hver do-loop så tegnes ikke ovalen over den forrige.

Lenke til kommentar

Med SWING vil ingenting overskrives uten at du skriver over det selv. Det kan være du finner gamle eksempler som bruker AWT som gjør det (mde AWT ble det blanket for hver paint).

 

Det har med ytelse å gjøre, slik at du ikke kaster bort kjøretid på å skrive "ingenting" til hele skjermen på hvert bilde hvis du ikke trenger det.

 

Enten sletter du hele skjermen med fillRect, men det er mest elegant hvis du klarer å blanke ut kun det du trenger uten å bruke for mye maskinressurser på det (f.eks ved å skrive en sort "fillOval" over den gamle før du tegner den nye, eller finne bounding rectangle rundt det som skal tegnes på nytt og ta en fillRect rundt det, avhengig av hva som kjører raskest).

Endret av MailMan13
Lenke til kommentar

Nederst i while-loopen din sjekker du ikke om run er true, run == true, men du setter run til true, run = true, noe som vil skape problemer for deg når du skal ut av loopen. Det funker kun fordi uttrykket (run=true) evaluerer til true. Ville bare brukt while(run) { ... } her, blir mer oversiktlig.

Lenke til kommentar

Nederst i while-loopen din sjekker du ikke om run er true, run == true, men du setter run til true, run = true, noe som vil skape problemer for deg når du skal ut av loopen. Det funker kun fordi uttrykket (run=true) evaluerer til true. Ville bare brukt while(run) { ... } her, blir mer oversiktlig.

Jeg vil si meg enig: aldri sjekk om en bool er true eller false med == det er fullstendig unødvendig, og fører bare til feil som dette.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...