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

29.05.2012, 19:17

[Java] Zeichnen von Images

Hey Leute,

ich übe gerade mit Java da ich es in meinen 6 Wöchigen Praktikum brauche. Lerne in der Schule erst nächstes Jahr Java. Dieses Jahr lernten wir C#.

Ich versuche gerade 2 Gifs zu zeichnen:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void paint(Graphics g)
    {
        image = createImage(getWidth(),getHeight());
        graphics = image.getGraphics();
        
        g.fillRect(0, 0, getWidth(), getHeight());
        
        paintComponent(graphics);
        g.drawImage(image, 0, 0, null);
        repaint();
    }
    
    public void paintComponent(Graphics g)
    {
        player1.draw(g);
        player2.draw(g);
    }


Er zeichnet nichts und ich bekomme auch leider kein Warning, keinen Error oder sonstwas.

Die Images sollte er ohne Probleme hier laden:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
public gamemain()
    {
        setTitle("Nyan's revenge!");
        setResizable(false);
        setSize(600,400);
        setBackground(Color.black);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        
        player1 = new Player(10,150,20,90,10,getImage("images/player1.gif"));
        player2 = new Player(570,150,20,90,10,getImage("images/player2.gif"));
    }


getImage:

Quellcode

1
2
3
4
private Image getImage(String img)
    {
        return Toolkit.getDefaultToolkit().getImage(img);
    }

2

29.05.2012, 21:40

Poste mal die komplette Klasse.
Ich denke du redest hier von Swing.
Du musst in "gamemain" noch dein Canvas setzen. Wie du das machst, findest du selbst raus, ich will ja nicht alles vorkauen :)

foreach

Frischling

Beiträge: 87

Beruf: Student

  • Private Nachricht senden

3

29.05.2012, 23:27

Warum überschreibst du paint und paintComponent und rufst paintComponent dann noch in paint, mit dem Graphics-Objekt deines Bildes auf?
Du solltest dringend mal die Dokumentation konsultieren. Auch soltest du dich mit den Konventionen (Formatierung/Namensgebung) immer möglichst früh, wenn du eine neue Sprache lernst, anfreunden, denn schlechte Angewohnheiten bekommt man später nur schwer wieder los. (Es sieht einfach besser aus wenn sich alle Programmierer an eine Konvention halten)

Zudem solltest du paint (bei Swingkomponenten) weder direkt aufrufen noch überschreiben, (Es sei denn du weißt was du tust) denn:

Zitat


paint

public void paint(Graphics g)

Invoked by Swing to draw components.
Applications should not invoke paint directly,
but should instead use the repaint method to
schedule the component for redrawing.

This method actually delegates the work of painting to three
protected methods: paintComponent,
paintBorder,
and paintChildren. They're called in the order
listed to ensure that children appear on top of component itself.
Generally speaking, the component and its children should not
paint in the insets area allocated to the border. Subclasses can
just override this method, as always. A subclass that just
wants to specialize the UI (look and feel) delegate's
paint method should just override
paintComponent.

Ich habe mir mal die Mühe gamacht eine fehlerhafte und eine korrekte Implementierung zu schreiben. Ich hoffe du lernst aus diesen Beispielen. Genaueres zu deinem Code kann ich noch nicht sagen, ohne die komplette Klasse gesehen zu haben. Aber am besten du arbeitest das offizielle Tutorial durch, da sollten alle Fragen beantworted und wertvolle Tipps gegeben werden.

Java-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import javax.swing.*;
import java.awt.*;

// naiver fehlerhafter Ansatz
// nicht threadsicher

public class MainNaiv extends JFrame {
    int i;
    
    public static void main(String args[]) {
        MainNaiv main = new MainNaiv();
        main.pack();
        main.setVisible(true);
    }
    
    // Man sieht wie die Linie nicht an der Position 0,0 im ContentPane beginnt,
    // sondern an der Position 0,0 des Fenserrahmens
    public void paint(Graphics g) {
        i ++;
        g.drawLine(0, 0, i, i);
        System.out.println(i);
    }
}


