• Wir präsentieren Dir heute ein Stellenangebot für einen Frontend-Entwickler Angular / Java in Braunschweig. Hier geht es zur Jobanzeige

PNG als Spieler im Fenster anzeigen

M

morikay

Mitglied
Hallo, ich soll für die Uni ein kleines Spiel programmieren. Bin absoluter Anfänger und auch mein Code ist noch nicht besonders voll. Ich habe jetzt den Hintergrund für das Spiel erstellt und würde jetzt gerne mein Entenbild als Spieler anzeigen lassen. Kann mir jemand sagen warum das nicht funktioniert?
 

Anhänge

  • DuckRun.zip
    33,8 KB · Aufrufe: 3
mihe7

mihe7

Top Contributor
Naja, Du initialisierst die Variable duck in Canvas nicht, die ist also beim Zeichnen null.
 
Blender3D

Blender3D

Top Contributor
Hallo, ich soll für die Uni ein kleines Spiel programmieren. Bin absoluter Anfänger und auch mein Code ist noch nicht besonders voll.
Du solltest lernen, deinen Code besser zu strukturieren und vernünftiger Namen verwenden.
Die Klasse die das Spiel realisieren soll hat den Namen Canvas und erbt von der Klasse JFrame.
Oder deine Spielfigurklasse heißt Duck. Wenn in deinem Spiel ein Fisch verwendet wird kannst du diesen ebenfalls mit der Klasse Duck machen.
Ein besserer Name für die Klasse Duck wäre z.B. Sprite. So wird eine bewegliche Grafik bezeichnet.
Das Laden der Grafiken wird bei der Duckklasse im Konstruktor gemacht. Besser wäre es die notwendigen Grafiken bei Programmstart zu laden, da das Zeitintensiv ist und sonst bei der Animation zum ruckeln führen kann.
Ich poste dir einen strukturierteren Code als Beispiel.
Die Ente wird über den Bildschirm bewegt und prallt an den Rändern ab.
Die verwendeten Klassen:
Start --> ladet die Grafiken, erzeugt das Fenster, fügt das Spiel in das Fenster ein und startet das Programm
ImageLoader --> ladet benötigten Grafiken in den Speicher Achtung hier musst du den Pfad deiner Resourcen anpassen
DuckyGame --> das Spiel
Sprite --> bewegliche Grafik
1611596702295.png


Der Code hat ein großes Optimierungspotential. Versuche ihn zu starten und dann zu verstehen. Bei Fragen bitte hier posten.
Start:
import javax.swing.JFrame;

public class Start {
    public static void main(String[] args) {
        ImageLoader.loadImages(DuckyGame.names, "png"); // laed die Notwendigen Bilder
        JFrame frame = new JFrame("DuckyRun");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DuckyGame game = new DuckyGame();
        frame.add(game);
        frame.pack();
        frame.setResizable(false);
        frame.setLocation(10, 10);
        frame.setVisible(true);
        game.start();
    }
}
DuckyGame:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JComponent;

@SuppressWarnings("serial")
public class DuckyGame extends JComponent implements Runnable {
    public final static int WIDTH = 600;
    public final static int HEIGHT = 400;
    public final static String[] names = { "diddyDuck", "diddyDuck2" };
    private Sprite duck;
    private boolean running = false;
    private Thread aniamtor = null;

    public DuckyGame() {
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        duck = new Sprite(names[1], 50, 60);
        duck.setPos(100, 100);
        duck.setSpeed(.1f, 1f);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        drawBackGround(g);
        duck.draw(g);
    }

    private void drawBackGround(Graphics g) {
        g.setColor(new Color(184, 233, 236));
        g.fillRect(0, 0, WIDTH, HEIGHT / 2);
        g.setColor(new Color(135, 121, 74));
        g.fillRect(0, HEIGHT / 2, WIDTH, HEIGHT / 2);
    }

    @Override
    public void run() {
        while (running) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            updateGame();
            repaint();
        }
    }

    public void start() {
        stop();
        running = true;
        aniamtor = new Thread(this);
        aniamtor.start();
    }

    private void stop() {
        running = false;
        while (aniamtor != null && aniamtor.isAlive())
            ;
        aniamtor = null;
    }

    private void updateGame() {
        duck.move();
        duck.reflectAtBounds(WIDTH, HEIGHT);
    }

}
ImageLoader:
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import javax.imageio.ImageIO;

