Toon posts:

[Java] probleempje met dubbele buffer

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig wat java te leren adhv. het boek 'Programmeren in Java 2' (uitgeverij Academic Service).
Dit boek is wel al enkele jaartjes oud, waardoor enkele methodes waarschijnlijk ondertussen al vervangen zullen zijn door nieuwere.

Nu ben ik bezig met een spelletje waarbij een object weggeworpen kan worden.
Op zich werkte dit allemaal prima, tot ik een achtergrondafbeelding wou gebruiken en dubbele buffering om het flikkeren tegen te gaan.

Het programmaatje (applet) werkt als volgt:
Main.java maakt een instantie van de klasse Spel.
Main.java toont Spel.

Spel.java is een klasse die de klasse Panel extendt.
In de klasse spel gebeurt alles wat te maken heeft met het spel zelf.
Wanneer ik echter een nieuw Graphics object maak en vervolgens Getgraphics() aanroep, dan loopt het mis. Mijn programma compilet perfect, maar mijn panel wordt niet getoond en de console geeft een NullPointerException naar de regel(22) die getgraphics aanroept...

Spel.java
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
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
public class Spel extends Frame implements Runnable{
    Thread spel;
    int[][] punt = new int[1][2];
    static double afstand = 0;
    static Graphics2D s; 
    static double tijd=-1d;
    static Image krijtje;
    static Image klas;
    static Tijd speltijd;
    static double snelheid = 10;
    static int tijdspel = 120; // Tijd die het spel mag duren
    static double grkrijt = 50;  // de grootte van het krijtje
    static double afstleerkr = 10; // de afstand waarop de leerkrachten zich bevinden
    static int score = 0; // houdt de score bij 
    static boolean alpunten=false; //houdt bij of dit krijtje al iets heeft geraakt!
    Image offscreenImage;
    Graphics offscreenImageG;
    Dimension d;
    public void init(){
            d = this.getSize ();
            offscreenImage = this.createImage ( d.width, d.height );
            offscreenImageG = offscreenImage.getGraphics (); // DIT GEEFT DE EXCEPTION
        speltijd = new Tijd(tijdspel); 
        start();
    }
    public Spel(String tekst, Image krijt, Image klasl){   // de afbeeldingen krijgen we doorgegeven van Main.java
        super(tekst);
           punt[0][0]=0;
        punt[0][1]=0;
        klas=klasl;
        krijtje = krijt;
        init();
    }
    public void paint(Graphics screen){
        offscreenImageG.drawImage(klas,0,0,this); // Dit zou de achtergrondafbeelding moeten tekenen
        s= (Graphics2D)offscreenImageG;
        s.drawImage(krijtje,200,200,100,100,null); // testobject om te raken
        if (punt!=null){
            if (afstand==0){
                s.drawImage(krijtje,punt[0][0],punt[0][1],50,50,null);
            }
            else {
                double grootte;
                grootte = Math.atan((grkrijt/10)/afstand); //Dit geeft een 3d effect
                grootte = grootte/(Math.PI/2);
                offscreenImageG.drawString("Grootte: "+(int)(grkrijt*grootte),50,110);
                s.drawImage(krijtje,punt[0][0],punt[0][1],(int)(grkrijt*grootte),(int)(grkrijt*grootte),null);
                    
            }
        }
        
        screen.drawImage(offscreenImage,0,0,this); // dubbele buffering: wordt nu weggeschreven naar scherm
    }


De code is nu nog een beetje wanordelijk, maar ik heb al een aantal dingen van volgorde en dergelijke zitten wijzigen om te testen of het dan wel werkte!

Weet iemand wat dit zou kunnen veroorzaken (ben ik ergens iets vergeten?), want ik heb wat zitten googlen en bijna alle sites gebruiken volgens mij dezelfde techniek voor dubbele buffering (swing uitgezonderd).

  • Remus
  • Registratie: Juli 2000
  • Laatst online: 15-08-2021
Uit de API:
public Image createImage(int width,
int height)

Creates an off-screen drawable image to be used for double buffering.

Parameters:
width - the specified width
height - the specified height
Returns:
an off-screen drawable image, which can be used for double buffering. The return value may be null if the component is not displayable. This will always happen if GraphicsEnvironment.isHeadless() returns true.
Since:
JDK1.0
See Also:
isDisplayable(), GraphicsEnvironment.isHeadless()
In andere woorden, je voldoet niet aan de voorwaarden om deze methode succesvol aan te roepen. Ik vond dit met 1 zoekopdracht en 3 klikjes in de java documentatie. Aangezien ik me verder niet echt verdiept heb in het grafische deel van Java, neem ik aan dat je vanaf hier weer verder kunt.

[ Voor 20% gewijzigd door Remus op 01-05-2005 12:16 ]


  • nxt
  • Registratie: November 2001
  • Laatst online: 04-02 09:36

nxt

als je offscreenImage.getGraphics () in de paint method aanroept ipv in de init method zou het goed moeten gaan.

Verwijderd

Topicstarter
getGraphics in paint aanroep bleek te werken.
Echter de regel getSize() gaf 0 terug voor zowel breedte als hoogte...
Blijkbaar kan ik in mijn panel geen geluiden laden of afbeeldingen... raar.

  • nxt
  • Registratie: November 2001
  • Laatst online: 04-02 09:36

nxt

Verwijderd schreef op maandag 02 mei 2005 @ 22:06:...Echter de regel getSize() gaf 0 terug voor zowel breedte als hoogte...
Dat komt omdat op het moment dat je de init method aanroept (vanuit de constructor) die informatie nog niet beschikbaar is (dwz, de width & height zijn nog 0).
De grootte veranderd pas nadat je ergens setSize(...) hebt aangeroepen of wanneer een layout manager de grootte heeft bepaald.
Het zou me dan ook niet verbazen als ook die method wel werkt binnen de paint method.