[java] Double Buffering in klasse

Pagina: 1
Acties:

  • Darius
  • Registratie: Juli 2001
  • Nu online
Hallo, ik heb een kleine vraagje voor de java kenners over iets waar ik niet uitkom :

Ik heb een klasse die een mannetje tekent die threads extendt. Dit ziet er als volgt uit :
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
64
65
class Mannetje extends Thread
{
  public Graphics g;
  public Graphics gBuffer;
  private int x, y, lengte, breedte;
  private Image afbeelding;
  private Thread thread;
  Applet theApplet;

    public Mannetje(Graphics g, Graphics gBuffer,int x, int y, int lengte, int breedte, Image afbeelding, Applet theApplet)
    {
    this.g=g;
    this.gBuffer=gBuffer;
    this.x=x;
    this.y=y;
    this.breedte=breedte;
    this.lengte=lengte;
    this.afbeelding=afbeelding;
    this.theApplet=theApplet;
    }

    public void teken()
    {
    gBuffer.drawImage(afbeelding, x, y, 20, 20,theApplet);
    }

    public void setx(int temp)
    {
    x +=temp;
    }

    public void sety(int temp)
    {
    y +=temp;
    }

    public void run() {
    while(true) {
      teken();
      //sleep(10);
    }
    }

    public void sleep(int millisec)
    {
    try{ Thread.sleep(millisec); }
    catch( InterruptedException e) {}
    }

    public int lengte() {
    return lengte;
    }

    public int breedte() {
    return breedte;
    }

    public int x() {
    return x;
    }

    public int y() {
    return y;
    }
  }

gBuffer initialiseer in in update() onder de hoofdklasse:
code:
1
2
3
4
5
6
7
8
9
10
11
12
public void update(Graphics g) {
  if (buffer==null ||
    (! (buffer.getWidth(this) == appBreedte
     && buffer.getHeight(this) == appHoogte))){
    buffer = this.createImage(getSize().width, getSize().height);
      }

      gBuffer = buffer.getGraphics();

    paint(gBuffer); 
    g.drawImage(buffer, 0, 0, this);
    }

mannetje.teken() doet het dus niet (Null Pointer Exception). Weet iemand hoe ik dit op kan lossen?

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

een graphics object is null totdat het venster gedisplayed is (geweest)

Hoe kom je aan de die graphics objecten?

  • Scorpion
  • Registratie: April 2000
  • Laatst online: 18-01-2024

Scorpion

not to lame to read BitchX.doc

anders geef je de hele foutmelding even :)

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Als je uit de foutmelding het regelnummer haalt weet je vrijwel direct welke variabele null is. :)

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


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op woensdag 09 januari 2002 13:40 schreef mbravenboer het volgende:
Als je uit de foutmelding het regelnummer haalt weet je vrijwel direct welke variabele null is. :)
gBuffer = null ;)

  • Darius
  • Registratie: Juli 2001
  • Nu online
Regel 197, dus

gBuffer.drawImage(afbeelding, x, y, 20, 20,theApplet);

Dan is gBuffer dus nog leeg. Maar hoe zou ik mijn programma aan kunnen passen dat ie niet zeurt?

Verwijderd

in de klasse java.awt.Canvas zit een methode addNotify(), deze wordt aangeroepen als het Graphics object gerealiseerd is (dus als het op het scherm staat en alle resources beschikbaar zijn). Wil je zeker weten dat je pas tekent als je het kan zet dan je aanroep voor het tekenen in deze method door hem te overriden. Let er wel op dat je de originele functionaliteit van de methode behoudt!

Voorbeeldje:
code:
1
2
3
4
public void addNotify() {
  super.addNotify();
  // jouw code
}

Je kunt hierin bijvoorbeeld de thread starten die tekent.

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op woensdag 09 januari 2002 13:42 schreef Darius het volgende:
Regel 197, dus

gBuffer.drawImage(afbeelding, x, y, 20, 20,theApplet);

Dan is gBuffer dus nog leeg. Maar hoe zou ik mijn programma aan kunnen passen dat ie niet zeurt?
Je programma zeurt niet ;)
Je schrijft onjuiste code :)

Hoe kom je aan de Graphics objecten? (code)

  • Darius
  • Registratie: Juli 2001
  • Nu online
