Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

06.02.2014, 13:00

Java: NullPointerException beim benutzen von getDrawGraphics()

Hallo liebe Community!
Da ich nun meiner Meinung nach genug Grundkenntnisse in Java gesammelt hab um mich an der Spieleprogrammierung zu versuchen, habe ich mir dazu mal ein Buch gekauft.
(Hierbei möchte ich erwähnen dass dieses Buch sehr alt ist und der Code in Java 1.4 geschrieben ist) Nun habe ich schon einiges ausprobiert und gelesen aber hänge jetzt fest bei dem ausgeben einer Animation mit BufferStrategy. Folgenden Code habe ich schon:

Hauptklasse:

Quellcode

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
import java.awt.Color;
import java.awt.DisplayMode;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Window;
import java.awt.image.BufferStrategy;

import javax.swing.ImageIcon;
import javax.swing.JFrame;


public class ImageTest{
    
    private static final long DEMO_TIME = 5000;
    
        private ScreenManager sm;
        private Animation prototype;
        
    public static void main(String[] args){ 
        
        DisplayMode dm = new DisplayMode(1600, 900, 16, 75);
        ImageTest imgt = new ImageTest();
        imgt.run(dm);
        
    }

    private void run(DisplayMode dm) {
        
        sm = new ScreenManager();
        
        try {
            
            dm = new DisplayMode( 1600, 900, 16, 75);
            sm.setFullscreen(dm, new JFrame());
            loadImages();
            animationLoop();
            
        }finally {
            
            sm.restoreScreen();
            
        }
        
    }

    private void animationLoop() {
        
        long startTime = System.currentTimeMillis();
        long currTime = startTime;
        
        while ( currTime - startTime < DEMO_TIME ){
            
            long elapsedTime = System.currentTimeMillis() - currTime ; 
            currTime += elapsedTime;
            
            prototype.update(elapsedTime);
            
            BufferStrategy strategy = sm.getFullScreenWindow().getBufferStrategy();
            Graphics g = strategy.getDrawGraphics();
            draw(g);
            g.dispose();
            strategy.show();
            
            try {
                
                Thread.sleep(20);
                
            }catch (InterruptedException e){}
            
        }
        
    }

    private void draw(Graphics g) {
        
        g.drawImage(prototype.getImage(), 0, 0, null);
        
    }

    private void loadImages() {
        
        Image prototype1 = loadImage("images/prototype1.png");
        Image prototype2 = loadImage("images/prototype2.png");
        Image prototype3 = loadImage("images/prototype3.png");
        
        prototype = new Animation();
        prototype.addFrame(prototype1, 250);
        prototype.addFrame(prototype2, 250);
        prototype.addFrame(prototype3, 250);
        
        
    }

    private Image loadImage(String path) {
        
        return new ImageIcon(path).getImage();
    }
    
}


ScreenManager Klasse:

Quellcode

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
import java.awt.DisplayMode;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Toolkit;
import java.awt.Window;
import java.awt.image.BufferStrategy;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;


public class ScreenManager {
    
    GraphicsEnvironment environment;
    GraphicsDevice device;
    
    public ScreenManager(){
        
        environment = GraphicsEnvironment.getLocalGraphicsEnvironment();
        device = environment.getDefaultScreenDevice();
        
    }
    
    public void setFullscreen( DisplayMode mode, JFrame frame){
    
        frame.setUndecorated(true);
        frame.setResizable(false);
        frame.setIgnoreRepaint(true);
        
        device.setFullScreenWindow(frame);
        
        if( mode != null && device.isDisplayChangeSupported()){
            
            try {
                
                device.setDisplayMode(mode);
                
            } catch (IllegalArgumentException e ){}
            
        }
        
    }

    public Window getFullScreenWindow(){
        
        return device.getFullScreenWindow();
            
        }
    
    public void restoreScreen(){
        
        Window w = getFullScreenWindow();
        
        if ( w != null ){
            
            w.dispose();
            
        }
        
        device.setFullScreenWindow(null);
        
    }
    
}


Animation Klasse

Quellcode

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
import java.awt.Image;
import java.util.ArrayList;

import javax.swing.ImageIcon;


public class Animation {
    
    private ArrayList animation;
    int currPic;
    long endTime;
    long currentTime;
    
    public Animation(){
        
        animation = new ArrayList();
        endTime = 0;
        start();
        
    }
    
    public void start(){
        
        currentTime = 0;
        currPic = 0;
        
    }
    
    private AnimFrame getFrame( int index ){
        
        return (AnimFrame)animation.get(index);
        
    }
    
    public synchronized void addFrame( Image img, long animTime ){
        
        endTime += animTime;
        
        animation.add(new AnimFrame( endTime , img));
        
    }
    
    private class AnimFrame {
        
        long animTime;
        Image img;
        
        private AnimFrame( long animTime, Image img ){
            
            this.img = img;
            this.animTime = animTime;
            
        }
        
    }
    
    public synchronized Image getImage(){
        
        if (animation.size() == 0){
            
            return null;
            
        }
        
        return getFrame(currPic).img;
        
    }
    
    public synchronized void update(long elapsedTime){
        
        if ( animation.size() > 1 ){
            
            currentTime += elapsedTime;
            
            if ( currentTime > endTime ){
                
                currentTime = currentTime % endTime; 
                currPic = 0;
                
            }
            
            while ( currentTime > getFrame(currPic).animTime ){
                
                    currPic++;
                
            
            }
        
        }
    
    }
}


