Avatar billede 1nz4n3 Nybegynder
01. september 2005 - 19:04 Der er 21 kommentarer og
1 løsning

Java: Baggrunden "blinker"

Hej, jeg vil prøve at lave et lille spil. Men hver gang jeg trykker et sted i applet'en, så blinker selve baggrunden omme bagved, hvordan forhindre jeg det?

Her er min kode.


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

public class Test extends Applet implements MouseListener
{
Image baggrund;
  Point mouseDown = null;
 

  public void init()
  {
    addMouseListener(this);
  }

  public void paint(Graphics g)
  {
baggrund = getImage(getCodeBase(),"room.gif");
g.drawImage(baggrund,0,0,this);
    if (mouseDown != null)
      g.drawString("Her", mouseDown.x, mouseDown.y);       
  }
   
  public void mouseClicked(MouseEvent e)
  {
    mouseDown = new Point((int) e.getX(), (int) e.getY());
    repaint();
  }
 
  public void mousePressed(MouseEvent e) {}
  public void mouseReleased(MouseEvent e) {}
  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent e) {}
}
Avatar billede 1nz4n3 Nybegynder
01. september 2005 - 19:14 #1
Slet ingen hurtige respons?
Avatar billede arne_v Ekspert
01. september 2005 - 19:26 #2
Eksperten har et email problem, så der bliver ikke sendt email
ud om nye spørgsmål til dem som anbonnerer på kategorien

det kan være en årsag til den manglende respons
Avatar billede arne_v Ekspert
01. september 2005 - 19:27 #3
spørgsmålet ligger iøvrigt uden for mit område
Avatar billede 1nz4n3 Nybegynder
01. september 2005 - 19:30 #4
Er du ikke god til Java d?
Avatar billede arne_v Ekspert
01. september 2005 - 19:33 #5
måske

men ikke til alt indenfor java !
Avatar billede 1nz4n3 Nybegynder
01. september 2005 - 20:45 #6
Okay, må vente så! >_<
Avatar billede mikkelbm Nybegynder
01. september 2005 - 22:03 #7
Avatar billede 1nz4n3 Nybegynder
02. september 2005 - 10:25 #8
Kan ikke rigtigt se hvad det har med spørgsmålet at gøre.

Men kan du fortællle mig hvorfor den blinker hver gang jeg trykker et sted på skærmen+
Avatar billede mikkelbm Nybegynder
02. september 2005 - 10:33 #9
Fordi du repainter det hele.

Kig lige en ekstra gang på linket, og så læs det der står der. Så vil du finde ud af at der er noget der hedder double buffering, som er meget nyttigt i grafik sammenhæng.

Eksemplet fra linket:
1. Firkant - der blinker teksten, når du kører musen rundt (fordi der er lavet som du har lavet det).
2. Firkant - der blinker teksten, når du kører musen rundt (bare et eksempel på hvordan man ikke skal gøre).
3. Firkant - der blinker teksten ikke. Fordi der bliver brugt double buffering.
Avatar billede mikkelbm Nybegynder
02. september 2005 - 10:37 #10
"Fordi du repainter det hele"

Skal nok være:

"Fordi du tegner direkte på din applet"
Avatar billede mikkelbm Nybegynder
02. september 2005 - 10:38 #11
Og så er der heller ikke nogen grund til at loade billedet hver gang.

Brug i stedet din init metode:

public void init()
{
    addMouseListener(this);
    baggrund = getImage(getCodeBase(),"room.gif");
}
Avatar billede 1nz4n3 Nybegynder
02. september 2005 - 14:07 #12
Hej igen.
Nu har jeg prøvet lidt, og læst hvad du har skrevet osv.
Og er kommet frem til dette, men nu siger den variabel "g" ikke findes, fordi jeg prøver at sætte en baggrund uden en public-paint.

Se her, og fortæl mig hvad jeg gør forkert.

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

public class chatApplet extends Applet implements MouseListener
{
Image baggrund;
  Point mouseDown = null;
 

public void init()
{
    addMouseListener(this);
    baggrund = getImage(getCodeBase(),"room.gif");
    g.drawImage(baggrund,0,0,this);
}

  public void paint(Graphics g)
  {

    if (mouseDown != null)
      g.drawString("Her", mouseDown.x, mouseDown.y);       
  }
   
  public void mouseClicked(MouseEvent e)
  {
    mouseDown = new Point((int) e.getX(), (int) e.getY());
    repaint();
  }
 
