import java.awt.*;
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.Vector;
import javax.imageio.ImageIO;
import javax.swing.*;
import view.GamePanelView;
import mdInterface.Drawable;
import mdInterface.Moveable;
public class GamePanel extends JPanel implements Runnable,KeyListener
//Runnable = Um das Spiel in einem eigenen Thread laufen zu lassen
{
private static final long serialVersionUID = 1L;
boolean spiel_lauf = true; //für einen Schleifenabbruch der Spieleschleife(run())
boolean gestartet = false;
boolean once = false;
//Zeitmessung(flüssigen Spielelauf)
long zeiterrechnung = 0;
long letztezeit = 0;
long fps = 0;
//die Steuerung:
boolean up = false;
boolean down = false;
boolean right = false;
boolean left = false;
boolean bombe = false;
int geschwindigkeit = 200;//für die Geschwindigkeit unseres bewegten Objects
BomberMan man;//wegen abstract in Sprite
Bombe bom;
Vector<Sprite> akteur;
public static void main(String[] args)
{
new GamePanel(800,600);//Größe von 800*600 festgelegt
}
public GamePanel(int width, int height)
{
//Fenster Eigenschaften:
this.setPreferredSize(new Dimension(width,height));
this.setBackground(Color.gray);
JFrame fenster = new JFrame("BomberMan");
fenster.setLocation(100,100);
fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fenster.addKeyListener(this);
this.add(new JLabel("1.Zum starten: Enter drücken"+"----->"+
"2.Zum Thread beenden: ESC drücken"+"----->"+
"3.Zum Spiel beenden: nochmal ESC drücken"));
fenster.add(this);
fenster.pack();//Hiermit wird das Fenster an die gewünschte Größe angepasst
fenster.setVisible(true);
UniqueLoad();
fenster.setVisible(true);
}
//Bilderstrings
String heli = "heli.gif";
String bomberman = "bomber.gif";
String bombeone = "bombe.gif";
public void UniqueLoad()//Einmaliges Laden(Bilder und Grafiken vorladen(Performance schub))
{
letztezeit = System.nanoTime();
akteur = new Vector<Sprite>();
BufferedImage[] bomber = this.loadImage("pic/"+bomberman,1);
man = new BomberMan(bomber,400,300,50,this);
akteur.add(man);
if(!once ==true)//verhindert,dass nach jedem Neustart ein neuer Thread aufgemacht wird
{
once=true;
Thread t = new Thread(this);//Spiel in ein Thread gepackt
t.start();//und gestartet
}
}
public void run()//alle notwendigen Prüfungen werden in einer Schleife vorgenommen
{
while(spiel_lauf)
{
schleifenBerechnung();
if(isGestartet())
{
checkEingabe();
doLogic();
moveObjectsOn();
}
repaint();
try
{
Thread.sleep(1);
}
catch(InterruptedException e)
{
JOptionPane.showMessageDialog(null, e);
}
}
}
private void schleifenBerechnung()
{
zeiterrechnung = System.nanoTime()-letztezeit;//Errechung des Schleifendurchlaufs(while(spiel_lauf))
letztezeit = System.nanoTime();//aktuelle Systemzeit
fps = ((long) 1e9)/zeiterrechnung;//Frameratenberrechnung(*)
}
@Override
public void paintComponent(Graphics g)//Frames anzeigen(*)
{
super.paintComponent(g);
g.setColor(Color.red);
g.drawString("FPS: "+Long.toString(fps),0,10);
//nach Spielbeginn wird erst gezeichnet:
if(!isGestartet())
{
return;
}
if(akteur!=null)
{
for(Drawable draw:akteur)
{
draw.drawObjects(g);
}
}
}
// Laden der Bilder in ein Array-> Für die Animation sowie die Berechnungen
private BufferedImage[] loadImage(String path, int image)
{
BufferedImage[] anim = new BufferedImage[image];
BufferedImage source = null;
URL imageurl = getClass().getClassLoader().getResource(path);//Ermittlung der URL(Speicherort)
try
{
source = ImageIO.read(imageurl);
}
catch(IOException ioe){}
for(int x = 0;x<image;x++)
{
anim[x] = source.getSubimage(x*source.getWidth()/image, 0, source.getWidth()/image, source.getHeight());
}
return anim;
}
private void doLogic()
{
for(Moveable mov:akteur)
{
mov.doLogic(zeiterrechnung);
}
}
private void moveObjectsOn()
{
for(Moveable mov:akteur)
{
mov.move(zeiterrechnung);
}
}
private void checkEingabe()
{
if(up)
{
man.setVerticalSpeed(-geschwindigkeit);
}
if(down)
{
man.setVerticalSpeed(geschwindigkeit);
}
if(right)
{
man.setHorizontalSpeed(geschwindigkeit);
}
if(left)
{
man.setHorizontalSpeed(-geschwindigkeit);
}
//falls losgelassen wird dann soll er stoppen
if(!left && !right)
{
man.setHorizontalSpeed(0);
}
if(!up && !down)
{
man.setVerticalSpeed(0);
}
//Man kann keine Bewegungen gleichzeitig drücken:
if(down && left || down && right || up && left || up && right || right && left || up && down)
{
man.setVerticalSpeed(0);
man.setHorizontalSpeed(0);
}
}
//Automatisch ertsellt durch den KeyListener
//Die Vorgehensweise stellt sicher, dass alles immer klappt(nihct in der Keylistener Klasse gemacht)
public void keyPressed(KeyEvent ke)
{
if(ke.getKeyCode()==KeyEvent.VK_UP)
{
up = true;
}
if(ke.getKeyCode()==KeyEvent.VK_DOWN)
{
down = true;
}
if(ke.getKeyCode()==KeyEvent.VK_LEFT)
{
left = true;
}
if(ke.getKeyCode()==KeyEvent.VK_RIGHT)
{
right = true;
}
if(ke.getKeyCode()==KeyEvent.VK_0)
{
bombe = true;
createBombe();
}
}
public void keyReleased(KeyEvent ke)
{
if(ke.getKeyCode()==KeyEvent.VK_UP)
{
up = false;
}
if(ke.getKeyCode()==KeyEvent.VK_DOWN)
{
down = false;
}
if(ke.getKeyCode()==KeyEvent.VK_LEFT)
{
left = false;
}
if(ke.getKeyCode()==KeyEvent.VK_RIGHT)
{
right = false;
}
if(ke.getKeyCode()==KeyEvent.VK_0)
{
bombe = false;
}
if(ke.getKeyCode()==KeyEvent.VK_ENTER)
{
if(!isGestartet())
{
UniqueLoad();
setGestartet(true);
}
}
if(ke.getKeyCode()==KeyEvent.VK_ESCAPE)
{
if(isGestartet())
{
setGestartet(false);
// System.exit(0);
}
else
{
setGestartet(false);
System.exit(0);
}
}
}
public void keyTyped(KeyEvent ke)
{
}
public boolean isGestartet()
{
return gestartet;
}
public void setGestartet(boolean gestartet)
{
this.gestartet = gestartet;
}
boolean bomesetzten = false;
public void createBombe()
{
BufferedImage[] bombearray = this.loadImage("pic/bombe.gif",4);
double xx = man.getX();
double yy = man.getY()+30;
Bombe bom= new Bombe(bombearray,xx,yy,50,this);
akteur.add(bom);
}
}