code:
1
2
3
4
5
6
 public void start() {
    if(man==null) {
    man = new Mannetje(getGraphics(),gBuffer,50,150,20,20,afbeelding,this);
    man.start();
    }
}

Wat ik dus gewoon wil is dat mannetje naar een bufffer schrijft zodat ik die buffer daarna meteen naar het scherm kan knallen. Ik zit hier al een tijdje mee. Dit zal toch niet zo moeijlijk moeten zijn ?

  • Darius
  • Registratie: Juli 2001
  • Nu online
Op woensdag 09 januari 2002 13:42 schreef jRobert het volgende:
in de klasse java.awt.Canvas zit een methode addNotify(), deze wordt aangeroepen als het Graphics object gerealiseerd is (dus als het op het scherm staat en alle resources beschikbaar zijn). Wil je zeker weten dat je pas tekent als je het kan zet dan je aanroep voor het tekenen in deze method door hem te overriden. Let er wel op dat je de originele functionaliteit van de methode behoudt!

Voorbeeldje:
code:
1
2
3
4
public void addNotify() {
  super.addNotify();
  // jouw code
}

Je kunt hierin bijvoorbeeld de thread starten die tekent.
Betekent dat dat ik mannetje.teken() daar tussen moet zetten? Moet ik daarvoor niet eerst canvas extenden?

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op woensdag 09 januari 2002 13:46 schreef Darius het volgende:
code:
1
2
3
4
5
6
 public void start() {
    if(man==null) {
    man = new Mannetje(getGraphics(),gBuffer,50,150,20,20,afbeelding,this);
    man.start();
    }
}

Wat ik dus gewoon wil is dat mannetje naar een bufffer schrijft zodat ik die buffer daarna meteen naar het scherm kan knallen. Ik zit hier al een tijdje mee. Dit zal toch niet zo moeijlijk moeten zijn ?
Waar je voor moet zorgen is dat het frame waar je getGraphics() op uitvoerd zichtbaar is. Anders zal getGraphics() null returnen..

Dus een setVisible(true) van te voren.

Verder zie ik nog nergens waar je het buffer object aanmaakt?

  • Darius
  • Registratie: Juli 2001
  • Nu online
Op woensdag 09 januari 2002 13:51 schreef wasigh het volgende:

[..]

Waar je voor moet zorgen is dat het frame waar je getGraphics() op uitvoerd zichtbaar is. Anders zal getGraphics() null returnen..

Dus een setVisible(true) van te voren.

Verder zie ik nog nergens waar je het buffer object aanmaakt?
code:
1
2
3
4
5
6
7
8
9
10
11
12
 public void update(Graphics g)
    {
    if (buffer==null ||
            (! (buffer.getWidth(this) == appBreedte
            && buffer.getHeight(this) == appHoogte)))
      {
      buffer = this.createImage(getSize().width, getSize().height);
      }

     gBuffer = buffer.getGraphics();
  paint(gBuffer); g.drawImage(buffer, 0, 0, this);
    }

Dit zit in de hoofdklasse. Hij zou dus voor paint() aangeroepen moeten worden (als ik het goed begrijp). Ik zou de hele source hier posten maar het is een beetje (beetje erg) rotzooi. appBreedte is breedte applet en appLengte lengte.

  • Darius
  • Registratie: Juli 2001
  • Nu online
Voor wie uit deze spaghetti kan komen :
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
package spel;

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

public class Applet2 extends Applet
{
  private Achtergrond achtergrond;
  private Mannetje man, vijand;
  private int steps=5, appBreedte, appHoogte;
  private Image afbeelding, ball, buffer;
  private Graphics gBuffer;
  private Bal balletje;

  public void init()
  {
    ball=getImage(getDocumentBase(),"ball.gif");
    afbeelding= getImage( getDocumentBase(),"mallow.gif");
    appBreedte=getSize().width;
    appHoogte=getSize().height;
    achtergrond = new Achtergrond(appBreedte,appHoogte);
  }

  public void start() {
    if(man==null) {
    setVisible(true);
    man = new Mannetje(getGraphics(),gBuffer,50,150,20,20,afbeelding,this);
    man.start();
    }
    if(vijand==null) {
    vijand=new Mannetje(getGraphics(),gBuffer,350,150,20,20,afbeelding,this);
    vijand.start();
    }
    if(balletje==null) {
    balletje=new Bal(getGraphics(),5,ball,this);
    balletje.start();
    }
  }