  public void mousePressed(MouseEvent e) {}
  public void mouseReleased(MouseEvent e) {}
  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent e) {}
}


- Skal siges det ikke nytter at sætte g.drawImage .. ved public-paint, for så blinker den aligevel.
Avatar billede 1nz4n3 Nybegynder
02. september 2005 - 16:10 #13
Kan du se hvor problemet ligger?
Avatar billede mikkelbm Nybegynder
02. september 2005 - 16:13 #14
Du skal beholde:

g.drawImage(baggrund,0,0,this);

i din paint-metode.
Avatar billede 1nz4n3 Nybegynder
02. september 2005 - 16:17 #15
Skal siges det ikke nytter at sætte g.drawImage .. ved public-paint, for så blinker den aligevel.


-- Men aligevel blinker den.

Du mener sådan ikk'?

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

public class chatApplet extends Applet implements MouseListener
{
Image baggrund;
  Point mouseDown = null;
 

public void init()
{
    addMouseListener(this);
    baggrund = getImage(getCodeBase(),"room.gif");
}

  public void paint(Graphics g)
  {
g.drawImage(baggrund,0,0,this);
    if (mouseDown != null)
      g.drawString("Her", mouseDown.x, mouseDown.y);       
  }
   
  public void mouseClicked(MouseEvent e)
  {
    mouseDown = new Point((int) e.getX(), (int) e.getY());
    repaint();
  }
 
  public void mousePressed(MouseEvent e) {}
  public void mouseReleased(MouseEvent e) {}
  public void mouseEntered(MouseEvent e) {}
  public void mouseExited(MouseEvent e) {}
}
Avatar billede 1nz4n3 Nybegynder
02. september 2005 - 16:24 #16
??
Avatar billede mikkelbm Nybegynder
02. september 2005 - 17:13 #17
Har du læst hvad der står i det link?
Avatar billede 1nz4n3 Nybegynder
02. september 2005 - 17:27 #18
Ja. Men det nytter ikke meget når jeg ikke kan en særlig stor del af Java, men det jeg skrev ovenover, det var det du mente ikke?

- Somsagt kan jeg ikke se hvor i alverden den fejl skulle være, for har jo sat g.drawImage(baggrund,0,0,this);

i paint-metoden og baggrund = getImage .... i init-metoden, kan du fortælle mig det?
Avatar billede mikkelbm Nybegynder
02. september 2005 - 17:27 #19
Så får du det serveret:

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

public class DoubleBuffering extends Applet implements MouseListener
{
    Image offScreen;
    Graphics bufferGfx;
    Image baggrund;
      Point mouseDown = null;
 

    public void init()
    {
        addMouseListener(this);
        baggrund = getImage(getCodeBase(),"test.png");
        offScreen = createImage (this.getWidth(), this.getHeight());
        bufferGfx = offScreen.getGraphics();
    }

      public void paint(Graphics g)
      {
          bufferGfx.clearRect(0,0,this.getWidth(),this.getHeight());

        bufferGfx.drawImage(baggrund,0,0,this);
        if (mouseDown != null)
            bufferGfx.drawString("Her", mouseDown.x, mouseDown.y);       
       
        g.drawImage(offScreen,0,0,this);
      }   
   
      public void mouseClicked(MouseEvent e)
      {
        mouseDown = new Point((int) e.getX(), (int) e.getY());
        repaint();
      }
     
      public void update (Graphics g)
      {
          paint(g);
      }
 
      public void mousePressed(MouseEvent e)     {}
      public void mouseReleased(MouseEvent e) {}
      public void mouseEntered(MouseEvent e)     {}
      public void mouseExited(MouseEvent e)     {}
}
Avatar billede 1nz4n3 Nybegynder
02. september 2005 - 17:31 #20
Mange tak og undskyld fordi jeg ikke rigtigt forstod det.
Er ikke så kvik indefor Java.
Avatar billede mikkelbm Nybegynder
02. september 2005 - 17:31 #21
Du skal bare lige omdøbe klassen til at hedde det, du har kaldt den. Og ændre navnet på billedet. Så skulle det køre uden at blinke :)
Avatar billede mikkelbm Nybegynder
02. september 2005 - 17:32 #22
Det er ikke noget at undskylde. Det er bare meget sent du fortæller hvor meget java du kan. Og derfor er det svært at give den rigtige hjælp.
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