Java-Quelltext

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
import javax.swing.*;
import java.awt.*;

// robuster Ansatz

public class Main extends JFrame {
    
    public Main() {
        setDeafaultCloseOperation(EXIT_ON_CLOSE); // wenn das Fenster gaschlossen wird soll das Programm beendet werden
        setContentPane(new GPanel());
        pack();
        setVisible(true);
    }

    public static void main(String args[]) {
        // Swingkomponenten sollten nur im Event-Dispatch-Thread (EDT) erzeugt werden
        SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    Main main = new Main();
                    main.pack();
                    main.setVisible(true);                       
                }
            }
        );
    }
    
    private class GPanel extends JPanel {
        private int i;
        public void paintComponent(Graphics g) {
            i ++;
            g.drawLine(0, 0, i, i);
            System.out.println(i);
        }
    }
}

Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von »foreach« (30.05.2012, 10:00)


4

30.05.2012, 08:41

Hi,

danke schonmal für die Antworten.

Ich arbeite mit diesem Video-Tutorial: http://www.youtube.com/watch?v=wU4Lr2LpUiE

Bei Ihm funktioniert auch alles, nur bei mir nicht.

Meine Klassen:

gamemain:

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
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.JFrame;


public class gamemain extends JFrame {

    private static final long serialVersionUID = 1L;
    
    private Player player1;
    private Player player2;
    
    private Image image;
    private Graphics graphics;
    

    /**
     * @param args
     */
    public static void main(String[] args) {
        // Entry point of the game!
        
        new gamemain();
    }
    
    public gamemain()
    {
        setTitle("Nyan's revenge!");
        setResizable(false);
        setSize(600,400);
        setBackground(Color.black);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
        
        player1 = new Player(10,150,20,90,10,getImage("images/player1.gif"));
        player2 = new Player(570,150,20,90,10,getImage("images/player2.gif"));
    }
    
    public void paint(Graphics g)
    {
        image = createImage(getWidth(),getHeight());
        graphics = image.getGraphics();
        
        g.fillRect(0, 0, getWidth(), getHeight());
        
        paintComponent(graphics);
        g.drawImage(image, 0, 0, null);
        repaint();
    }
    
    public void paintComponent(Graphics g)
    {
        player1.draw(g);
        player2.draw(g);
    }
    
    private Image getImage(String img)
    {
        return Toolkit.getDefaultToolkit().getImage(img);
    }

    public Player getPlayer1() {
        return player1;
    }

    public void setPlayer1(Player player1) {
        this.player1 = player1;
    }

    public Player getPlayer2() {
        return player2;
    }

    public void setPlayer2(Player player2) {
        this.player2 = player2;
    }

    public Image getImage() {
        return image;
    }

    public void setImage(Image image) {
        this.image = image;
    }

    public Graphics getGraphics() {
        return graphics;
    }

    public void setGraphics(Graphics graphics) {
        this.graphics = graphics;
    }

}


GameObject:

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


public abstract class GameObject {

    protected Image img;
    
    protected int xPos;
    protected int yPos;
    protected int width;
    protected int height;
    protected int health;
    
    abstract void draw(Graphics g);
    abstract void update();
    
    public Image getImg() {
        return img;
    }

    public void setImg(Image img) {
        this.img = img;
    }

    public int getxPos() {
        return xPos;
    }

    public void setxPos(int xPos) {
        this.xPos = xPos;
    }

    public int getyPos() {
        return yPos;
    }

    public void setyPos(int yPos) {
        this.yPos = yPos;
    }

    public int getWidth() {
        return width;
    }

    public void setWidth(int width) {
        this.width = width;
    }

    public int getHeight() {
        return height;
    }

    public void setHeight(int height) {
        this.height = height;
    }
    
    public int getHealth() {
        return health;
    }

    public void setHealth(int health) {
        this.health = health;
    }
}


Player:

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

public class Player extends GameObject {
    
    /**
     * Creates the player
     * @param x
     * @param y
     * @param w
     * @param h
     * @param img
     */
    