  public void stop() {
    if (man != null) {
    man.stop();
    man=null;
    }
    if (vijand != null) {
    vijand.stop();
    vijand=null;
    }
    if (balletje != null) {
    balletje.stop();
    balletje=null;
    }
  }

  public boolean keyDown(Event e, int key)
    {
    switch(key)
    {
      case Event.DOWN:  if(man.y()+man.lengte()<=achtergrond.ygrens2()) {
                    repaint();
                    man.sety(steps);
                  }
                  break;
      case Event.UP:    if(man.y()-man.lengte()>=achtergrond.ygrens1()) {
                    repaint();
                    man.sety(-steps);
                  }
                  break;
      case Event.RIGHT: if(man.x()+man.breedte()<=achtergrond.xgrens()) {
                    repaint();
                    man.setx(steps);
                  }
                  break;
      case Event.LEFT:  if(man.x()-man.breedte()>=0) {
                    repaint();
                    man.setx(-steps);
                  }
                  break;
    }
    return true;
    }

  public void update(Graphics g)
    {
 if (buffer==null ||
            (! (buffer.getWidth(this) == appBreedte
            && buffer.getHeight(this) == appHoogte)))
      {
      buffer = this.createImage(getSize().width, getSize().height);
      }

    gBuffer = buffer.getGraphics();

    paint(gBuffer);    
g.drawImage(buffer, 0, 0, this);
    }

  public void paint(Graphics g) {
  }
}

class Achtergrond
{
  private int breedte, hoogte;

  public Achtergrond(int breedte, int hoogte)
  {
    this.breedte=breedte;
    this.hoogte=hoogte;
  }

  public void teken(Graphics g2)
  {
    g2.setColor(Color.blue);
    g2.fillRect(0,0,breedte,150); // De Lucht
    g2.setColor(Color.yellow);
    g2.fillRect(0,hoogte-190,breedte,150); // Het zand
    g2.setColor(Color.orange);
    g2.fillRect(0,hoogte-230,breedte,40);
    g2.fillRect(0,hoogte-40,breedte,40); // Rand
    g2.setColor(Color.white);
    g2.fillRect( (breedte/2)-5,hoogte-230,10,230); // Paal
  }

  public int xgrens() {
    return ((breedte/2)-5);
  }

  public int ygrens1() {
    return (hoogte-190);
  }

  public int ygrens2() {
    return (hoogte-40);
  }
}

class Mannetje extends Thread
{
  public Graphics g;
  public Graphics gBuffer;
  private int x, y, lengte, breedte;
  private Image afbeelding;
  private Thread thread;
  Applet theApplet;

    public Mannetje(Graphics g, Graphics gBuffer,int x, int y, int lengte, int breedte, Image afbeelding, Applet theApplet)
    {
    this.g=g;
    this.gBuffer=gBuffer;
    this.x=x;
    this.y=y;
    this.breedte=breedte;
    this.lengte=lengte;
    this.afbeelding=afbeelding;
    this.theApplet=theApplet;
    }

    public void teken()
    {
    gBuffer.drawImage(afbeelding, x, y, 20, 20,theApplet);
    }

    public void setx(int temp)
    {
    x +=temp;
    }

    public void sety(int temp)
    {
    y +=temp;
    }

    public void run() {
    while(true) {
      teken();
      //sleep(10);
    }
    }

    public void sleep(int millisec)
    {
    try{ Thread.sleep(millisec); }
    catch( InterruptedException e) {}
    }

    public int lengte() {
    return lengte;
    }

    public int breedte() {
    return breedte;
    }

    public int x() {
    return x;
    }

    public int y() {
    return y;
    }
  }

  class Bal extends Thread
{
  private Graphics g;
  private double y, dy=1, x, dx=1;
  private int grootte;
  private Image ball;
  private Applet theApplet;

  public Bal(Graphics g, int grootte, Image ball, Applet theApplet)
  {
    this.g=g;
    this.grootte=grootte;
    this.ball=ball;
    this.theApplet=theApplet;
  }

