Hey, ich versuche mich grad an einem 2D Spiel nach der Anleitung von Quaxli.
Ich habe alles, was in seinem Tutorial beschrieben wird, gemacht. Aber bei mir werden einfach keine Alten Bilder gelöscht. So sieht das Programm aus, wenn es läuft:
Hier ist der Code:
Hoffentlich kann mir einer helfen.
Ich habe alles, was in seinem Tutorial beschrieben wird, gemacht. Aber bei mir werden einfach keine Alten Bilder gelöscht. So sieht das Programm aus, wenn es läuft:
Hier ist der Code:
Java:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import java.util.ListIterator;
import java.util.Vector;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Spielfeld extends JPanel implements Runnable, KeyListener{
private static final long serialVersionUID = 1L;
JFrame meinFenster;
long delta = 0; //Zeit, die für den letzten Schleifendurchlauf benötigt wurde
long last = 0; //speicherung der letzten Systemzeit
long fps = 0; //errechnung der Bildrate (Frames per second)
Sprite copter;
Vector<Sprite> actors;
Vector<Sprite> painter;
boolean up;
boolean left;
boolean right;
boolean down;
int speed = 200;
public Spielfeld(int breite, int hoehe){
this.setPreferredSize(new Dimension(breite, hoehe));
meinFenster = new JFrame("Spiel");
meinFenster.setLocation(20, 20);
meinFenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
meinFenster.add(this);
meinFenster.addKeyListener(this);
meinFenster.pack();
meinFenster.setVisible(true);
initialisierung();
Thread spielfeldThread = new Thread(this);
spielfeldThread.start();
}
private void initialisierung(){
last = System.nanoTime();
BufferedImage[] heli = loadPics("pics/heli.gif", 4);
actors = new Vector<Sprite>();
painter = new Vector<Sprite>();
copter = new Sprite(heli, 400, 300, 100, this);
actors.add(copter);
}
private BufferedImage[] loadPics(String path, int pics){
BufferedImage[] anim = new BufferedImage[pics];
BufferedImage source = null;
URL pic_url = getClass().getClassLoader().getResource(path);
try {
source = ImageIO.read(pic_url);
} catch (IOException e) {
}
for(int bildzaehler = 0; bildzaehler < pics; bildzaehler++){
anim[bildzaehler] = source.getSubimage(bildzaehler*source.getWidth() / pics, 0, source.getWidth() / pics, source.getHeight());
}
return anim;
}
@Override
public void run() {
while(meinFenster.isVisible()){
computeDelta();
ueberpruefeTastatur();
doLogic();
moveObjekt();
cloneVectors();
removeAll();
repaint();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
private void cloneVectors(){
painter = (Vector<Sprite>) actors.clone();
}
private void computeDelta(){
delta = System.nanoTime() - last;
last = System.nanoTime();
fps = ((long) 1e9) / delta; //Framerate errechnen (Frames per second)
}
public void paintComponent(Graphics meineGrafik){
super.paintComponents(meineGrafik);
meineGrafik.setColor(Color.red);
meineGrafik.drawString("FPS: " + Long.toString(fps), 15, 15);
if(painter != null){
for (ListIterator<Sprite> it = actors.listIterator(); it.hasNext();) {
Sprite r = it.next();
r.zeichneObjekte(meineGrafik);
}
}
}
private void ueberpruefeTastatur(){
if(up){
copter.setVerticalSpeed(-speed);
}
if(down){
copter.setVerticalSpeed(speed);
}
if(right){
copter.setHorizontalSpeed(speed);
}
if(left){
copter.setHorizontalSpeed(-speed);
}
if(!up && !down){
copter.setVerticalSpeed(0);
}
if(!left && !right){
copter.setHorizontalSpeed(0);
}
}
private void doLogic(){
for (ListIterator<Sprite> it = actors.listIterator(); it.hasNext();) {
Sprite r = it.next();
r.doLogic(delta);
}
}
private void moveObjekt(){
for (ListIterator<Sprite> it = actors.listIterator(); it.hasNext();) {
Sprite r = it.next();
r.move(delta);
}
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_UP){
up = true;
}
if(e.getKeyCode() == KeyEvent.VK_DOWN){
down = true;
}
if(e.getKeyCode() == KeyEvent.VK_RIGHT){
right = true;
}
if(e.getKeyCode() == KeyEvent.VK_LEFT){
left = true;
}
}
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_UP){
up = false;
}
if(e.getKeyCode() == KeyEvent.VK_DOWN){
down = false;
}
if(e.getKeyCode() == KeyEvent.VK_RIGHT){
right = false;
}
if(e.getKeyCode() == KeyEvent.VK_LEFT){
left = false;
}
}
@Override
public void keyTyped(KeyEvent e) {
}
}
Hoffentlich kann mir einer helfen.