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.
[CODE lang="java" title="Start" highlight="5,8,9,14"]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();
}
}[/CODE]
[CODE lang="java" title="DuckyGame" highlight="8-10,24-26,63-66,38-47"]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);
}
}[/CODE]
[CODE lang="java" title="ImageLoader" highlight="8,27-41,"]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();
}
}
}
}[/CODE]
[CODE lang="java" title="Sprite" highlight="17-20,30-33,5-10"]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);
}
}[/CODE]