  public void teken()
  {
    //g.drawImage(ball, (int)x, (int)Math.round(y), grootte, grootte, theApplet);
    g.drawImage(ball, 10, 10, 50, 50, theApplet);
  }

  public void run()
  {
    x=10;
    y=40;
    //sleep(1000);

    while (true)
    {
    x=x+dx;
    y=y+dy;
    if (y >= 300)
      dy--;
    //theApplet.repaint();
    }
  }

Verwijderd

Is niet slim om update(Graphics g) te overriden, omdat die gecontroleerd wordt door je omgeving. Bij double buffering is het juist de truck zelf controle te krijgen over je teken-operaties. Je kunt daarom beter een Canvas extenden en daarin de paint(Graphics g) overriden, als je dit Canvas toevoegd aan je applicatie gaat het altijd goed. Verder maak je dan een thread aan die paint op jouw commando aanroept (Bijvoorbeeld elke 10 ms).

  • Darius
  • Registratie: Juli 2001
  • Nu online
Op woensdag 09 januari 2002 14:02 schreef jRobert het volgende:
Is niet slim om update(Graphics g) te overriden, omdat die gecontroleerd wordt door je omgeving. Bij double buffering is het juist de truck zelf controle te krijgen over je teken-operaties. Je kunt daarom beter een Canvas extenden en daarin de paint(Graphics g) overriden, als je dit Canvas toevoegd aan je applicatie gaat het altijd goed. Verder maak je dan een thread aan die paint op jouw commando aanroept (Bijvoorbeeld elke 10 ms).
Dus, moet iets doen van mannetje implements runnable & extends canvas (wat is eigenlijk de syntax hiervoor, ben nog een newbie :) )

Dan moet ik een functie mannetje.paint(graphics gBuffer) aanmaken. Klopt dit allemaal?

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Op woensdag 09 januari 2002 14:06 schreef Darius het volgende:

[..]

Dus, moet iets doen van mannetje implements runnable & extends canvas (wat is eigenlijk de syntax hiervoor, ben nog een newbie :) )
public class Mannetje extends Canvas implements runnable

  • Darius
  • Registratie: Juli 2001
  • Nu online
Op woensdag 09 januari 2002 14:10 schreef wasigh het volgende:

[..]

public class Mannetje extends Canvas implements runnable
Dat was best wel voor de hand liggend :)

  • Darius
  • Registratie: Juli 2001
  • Nu online
Ok, ik heb de klasse man veranderd in als volgt :
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
class Mannetje extends Canvas implements Runnable
{
  public Graphics g;
  public Graphics gBuffer;
  private int x, y, lengte, breedte;
  private Image afbeelding;
  private Thread thread;
  Applet theApplet;

    public Mannetje(Graphics g, Graphics gBuffer,int x, int y, int lengte, int breedte, Image afbeelding, Applet theApplet)
    {
    this.g=g;
    this.gBuffer=gBuffer;
    this.x=x;
    this.y=y;
    this.breedte=breedte;
    this.lengte=lengte;
    this.afbeelding=afbeelding;
    this.theApplet=theApplet;
    }

    public void start() {
    if (thread==null) {
      thread=new Thread(this);
      thread.start();
    }
    }

    public void run() {
    while(true) {
      repaint();
      //sleep(10);
    }
    }

    public void stop() {
    if(thread!=null) {
      thread.stop();
      thread=null;
    }
    }

    public void paint(Graphics g) {
    g.drawImage(afbeelding, x, y, 20, 20,theApplet);
    }

    public void setx(int temp)
    {
    x +=temp;
    }

    public void sety(int temp)
    {
    y +=temp;
    }

    public void sleep(int millisec)
    {
    try{ Thread.sleep(millisec); }
    catch( InterruptedException e) {}
    }

    public int lengte() {
    return lengte;
    }

    public int breedte() {
    return breedte;
    }

    public int x() {
    return x;
    }