Ich habe folgende Fehlermeldung:
Exception in thread "main" java.lang.NullPointerException
at ImageTest.animationLoop(ImageTest.java:61)
at ImageTest.run(ImageTest.java:38 )
at ImageTest.main(ImageTest.java:25)

Der Fehler scheint also bei getDrawGraphics() zu liegen. nun gehe ich davon aus dass mit der Methode keine Grafik bekommen werden konnte und deshalb die Exception geworfen wurde weil getDrawGraphics() auf nichts verweisen kann. Aber ich habe keinen Plan wie ich dies nun ändern könnte.
Würde mich über etwas Hilfe freuen!
:)

Tankard

Treue Seele

Beiträge: 192

Beruf: Student, Hardware- und Softwareentwicklung als wissenschaftliche Hilfskraft

  • Private Nachricht senden

2

06.02.2014, 13:58

Deine Fehlermeldung sagt aber, dass der Fehler in ImageTest.animationLoop liegt und nicht in getDrawGraphics(). Er sagt dir sogar welcher Fehler in welcher Zeile. In Zeile 61 von ImageTest.java greifst du auf einen Pointer zu, der auf null zeigt.

3

06.02.2014, 14:11

Ja das mein ich ja in Zeile 61 steht ja:

Quellcode

1
Graphics g = strategy.getDrawGraphics();

Am Loop an sich kann doch eigentlich nicht so viel falsch sein. Du hast ja auch gesagt in zeile 61 greif ich auf einen Pointer zu der auf null zeigt. Das müsste doch dann g sein weil es intern irgendwelche probleme mit getDrawGraphics() gibt. Oder?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

4

06.02.2014, 14:20

Das passiert, weil strategy==null ist.
Also liefert sm.getFullScreenWindow().getBufferStrategy(); null zurück.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

5

06.02.2014, 14:30

Nein.
Mit Zugriff ist in diesem Fall ein Zugriff auf einen Member oder eine Methode eines Objekts gemeint. Wenn kein Objekt vorhanden ist (sondern null), dann führt der Versuch eines solchen Zugriffs zu einer NullPointerException. Der einzige Zugriff dieser Art in dieser Zeile ist strategy.getDrawGraphics(), weshalb man darauf schließen kann, dass der Variabel strategy kein Objekt zugewiesen wurde. (In der Hinsicht kann man sich auf verschiedene Weisen vergewissern, dass das wirklich so ist, bspw. per Ausgaben auf dem Standardausgabestrom, per Debugger etc.

Warum versuchst du auf diese Weise an ein Graphics-Objekt zu kommen? Wenn ich irgendwas in Richtung Visualisierung mit Swing gemacht hatte, was sich nicht über die bereits fertigen elemente lösen ließ (auch wenn ich das bisher noch nicht für Spiele verwendet hatte), habe ich ein bereits vorhandenes Steuerelement (bspw. JPanel) erweitert und die entsprechende Methode überschrieben (die das Graphics-Objekt per Parameter übergeben bekommen hat).
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

06.02.2014, 14:40

Wieso "Nein."? Das ist in langer Form genau meine Aussage.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

06.02.2014, 14:44

Naja, an ein JPanel oder ähnliches habe ich bisher noch nicht gedacht denn ich hab gelesen dass BufferStrategy mehr Optionen bietet als beispielsweise paintComponent(). Eine davon ist z.B. die Synchronisation von Bildschirm refresh und Bild refresh ( ich meine damit da ja der Bildschirm auch eine refresh Rate hat kann man flackern durch die Synchronisation von dem eigentlichen Bild das erneuert wird und dem was der Bildschirm ausgibt vermeiden oder zumindest einschränken ) und ich weiß halt nicht ob das alles auch mit paintComponent erledigt werden kann.
Wenn ich das jetzt richtig verstanden hab liegt der Fehler darin dass die Methode getBufferStrategy auf nichts verweist (?). Kann mir denn jemand sagen was die Methode für Objekte erwartet?

8

06.02.2014, 14:45

@BlueCobold vielleicht war das Nein bezogen auf meine Frage.

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

06.02.2014, 15:42

Sie verweist auf etwas, gibt aber offensichtlich null zurück. Ich würde das so interpretieren, dass es keine BufferStrategy gibt ;)
Nach kurzem Google vermute ich mal, dass Du irgendwo ein createBufferStrategy(...) vergessen hast.

http://docs.oracle.com/javase/7/docs/api…rategy%28int%29
http://docs.oracle.com/javase/7/docs/api…rStrategy%28%29
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »BlueCobold« (06.02.2014, 15:47)


Sacaldur

Community-Fossil

Beiträge: 2 301

Wohnort: Berlin

Beruf: FIAE

  • Private Nachricht senden

10

06.02.2014, 15:57

Ich hatte nicht behauptet, dass das, was ich bisher gemacht habe, auch der Beste weg ist, sondern nur geschrieben, dass ich es für meine Fälle (wie bereits geschrieben: keine Spiele) bisher so verwendete.

Wieso "Nein."? Das ist in langer Form genau meine Aussage.
Weil es sich, wie bereits richtig vermutet, nicht auf deinen Beitrag bezieht. ;)
Spieleentwickler in Berlin? (Thema in diesem Forum)
---
Es ist ja keine Schande etwas falsch zu machen, als Programmierer tu ich das täglich, [...].

Werbeanzeige