public class ImageLoader {
    public static String resourceDir = "./src/resources/"; // Hier den Pfad anpassen
    private final static HashMap<String, Image> images = new HashMap<String, Image>();

    public static Image get(String name) {
        return images.get(name);
    }

    public static Image getScaledImage(String name, int width, int height) {
        Image image = get(name);
        if (image == null)
            return null;
        if (image.getWidth(null) != width || image.getHeight(null) != height) {
            images.remove(name);
            image = image.getScaledInstance(width, height, Image.SCALE_SMOOTH);
            images.put(name, image);
        }
        return image;
    }

    public static void loadImages(String[] nameImages, String type) {
        for (String name : nameImages) {
            String fileName = resourceDir + name + "." + type;
            File file = new File(fileName);
            Image image = null;
            try {
                image = ImageIO.read(file);
                if (image != null)
                    images.put(name, image);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
Sprite:
import java.awt.Graphics;
import java.awt.Image;

public class Sprite {
    private String name;
    private Image image;
    private float x; // x Position
    private float y; // y Position
    private float dx; // Geschwindigkeit x Richtung
    private float dy;// Geschwindigkeit y Richtung

    public Sprite(String name, int width, int height) {
        this.name = name;
        image = ImageLoader.getScaledImage(name, width, height);
    }

    public void draw(Graphics g) {
        if (image != null)
            g.drawImage(image, (int) x, (int) y, null);
    }

    public float getX() {
        return x;
    }

    public float getY() {
        return y;
    }

    public void move() {
        x += dx;
        y += dy;
    }

    public void reflectAtBounds(int width, int height) {
        int maxX = width - image.getWidth(null);
        int maxY = height - image.getHeight(null);
        if (x < 0 || x > maxX) {
            dx = -dx;
            x = x < 0 ? 0 : maxX;
        }
        if (y < 0 || y > maxY) {
            dy = -dy;
            y = y < 0 ? 0 : maxY;
        }
    }

    public void setPos(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void setSpeed(float dx, float dy) {
        this.dx = dy;
        this.dy = dy;
    }

    @Override
    public String toString() {
        return String.format("%s <%.2f,%.2f>", name, x, y);
    }

}
 
M

morikay

Mitglied
Du solltest lernen, deinen Code besser zu strukturieren und vernünftiger Namen verwenden.
Die Klasse die das Spiel realisieren soll hat den Namen Canvas und erbt von der Klasse JFrame.
Oder deine Spielfigurklasse heißt Duck. Wenn in deinem Spiel ein Fisch verwendet wird kannst du diesen ebenfalls mit der Klasse Duck machen.
Ein besserer Name für die Klasse Duck wäre z.B. Sprite. So wird eine bewegliche Grafik bezeichnet.
Das Laden der Grafiken wird bei der Duckklasse im Konstruktor gemacht. Besser wäre es die notwendigen Grafiken bei Programmstart zu laden, da das Zeitintensiv ist und sonst bei der Animation zum ruckeln führen kann.
Ich poste dir einen strukturierteren Code als Beispiel.
Die Ente wird über den Bildschirm bewegt und prallt an den Rändern ab.
Die verwendeten Klassen:
Start --> ladet die Grafiken, erzeugt das Fenster, fügt das Spiel in das Fenster ein und startet das Programm
ImageLoader --> ladet benötigten Grafiken in den Speicher Achtung hier musst du den Pfad deiner Resourcen anpassen
DuckyGame --> das Spiel
Sprite --> bewegliche Grafik
Anhang anzeigen 14779

Der Code hat ein großes Optimierungspotential. Versuche ihn zu starten und dann zu verstehen. Bei Fragen bitte hier posten.
Start:
import javax.swing.JFrame;

public class Start {
    public static void main(String[] args) {
        ImageLoader.loadImages(DuckyGame.names, "png"); // laed die Notwendigen Bilder
        JFrame frame = new JFrame("DuckyRun");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        DuckyGame game = new DuckyGame();
        frame.add(game);
        frame.pack();
        frame.setResizable(false);
        frame.setLocation(10, 10);
        frame.setVisible(true);
        game.start();
    }
}
DuckyGame:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import javax.swing.JComponent;

@SuppressWarnings("serial")
public class DuckyGame extends JComponent implements Runnable {
    public final static int WIDTH = 600;
    public final static int HEIGHT = 400;
    public final static String[] names = { "diddyDuck", "diddyDuck2" };
    private Sprite duck;
    private boolean running = false;
    private Thread aniamtor = null;

    public DuckyGame() {
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        duck = new Sprite(names[1], 50, 60);
        duck.setPos(100, 100);
        duck.setSpeed(.1f, 1f);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        drawBackGround(g);
        duck.draw(g);
    }

    private void drawBackGround(Graphics g) {
        g.setColor(new Color(184, 233, 236));
        g.fillRect(0, 0, WIDTH, HEIGHT / 2);
        g.setColor(new Color(135, 121, 74));
        g.fillRect(0, HEIGHT / 2, WIDTH, HEIGHT / 2);
    }

    @Override
    public void run() {
        while (running) {
            try {
                Thread.sleep(10);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            updateGame();
            repaint();
        }
    }

    public void start() {
        stop();
        running = true;
        aniamtor = new Thread(this);
        aniamtor.start();
    }

    private void stop() {
        running = false;
        while (aniamtor != null && aniamtor.isAlive())
            ;
        aniamtor = null;
    }

    private void updateGame() {
        duck.move();
        duck.reflectAtBounds(WIDTH, HEIGHT);
    }

}
ImageLoader:
import java.awt.Image;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import javax.imageio.ImageIO;

public class ImageLoader {
    public static String resourceDir = "./src/resources/"; // Hier den Pfad anpassen
    private final static HashMap<String, Image> images = new HashMap<String, Image>();

    public static Image get(String name) {
        return images.get(name);
    }

    public static Image getScaledImage(String name, int width, int height) {
        Image image = get(name);
        if (image == null)
            return null;
        if (image.getWidth(null) != width || image.getHeight(null) != height) {
            images.remove(name);
            image = image.getScaledInstance(width, height, Image.SCALE_SMOOTH);
            images.put(name, image);
        }
        return image;
    }

    public static void loadImages(String[] nameImages, String type) {
        for (String name : nameImages) {
            String fileName = resourceDir + name + "." + type;
            File file = new File(fileName);
            Image image = null;
            try {
                image = ImageIO.read(file);
                if (image != null)
                    images.put(name, image);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
Sprite:
import java.awt.Graphics;
import java.awt.Image;

public class Sprite {
    private String name;
    private Image image;
    private float x; // x Position
    private float y; // y Position
    private float dx; // Geschwindigkeit x Richtung
    private float dy;// Geschwindigkeit y Richtung

    public Sprite(String name, int width, int height) {
        this.name = name;
        image = ImageLoader.getScaledImage(name, width, height);
    }

    public void draw(Graphics g) {
        if (image != null)
            g.drawImage(image, (int) x, (int) y, null);
    }

    public float getX() {
        return x;
    }

    public float getY() {
        return y;
    }

    public void move() {
        x += dx;
        y += dy;
    }

    public void reflectAtBounds(int width, int height) {
        int maxX = width - image.getWidth(null);
        int maxY = height - image.getHeight(null);
        if (x < 0 || x > maxX) {
            dx = -dx;
            x = x < 0 ? 0 : maxX;
        }
        if (y < 0 || y > maxY) {
            dy = -dy;
            y = y < 0 ? 0 : maxY;
        }
    }

    public void setPos(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void setSpeed(float dx, float dy) {
        this.dx = dy;
        this.dy = dy;
    }

    @Override
    public String toString() {
        return String.format("%s <%.2f,%.2f>", name, x, y);
    }

}
vielen Dank für die ausführliche Antwort! Ich werde das versuchen zu beherzigen und weiter am Projekt arbeiten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Erste Schritte Spieler an anderen Frame weitergeben Java Basics - Anfänger-Themen 23
L Einfaches Kartenspiel (Spieler Klasse) Java Basics - Anfänger-Themen 13
H Spieler bewegen :) Java Basics - Anfänger-Themen 6
I Spieler Name eintragen und Random Gewinner Java Basics - Anfänger-Themen 4
J Spieler bewegen Java Basics - Anfänger-Themen 3
TheKing Spieler Position mit Array vergleichen Java Basics - Anfänger-Themen 2
T Blobby Volley Spieler schreiben Java Basics - Anfänger-Themen 4
Thomathy Interface Wie schließt man ein anderes JFrame Fenster? Java Basics - Anfänger-Themen 6
S JOptionPane komplett leeres Fenster Java Basics - Anfänger-Themen 4
A Eclipse-Fenster starten statt Konsoleausgabe Java Basics - Anfänger-Themen 2
A Fenster bleibt weiß Java Basics - Anfänger-Themen 7
O Fenster programmieren Java Basics - Anfänger-Themen 2
M JavaFX: Fenster bleibt weiß Java Basics - Anfänger-Themen 3
A Fenster programmieren Java Basics - Anfänger-Themen 1
J JFrame Fenster öffnet sich nicht Java Basics - Anfänger-Themen 7
M aus Fenster anderes Fenster öffnen und wieder umgekehrt Java Basics - Anfänger-Themen 5
J Best Practice DOS Fenster mit Befehlszeile (Lösung) Java Basics - Anfänger-Themen 2
J Fenster wieder unsichtbar machen Java Basics - Anfänger-Themen 2
das_leon Gesamtes Programm in einem Fenster Java Basics - Anfänger-Themen 1
E Knopfdruck neues Fenster öffnen Java Basics - Anfänger-Themen 5
A Fenster mit Button aufrufen Java Basics - Anfänger-Themen 3
D Erste Schritte JPanel verschiebt Fenster via setVisible Java Basics - Anfänger-Themen 5
W Es wird erst gezeichnet, wenn ich das Fenster vergrößere? Java Basics - Anfänger-Themen 20
K Interface Fenster mit 3 ComboBoxen und 1 Button Java Basics - Anfänger-Themen 13
P Erste Schritte durch MenuBar verschiedene Fenster öffnen Java Basics - Anfänger-Themen 2
I Fenster A soll Fenster B schliessen Java Basics - Anfänger-Themen 5
D Java Fenster blockiert ? Java Basics - Anfänger-Themen 5
K Erste Schritte Neues Fenster mit Textinhalt öffnen Java Basics - Anfänger-Themen 6
M Code um per jButton ein neues Fenster zu öffnen Java Basics - Anfänger-Themen 3
A Popup-Fenster Java Basics - Anfänger-Themen 1
L Fenster auf Knopfdruck Java Basics - Anfänger-Themen 3
N Problem mit JOptionPane und Fenster-Fokus Java Basics - Anfänger-Themen 2
J ausgaben von der konsole in das fenster Java Basics - Anfänger-Themen 5
O Finally beim Fenster schliessen Java Basics - Anfänger-Themen 3
F Klassen Zugriff auf Fenster aus versch. Klassen Java Basics - Anfänger-Themen 5
P Eigenes Fenster erstellen Java Basics - Anfänger-Themen 5
M Input/Output Text auf Fenster zeichen Java Basics - Anfänger-Themen 2
T Zu viele Fenster - HILFE! Java Basics - Anfänger-Themen 5
J Extra Fenster (Frame) Java Basics - Anfänger-Themen 20
llabusch Fenster per Button verschieben Java Basics - Anfänger-Themen 5
llabusch Fenster um x Pixel verschieben Java Basics - Anfänger-Themen 4
P Window Builder Reiter im Fenster erstellen Java Basics - Anfänger-Themen 7
S Java Fenster Java Basics - Anfänger-Themen 2
D (zwei) Fenster mit unterschiedlicher Befüllung Java Basics - Anfänger-Themen 11
A JAVA Fenster in ein PDF Konvertieren Java Basics - Anfänger-Themen 1
A Erkennung eines Button im aktiven Fenster Java Basics - Anfänger-Themen 2
B Variable im Fenster anzeigen lassen? Java Basics - Anfänger-Themen 2
S Fenster ist zu groß Java Basics - Anfänger-Themen 8
O GUI: Eigene Fenster "Form"? Java Basics - Anfänger-Themen 13
X JFrame Fenster einzeln schließen Java Basics - Anfänger-Themen 2
E Fehlermeldung und Fenster wird nicht mehr angezeigt Java Basics - Anfänger-Themen 12
I Einlese Abfrage zweier Variablen in einem Fenster Java Basics - Anfänger-Themen 6
F Erste Schritte Aktuelles Fenster durch Event schließen Java Basics - Anfänger-Themen 3
N Java Programm im CMD Fenster öffnen, wie? Java Basics - Anfänger-Themen 17
S Erste Schritte Fenster wechsel im Applet Java Basics - Anfänger-Themen 7
tuttle64 Keine Umlaute im Dos Fenster Java Basics - Anfänger-Themen 12
J Button nimmt das komplette Fenster ein?! Java Basics - Anfänger-Themen 5
M Beim Klicken auf X neues Fenster Java Basics - Anfänger-Themen 4
Athena Schlichtes Fenster mit Windowskomponenten Java Basics - Anfänger-Themen 3
H KeyListener auf ganzes Fenster setzen Java Basics - Anfänger-Themen 14
S Neues Fenster auf Knopfdruck Java Basics - Anfänger-Themen 12
J Button drücken neues Fenster?! Java Basics - Anfänger-Themen 5
A Login Fenster Java Basics - Anfänger-Themen 3
C Button - neues Fenster - Bestellung anzeigen Java Basics - Anfänger-Themen 10
Z GUI-Fenster leeren Java Basics - Anfänger-Themen 5
M Erste Schritte Probleme mit Fenster Schließen Java Basics - Anfänger-Themen 6
J ordentliche Fenster Java Basics - Anfänger-Themen 17
J Problem beim Fenster Java Basics - Anfänger-Themen 4
Z Login Fenster Java Basics - Anfänger-Themen 7
K Aus JFrame-Fenster SuM-Fenster öffnen geht nicht! Java Basics - Anfänger-Themen 8
T Client-Fenster bei Aufruf unvollständig Java Basics - Anfänger-Themen 12
O Größeres Fenster als angegeben?! Java Basics - Anfänger-Themen 2
J Eltern-Fenster ermitteln Java Basics - Anfänger-Themen 2
M Ausklappbares Fenster bei grafischem Taschenrechner Java Basics - Anfänger-Themen 2
V Fenster wird nicht mittig platziert Java Basics - Anfänger-Themen 3
P gui fenster nur einmal aufrufen Java Basics - Anfänger-Themen 5
P Im Fenster bleiben (swing) Java Basics - Anfänger-Themen 16
J Werte ins neue Fenster übertragen Java Basics - Anfänger-Themen 6
S Fenster richtig schließen Java Basics - Anfänger-Themen 8
M Einfacher Fenster-Ablauf Java Basics - Anfänger-Themen 5
M Timer-Thread in Swing öffnet jedes Mal ein neues Fenster Java Basics - Anfänger-Themen 6
J Zweimal im gleichen Paint-Fenster malen Java Basics - Anfänger-Themen 8
SexyPenny90 Wie erstelle ich ein extra Fenster mit einer Meldung Java Basics - Anfänger-Themen 2
S nur neu geöffnetes Fenster schließen Java Basics - Anfänger-Themen 3
J Willkürlich geöffnetes Fenster/Dialog anspielen? Java Basics - Anfänger-Themen 3
M OOP GUI - Fenster vererben? Java Basics - Anfänger-Themen 9
T fenster schliesen und mouse events in einer nicht abstrakten klasse Java Basics - Anfänger-Themen 6
M Erste Schritte Fenster Und VB Funktionen Java Basics - Anfänger-Themen 8
G Scrollbares Fenster bei mehr als 5 Objekten Java Basics - Anfänger-Themen 4
L Fenster winzig klein durch GridBagLayout Java Basics - Anfänger-Themen 3
R Welcher Layout Manager-für so ein Fenster? Java Basics - Anfänger-Themen 5
H Java-Fenster ohne Inhalt Java Basics - Anfänger-Themen 2
T Windows Fenster Schließen Java Basics - Anfänger-Themen 4
E JFrame Fenster bewegen Java Basics - Anfänger-Themen 8
K Swing Fenster jede sec.neuzeichnen Java Basics - Anfänger-Themen 14
E javaw öffnet trotzdem ein DOS Fenster Java Basics - Anfänger-Themen 15
M Output Input im Cmd Fenster Java Basics - Anfänger-Themen 7
M Neues Fenster Java Basics - Anfänger-Themen 2
K Fenster öffnen nicht nach Export in jar File Java Basics - Anfänger-Themen 10
K Bild als Hintergrund in einem Swing Fenster Java Basics - Anfänger-Themen 21

Ähnliche Java Themen

Anzeige

Neue Themen


Oben