    public int y() {
    return y;
    }
  }class Mannetje extends Canvas implements Runnable
{
  public Graphics g;
  public Graphics gBuffer;
  private int x, y, lengte, breedte;
  private Image afbeelding;
  private Thread thread;
  Applet theApplet;

    public Mannetje(Graphics g, Graphics gBuffer,int x, int y, int lengte, int breedte, Image afbeelding, Applet theApplet)
    {
    this.g=g;
    this.gBuffer=gBuffer;
    this.x=x;
    this.y=y;
    this.breedte=breedte;
    this.lengte=lengte;
    this.afbeelding=afbeelding;
    this.theApplet=theApplet;
    }

    public void start() {
    if (thread==null) {
      thread=new Thread(this);
      thread.start();
    }
    }

    public void run() {
    while(true) {
      repaint();
      //sleep(10);
    }
    }

    public void stop() {
    if(thread!=null) {
      thread.stop();
      thread=null;
    }
    }

    public void paint(Graphics g) {
    g.drawImage(afbeelding, x, y, 20, 20,theApplet);
    }

    public void setx(int temp)
    {
    x +=temp;
    }

    public void sety(int temp)
    {
    y +=temp;
    }

    public void sleep(int millisec)
    {
    try{ Thread.sleep(millisec); }
    catch( InterruptedException e) {}
    }

    public int lengte() {
    return lengte;
    }

    public int breedte() {
    return breedte;
    }

    public int x() {
    return x;
    }

    public int y() {
    return y;
    }
  }