    public Player(int x, int y, int w, int h, int health, Image img)
    {
        this.xPos = x;
        this.yPos = y;
        this.width = w;
        this.height = h;
        this.health = health;
        this.img = img;
    }
    
    @Override
    public void draw(Graphics g)
    {
        g.drawImage(img, xPos, yPos, width, height, null);
    }

    @Override
    void update() {
        
    }
}


Bullet (wird noch nicht verwendet):

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

public class Bullet extends GameObject {
    
    private int deltax;
    
    /**
     * Creates the Bullet(s)
     * @param x
     * @param y
     * @param w
     * @param h
     * @param img
     * @param health
     */
    public Bullet(int x, int y, int w, int h, Image img)
    {
        this.xPos = x;
        this.yPos = y;
        this.width = w;
        this.height = h;
        this.img = img;
    }
    
    @Override
    public void draw(Graphics g)
    {
        g.drawImage(img, xPos, yPos, width, height, null);
    }

    @Override
    void update() {
        
    }

    public int getDeltax() {
        return deltax;
    }

    public void setDeltax(int deltax) {
        this.deltax = deltax;
    }
}

foreach

Frischling

Beiträge: 87

Beruf: Student

  • Private Nachricht senden

5

30.05.2012, 10:42

Ich habe mir nicht die Mühe gemacht und mir das Tutorial angeschaut, aber wenn darin alles so bahandelt wird, wie du es umgesetzt hast, dann würde ich mir eine andere Quelle zum lernen suchen. Die Person, die dieses Tutorial erstellt hat besitzt wichtiges Grundlagenwissen nicht und sollte sich wohl noch genauer mit der Funktionsweise der Swingbibliothek auseinadersetzen. Am besten, du arbeitest das offizielle Tutorial durch, dass ich dir bereits in meinem ersten Post empfohlen habe.
Ich habe für dich die Fehler in deiner GameMain Klasse, so weit sich sie finden konnte behoben. So müsste es funktionieren:

Java-Quelltext

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
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

// Die Klasse erbt nicht mehr von JFrame sondern von JPanel, damit steigt
// der Grad an Wiederverwendbarkeit. Du könntest GameMain jetzt z.B. auch in
// ein Applet einfügen.
public class GameMain extends JPanel {

    private static final long serialVersionUID = 1L;
    
    private Player player1;
    private Player player2;
    
    private Image image;
    private Graphics graphics;
    

    /**
    * @param args
    */
    public static void main(String[] args) {
        // Swingkomponenten sollten nur im Event-Dispatch-Thread (EDT) erzeugt werden
        SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    GameMain gameMain = new GameMain();
                    JFrame frame = new JFrame();
                    // Du solltest, wie ich im vorherigen Beispiel gezeigt habe, nie direkt auf ein
                    // JFrame zeichnen, sondern immer mit dem ContentPane arbeiten!
                    frame.setContentPane(gameMain);
                    frame.setTitle("Nyan's revenge!");
                    frame.setResizable(false);
                    frame.pack(); // du hast pack vergessen
                    frame.setSize(600,400);
                    frame.setBackground(Color.black);
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setVisible(true);             
                }
            }
        );
    }
    
    public GameMain()
    {
        player1 = new Player(10,150,20,90,10,getImage("images/player1.gif"));
        player2 = new Player(570,150,20,90,10,getImage("images/player2.gif"));
    }
    
    public void paintComponent(Graphics g)
    {
        player1.draw(g);
        player2.draw(g);
    }
    
    private Image getImage(String img)
    {
        return Toolkit.getDefaultToolkit().getImage(img);
    }

    public Player getPlayer1() {
        return player1;
    }

    public void setPlayer1(Player player1) {
        this.player1 = player1;
    }

    public Player getPlayer2() {
        return player2;
    }

    public void setPlayer2(Player player2) {
        this.player2 = player2;
    }

    public Image getImage() {
        return image;
    }

    public void setImage(Image image) {
        this.image = image;
    }

    public Graphics getGraphics() {
        return graphics;
    }

    public void setGraphics(Graphics graphics) {
        this.graphics = graphics;
    }
}

Werbeanzeige