[java] BufferedImage werkt niet

Pagina: 1
Acties:

  • Reefer
  • Registratie: Mei 2000
  • Laatst online: 21-02-2025
Ik probeer een spelletje te maken met een bewegend gifje als doelwit. Dit heb ik proberen te doen met een BufferedImage maar de animatie flikkert nog steeds , hetzelfde als zonder BufferedImage zeg maar,
de volgende code heb ik nu , maar wat klopt hier niet aan ?
dit is niet alles maar een deel van de code
code:
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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public class LTarget extends Applet implements Runnable, KeyListener {

static int i=0;
static boolean back = false;    //forward or back?
BufferedImage enemy;

    public void run()
    {
        while(running)  //keep animating forever
        {
            try
            {   if(i<200 && !back)
                {   if(i==199)
                    {   back = true;
                    }
                    i++;
                    repaint();
                    thr.sleep(10);
                }
                else
                {
                    if(i==0)
                    {
                        back = false;
                    }
                    i--;
                    repaint();
                    thr.sleep(10);
                }
                repaint();
            } catch(Exception e) {}
        }
    }

    public void paint(Graphics g)
    {       clear(g);
            Graphics2D g2d = (Graphics2D)g;
            enemy = getBufferedImage("enemy.gif",this);
            g2d.drawImage(enemy, i, 0, null);
    }


    public static BufferedImage getBufferedImage(String imageFile, Component c)
    {
            Image image = c.getToolkit().getImage(imageFile);
            waitForImage(image, c);
            BufferedImage bufferedImage =
                    new BufferedImage(image.getWidth(c), image.getHeight(c),
                            BufferedImage.TYPE_INT_RGB);

            Graphics2D g2d = bufferedImage.createGraphics();
            g2d.drawImage(image, i, 0, null);
            return(bufferedImage);
    }

    public static boolean waitForImage(Image image, Component c) {
        MediaTracker tracker = new MediaTracker(c);
        tracker.addImage(image, 0);
        try {
          tracker.waitForAll();
        } catch(InterruptedException ie) {}
        return(!tracker.isErrorAny());
   }

A Breakbeat A Day Keeps Religion Away.


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Het lijkt mij sowieso niet erg handig om bij elke paint opnieuw je plaatje in te gaan lezen en een nieuwe BufferedImage te maken ;) . Als je nu eens 1 keer inleest en daarna bewaard?

Verder heeft bufferen alleen nut als je op je buffer kliedert en daarna in 1 keer je image tekent op je graphics. Ik zie hier echter een methode0aanroep naar clear staan?

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


Verwijderd

Kleine tip:

doordat je dus een plaatje laat bewegen en daarvoor de hele tijd de zaak repaint, gaat de applet vreselijk knipperen. Dit is eenvoudig op te lossen door appart een image off_screen te painten en dan in de update functie deze image in 1 keer te painten, dit bedoelde mbravenboer waarschijnlijk ook te zeggen denk ik.

Hier wat code fragmenten om dat te realiseren:

// De offscreen image
private Image image_offscreen=null;
private Graphics off_screen_graphics;

// init
public void init()
{
[.. code ..]
// init van de image_offscreen en off_screen_graphics
image_offscreen=createImage(this.size().width,this.size().height);
off_screen_graphics=image_offscreen.getGraphics();
}


// je run methode gaat er +/- zo uitzien:
public void run()
{
while(true)
{
try
{
thr.sleep(20);
}
catch (InterruptedException e)
{
// we are interrupted
}
repaint();
}
}

// dan deze zeer belangrijke funtie toevoegen:

public void update(Graphics g)
{
/*
eerst weer alles opruimen wat er op het
scherm gekliedert is
*/
// bijvoorbeeld een wit vlak erover heen
graphics_off_screen.setColor(Color.white);
graphics_off_screen.fillRect(0,0,w,h);

// hier functies om het een en ander te tekenen

// eindigen met:
paint(graphics_off_screen);
g.drawImage(image_offscreen,0,0,this);
}


8-) had toevallig gisteren zoiets gemaakt