Maar hij drukt niks op het scherm af :( Weet iemand waar dit aan zou kunnen liggen (canvas is een nieuw begrip voor me en deze schoolboek voor me is waardeloos).

Verwijderd

Hmmm...
Ik zou doen:
Bij de variabelen bovenaan om te beginnen een Image maken die buffer heet.
gBuffer niet in de constructor krijgen maar iets doen als
code:
1
2
buffer = this.createImage(getSize().width, getSize().height);
gBuffer = buffer.getGraphics

Correct me if I'm wrong maar volgens zou dit het wel doen...
edit:

typo

  • Darius
  • Registratie: Juli 2001
  • Nu online
Op woensdag 09 januari 2002 14:35 schreef DeadEnd het volgende:
Hmmm...
Ik zou doen:
Bij de variabelen bovenaan om te beginnen een Image maken die buffer heet.
gBuffer niet in de constructor krijgen maar iets doen als
code:
1
2
buffer = this.createImage(getSize().width, getSize().height);
gBuffer = buffer.getGraphics

Correct me if I'm wrong maar volgens zou dit het wel doen...
edit:

typo
Je bedoelt bij init() ? Maar dat trekt ie juist niet. Dan gaat ie klagen bij gBuffer=buffer.getGraphics(), dan is buffer nog leeg.

  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

je werkt met een applet?

  • Darius
  • Registratie: Juli 2001
  • Nu online
yep

Verwijderd

Probleem komt me bekend voor. Ik heb het ooit eens opgelost, niet in een applet, maar in een "gewoon" programmatje. FF naar de code zoeken.
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
public class A
{
      BufferedImage offscreenImg;
    Graphics2D offscreenG;

    public A()
    {}

    public void update(Graphics g)
    {
        paint(g);
    }

    public void paint(Graphics g)
    {
        // Er wordt een Graphics2D object gemaakt. Dit zorgt ervoor dat je meer
        // mogelijkheden hebt om de graphics te manipuleren. Het is niet essentieel
        // voor de werking, met een gewoon graphics object zou het ook werken, maar
        // dan kun je geen gebruik maken van de BufferedImage (zie verder).
        Graphics2D g2 = (Graphics2D) g;

        // Eerst wordt er een offscreen image gemaakt waarop alles wordt getekend.
        // Deze if zorgt ervoor dat er een hoop snelheidswinst wordt behaald.
        if(offscreenImg == null)
        {
            offscreenImg = (BufferedImage)createImage(400, 400);
            offscreenG = offscreenImg.createGraphics();
        }

        // Alles wordt nu op het onzichtbare plaatje getekend.
        offscreenG.fillRect(0,0,400,400);
        offscreenG.enz...
        
        // Andere class update aanroepen met offscreenG ipv g
        b.update(offscreenG);

        // Uiteindelijk wordt het plaatje op de voorgrond getekend. Omdat g2 hier het
        // beeldscherm voorstelt moet de drawImage daar ook op toegepast worden.
        g2.drawImage(offscreenImg, 0, 0, this); 
    }
}

Misschien dat je hier iets verder mee kunt.

Succes.

Verwijderd

Sorry voor mn domme reactie, had je lange code niet goed gelezen |:(
Ok nu es kijken of ik iets slims kan zeggen ;)
In je paint methode van mannetje paint ie wel ergens mee, maar niet met de variabele gBuffer, en volgens mij was dat de bedoeling, dus ik zou proberen update() te overriden tot iets als:
code:
1
2
3
public void update() {
   repaint(gBuffer);
}

Maar ja, ik zie nu vast weer iets niet goed :P

  • Darius
  • Registratie: Juli 2001
  • Nu online
Bedankt mensen, ik ben eruit. Mij (goed werkende) code ziet er nu als volgt uit :
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
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
package spel;

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

public class Applet2 extends Applet
{
  private Achtergrond achtergrond;
  private Mannetje man, vijand;
  private int steps=5, appBreedte, appHoogte;
  private Image afbeelding, ball, buffer;
  private Graphics gBuffer;
  private Bal balletje;

  public void init()
  {
    ball=getImage(getDocumentBase(),"ball.gif");
    afbeelding= getImage( getDocumentBase(),"mallow.gif");
    appBreedte=getSize().width;
    appHoogte=getSize().height;
    achtergrond = new Achtergrond(appBreedte,appHoogte);
    man = new Mannetje(gBuffer,50,150,20,20,afbeelding,this);
  }

  public void start() {
      man.start();
  }

  public void stop() {
    man.stop();
  }

  public boolean keyDown(Event e, int key)
    {
    switch(key)
    {
      case Event.DOWN:  if(man.y()+man.lengte()<=achtergrond.ygrens2()) {
                    //repaint();
                    man.sety(steps);
                  }
                  break;
      case Event.UP:    if(man.y()-man.lengte()>=achtergrond.ygrens1()) {
                    //repaint();
                    man.sety(-steps);
                  }
                  break;
      case Event.RIGHT: if(man.x()+man.breedte()<=achtergrond.xgrens()) {
                    //repaint();
                    man.setx(steps);
                  }
                  break;
      case Event.LEFT:  if(man.x()-man.breedte()>=0) {
                    //repaint();
                    man.setx(-steps);
                  }
                  break;
    }
    return true;
    }

  public void update(Graphics g) {
    achtergrond.paint(gBuffer);
    man.paint(gBuffer);
    g.drawImage(buffer,0,0,this);
  }

  public void paint(Graphics g) {
    if(buffer == null) {
    buffer=createImage(getSize().width,getSize().height);
    gBuffer=buffer.getGraphics();
    }
  }
}

class Achtergrond extends Canvas
{
  private int breedte, hoogte;

  public Achtergrond(int breedte, int hoogte)
  {
    this.breedte=breedte;
    this.hoogte=hoogte;
  }

  public void paint(Graphics g)
  {
    g.setColor(Color.blue);
    g.fillRect(0,0,breedte,150); // De Lucht
    g.setColor(Color.yellow);
    g.fillRect(0,hoogte-190,breedte,150); // Het zand
    g.setColor(Color.orange);
    g.fillRect(0,hoogte-230,breedte,40);
    g.fillRect(0,hoogte-40,breedte,40); // Rand
    g.setColor(Color.white);
    g.fillRect( (breedte/2)-5,hoogte-230,10,230); // Paal
  }

  public int xgrens() {
    return ((breedte/2)-5);
  }

  public int ygrens1() {
    return (hoogte-190);
  }

  public int ygrens2() {
    return (hoogte-40);
  }
}

class Mannetje extends Canvas implements Runnable
{
  public Graphics gBuffer;
  private int x, y, lengte, breedte;
  private Image afbeelding;
  private Thread thread;
  Applet theApplet;

    public Mannetje(Graphics gBuffer,int x, int y, int lengte, int breedte, Image afbeelding, Applet theApplet)
    {
    this.gBuffer=gBuffer;
    this.x=x;
    this.y=y;
    this.breedte=breedte;
    this.lengte=lengte;
    this.afbeelding=afbeelding;
    this.theApplet=theApplet;
    }

    public void start() {
    if (thread==null) {
      thread=new Thread(this);
      thread.start();
    }
    }

    public void run() {
    while(true) {
      repaint();
      sleep(100);
    }
    }

    public void stop() {
    if(thread!=null) {
      thread.stop();
      thread=null;
    }
    }

    public void paint(Graphics g) {
    g.drawImage(afbeelding, x, y, 20, 20,theApplet);
    }

    public void setx(int temp)
    {
    x +=temp;
    }

    public void sety(int temp)
    {
    y +=temp;
    }

    public void sleep(int millisec)
    {
    try{ Thread.sleep(millisec); }
    catch( InterruptedException e) {}
    }

    public int lengte() {
    return lengte;
    }

    public int breedte() {
    return breedte;
    }

    public int x() {
    return x;
    }

    public int y() {
    return y;
    }
  }

  class Bal extends Thread
{
  private Graphics g;
  private double y, dy=1, x, dx=1;
  private int grootte;
  private Image ball;
  private Applet theApplet;

  public Bal(Graphics g, int grootte, Image ball, Applet theApplet)
  {
    this.g=g;
    this.grootte=grootte;
    this.ball=ball;
    this.theApplet=theApplet;
  }

  public void teken()
  {
    //g.drawImage(ball, (int)x, (int)Math.round(y), grootte, grootte, theApplet);
    g.drawImage(ball, 10, 10, 50, 50, theApplet);
  }

  public void run()
  {
    x=10;
    y=40;
    //sleep(1000);

    while (true)
    {
    x=x+dx;
    y=y+dy;
    if (y >= 300)
      dy--;
    //theApplet.repaint();
    }
  }
}

Hij werkt nu vloeiend :). Bedankt aan iedereen die me hebben geholpen met dit (volgens mij veel voorkomende) probleem.

  • Darius
  • Registratie: Juli 2001
  • Nu online
Ik heb een stukje van de code nu veranderd en zit weer met een probleem. veranderde code is als volgt :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public void update(Graphics g) {
    if(buffer == null) {
    buffer=createImage(getSize().width,getSize().height);
    gBuffer=buffer.getGraphics();
    }
    achtergrond.paint(gBuffer);
    man.paint(gBuffer);
    balletje.paint(gBuffer);
    g.drawImage(buffer,0,0,this);
    //gBuffer.drawImage(ball, 30, 30, 10, 10, this);
  }

  public void paint(Graphics g) {
    //g.fillRect(1,1,10,10);
    //g.drawImage(buffer,0,0,this);
    //g.drawImage(ball, 50, 30, 10, 10, this);
  }
}

Hierbij drukt ie niks op het scherm af. Weet iemand hoe dit kan?

Als ik het code in als volgt verander :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public void update(Graphics g) {
    if(buffer == null) {
    buffer=createImage(getSize().width,getSize().height);
    gBuffer=buffer.getGraphics();
    }
    achtergrond.paint(gBuffer);
    man.paint(gBuffer);
    balletje.paint(gBuffer);
    //g.drawImage(buffer,0,0,this);
    paint(g);
    //gBuffer.drawImage(ball, 30, 30, 10, 10, this);
  }

  public void paint(Graphics g) {
    g.drawImage(buffer,0,0,this);
    //g.fillRect(1,1,10,10);
    //g.drawImage(buffer,0,0,this);
    //g.drawImage(ball, 50, 30, 10, 10, this);
  }
}

Krijg ik volop null pointer fouten. Weet iemand wat ik hier het beste kan doen?

Verwijderd

Wordt update(Graphics) wel aangeroepen met de goede graphics? Ik bedoel hoe zit het met de rest van je code? (Ik bedoel de bovenste nu)

Verwijderd

Hierbij drukt ie niks op het scherm af. Weet iemand hoe dit kan?
Waarschijnlijk omdat je dan nog niets op/in je buffer hebt getekend :?.
Krijg ik volop null pointer fouten. Weet iemand wat ik hier het beste kan doen?
Probeer het eens zo :
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void update(Graphics g) 
  {
    paint(g);
  }

  public void paint(Graphics g) 
  {
    if(buffer == null) {
    buffer=createImage(getSize().width,getSize().height);
    gBuffer=buffer.getGraphics();
    }
    achtergrond.paint(gBuffer);
    man.paint(gBuffer);
    balletje.paint(gBuffer);
    g.drawImage(buffer,0,0,this);
  }
}

Moet werken denk ik...

  • Darius
  • Registratie: Juli 2001
  • Nu online
heb ik gedaan. Bedankt voor de tip.
Pagina: 1