Hallo,
Ich programmiere zurzeit ein Jump and Run und versuche es in die Teile GUI, Logik und Grafik aufzuteilen.
Habe zurzeit diese 3 Klassen:
Klasse GUI:
Klasse Logik:
Klasse KeyCommand:
Ich habe mir überlegt, eine Klasse Spiel zu erstellen, in der man das Spiel dann startet. Sollte ungefähr so aussehen:
Klasse Spiel:
Ich hoffe, dass ich die Aufteilung in Logik,Grafik und GUI richtig gemacht habe. Ich würde jetzt nur gerne wissen wieso sich meine Figur(luigi) nicht bewegt? Ich füge in der Klasse GUI den KeyListener ja hinzu:
Würde mich über Hilfe riesig freuen
Vielen Dank für alle die sich die Zeit nehmen und sich das hier wenigstens mal angucken
Mfg, Zitrus
Ich programmiere zurzeit ein Jump and Run und versuche es in die Teile GUI, Logik und Grafik aufzuteilen.
Habe zurzeit diese 3 Klassen:
Klasse GUI:
Java:
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.IOException;
import java.net.URL;
public class GUI extends JPanel implements ActionListener
{
KeyCommand key;
Logik l;
JFrame frame;
JButton start;
JLabel luigi;
Panel p;
URL uLuigiAnimated;
ImageIcon luigiAnimated;
public GUI(Logik l, KeyCommand key){
this.l = l;
this.key = key;
loadImages();
luigi = new JLabel(luigiAnimated);
luigi.setBounds(70,50,320,240);
start = new JButton("Start Game!");
start.setBounds(150,350,150,50);
start.addActionListener(this);
setLayout(null);
setSize(500,550);
frame = new JFrame();
frame.setTitle("New Super Luigi Brothers!");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(100,100);
frame.setSize(500,550);
frame.setResizable(false);
add(start);
add(luigi);
frame.add(this);
frame.setVisible(true);
}
void loadImages() {
uLuigiAnimated = getClass().getResource("LuigiAnimated.gif");
luigiAnimated = new ImageIcon(uLuigiAnimated);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == start) {
frame.remove(this);
p = new Panel(key , l);
frame.setSize(p.getWidth(),p.getHeight());
frame.add(p);
}
}
class Panel extends JPanel implements Runnable
{
/*Spieler luigi;
URL uLuigiLaeuft;
URL uLuigiSteht;
URL uLuigiSpringt;
URL uLuigiRennt;
URL uLuigiFaellt;
BufferedImage luigiLaeuft;
BufferedImage luigiRennt;
BufferedImage luigiSteht;
BufferedImage luigiSpringt;
BufferedImage luigiFaellt;
boolean left;
boolean right;
boolean up;
boolean down;
boolean fast;
boolean fall;
long delta;
long last;
long fps;
*/
Logik l;
public Panel(KeyCommand key, Logik l)
{
this.l = l;
setLayout(null);
setSize(800,500);
addKeyListener(key);
requestFocus();
Thread th = new Thread(this);
th.start();
l.doInitializations();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g); // super Beziehung zur Vaterklasse --> Standard-Implementation des
// JPanels löscht den kompletten Inhalt des Panels ;)
l.luigi.paintComponent(g); // Wird direkt erneut gezeichnet ;)
g.setColor(Color.RED);
g.drawString("FPS: " + Long.toString(l.fps) ,20,20);
}
@Override
public void run() {
while(frame.isVisible()) {
//calculateFPS();
//checkKeys();
l.doAll();
repaint();
try{
Thread.sleep(10);
}
catch(InterruptedException e) {
}
}
}
Klasse Logik:
Java:
import java.io.IOException;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.net.URL;
public class Logik
{
Logik logik;
Spieler luigi;
boolean left;
boolean right;
boolean up;
boolean down;
boolean fast;
boolean fall;
URL uLuigiLaeuft;
URL uLuigiSteht;
URL uLuigiSpringt;
URL uLuigiRennt;
URL uLuigiFaellt;
BufferedImage luigiLaeuft;
BufferedImage luigiRennt;
BufferedImage luigiSteht;
BufferedImage luigiSpringt;
BufferedImage luigiFaellt;
long delta;
long last;
long fps;
void doAll() {
calculateFPS();
checkKeys();
}
void calculateFPS() {
delta = System.nanoTime() - last;
last = System.nanoTime();
fps = ((long) 1e9/delta);
}
void doInitializations() {
last = System.nanoTime();
uLuigiLaeuft = getClass().getResource("luigiLaeuft.png");
uLuigiSteht = getClass().getResource("luigiSteht.png");
uLuigiRennt = getClass().getResource("luigiRennt.png");
uLuigiSpringt = getClass().getResource("luigiSpringt.png");
try {
luigiLaeuft = ImageIO.read(uLuigiLaeuft);
luigiSteht = ImageIO.read(uLuigiSteht);
luigiRennt = ImageIO.read(uLuigiRennt);
luigiSpringt = ImageIO.read(uLuigiSpringt);
} catch(IOException e) {
System.out.println("Fehler " + e.toString());
}
luigi = new Spieler(luigiSteht,100,350,1,1);
}
void checkKeys() {
if(left) {
if(fast) {
luigi.setDx(-2);
}
else {
luigi.setDx(-1);
}
luigi.moveHor();
}
if(right) {
luigi.setImage(luigiLaeuft);
if(fast) {
luigi.setDx(2);
}
else {
luigi.setDx(1);
}
luigi.moveHor();
}
if(up) {
luigi.moveVert();
fall = true;
}
}
}
Klasse KeyCommand:
Java:
mport java.awt.event.KeyListener;
import java.awt.event.KeyEvent;
public class KeyCommand implements KeyListener
{
Logik l;
public KeyCommand(Logik l) {
this.l = l;
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
l.right = true;
l.left = false;
}
else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
l.left = true;
l.right = false;
}
else if(e.getKeyCode() == KeyEvent.VK_UP) {
l.up = true;
l.down = false;
}
else if(e.getKeyCode() == KeyEvent.VK_S) {
l.fast = true;
}
}
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
l.right = false;
l.luigi.setImage(l.luigiSteht);
}
else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
l.left = false;
l.luigi.setImage(l.luigiSteht);
}
else if(e.getKeyCode() == KeyEvent.VK_UP) {
l.up = false;
}
else if(e.getKeyCode() == KeyEvent.VK_S) {
l.fast = false;
}
}
public void keyTyped(KeyEvent e) {
}
}
Ich habe mir überlegt, eine Klasse Spiel zu erstellen, in der man das Spiel dann startet. Sollte ungefähr so aussehen:
Klasse Spiel:
Java:
import javax.swing.JPanel;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.ImageIcon;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Color;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.Dimension;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.io.IOException;
import java.net.URL;
public class Spiel
{
public Spiel() {
play();
}
void play() {
Logik l = new Logik();
KeyCommand c = new KeyCommand(l);
GUI gui = new GUI(l , c);
}
class GUI extends JPanel implements ActionListener
{
KeyCommand key;
Logik l;
JFrame frame;
JButton start;
JLabel luigi;
Panel p;
URL uLuigiAnimated;
ImageIcon luigiAnimated;
public GUI(Logik l, KeyCommand key){
this.l = l;
this.key = key;
loadImages();
luigi = new JLabel(luigiAnimated);
luigi.setBounds(70,50,320,240);
start = new JButton("Start Game!");
start.setBounds(150,350,150,50);
start.addActionListener(this);
setLayout(null);
setSize(500,550);
frame = new JFrame();
frame.setTitle("New Super Luigi Brothers!");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocation(100,100);
frame.setSize(500,550);
frame.setResizable(false);
add(start);
add(luigi);
frame.add(this);
frame.setVisible(true);
}
void loadImages() {
uLuigiAnimated = getClass().getResource("LuigiAnimated.gif");
luigiAnimated = new ImageIcon(uLuigiAnimated);
}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getSource() == start) {
frame.remove(this);
p = new Panel(key , l);
frame.setSize(p.getWidth(),p.getHeight());
frame.add(p);
}
}
class Panel extends JPanel implements Runnable
{
/*Spieler luigi;
URL uLuigiLaeuft;
URL uLuigiSteht;
URL uLuigiSpringt;
URL uLuigiRennt;
URL uLuigiFaellt;
BufferedImage luigiLaeuft;
BufferedImage luigiRennt;
BufferedImage luigiSteht;
BufferedImage luigiSpringt;
BufferedImage luigiFaellt;
boolean left;
boolean right;
boolean up;
boolean down;
boolean fast;
boolean fall;
long delta;
long last;
long fps;
*/
Logik l;
public Panel(KeyCommand key, Logik l)
{
this.l = l;
setLayout(null);
setSize(800,500);
addKeyListener(key);
requestFocus();
Thread th = new Thread(this);
th.start();
l.doInitializations();
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g); // super Beziehung zur Vaterklasse --> Standard-Implementation des
// JPanels löscht den kompletten Inhalt des Panels ;)
l.luigi.paintComponent(g); // Wird direkt erneut gezeichnet ;)
g.setColor(Color.RED);
g.drawString("FPS: " + Long.toString(l.fps) ,20,20);
}
@Override
public void run() {
while(frame.isVisible()) {
//calculateFPS();
//checkKeys();
l.doAll();
repaint();
try{
Thread.sleep(10);
}
catch(InterruptedException e) {
}
}
}
}
}
class Logik
{
Logik logik;
Spieler luigi;
boolean left;
boolean right;
boolean up;
boolean down;
boolean fast;
boolean fall;
URL uLuigiLaeuft;
URL uLuigiSteht;
URL uLuigiSpringt;
URL uLuigiRennt;
URL uLuigiFaellt;
BufferedImage luigiLaeuft;
BufferedImage luigiRennt;
BufferedImage luigiSteht;
BufferedImage luigiSpringt;
BufferedImage luigiFaellt;
long delta;
long last;
long fps;
void doAll() {
calculateFPS();
checkKeys();
}
void calculateFPS() {
delta = System.nanoTime() - last;
last = System.nanoTime();
fps = ((long) 1e9/delta);
}
void doInitializations() {
last = System.nanoTime();
uLuigiLaeuft = getClass().getResource("luigiLaeuft.png");
uLuigiSteht = getClass().getResource("luigiSteht.png");
uLuigiRennt = getClass().getResource("luigiRennt.png");
uLuigiSpringt = getClass().getResource("luigiSpringt.png");
try {
luigiLaeuft = ImageIO.read(uLuigiLaeuft);
luigiSteht = ImageIO.read(uLuigiSteht);
luigiRennt = ImageIO.read(uLuigiRennt);
luigiSpringt = ImageIO.read(uLuigiSpringt);
} catch(IOException e) {
System.out.println("Fehler " + e.toString());
}
luigi = new Spieler(luigiSteht,100,350,1,1);
}
void checkKeys() {
if(left) {
if(fast) {
luigi.setDx(-2);
}
else {
luigi.setDx(-1);
}
luigi.moveHor();
}
if(right) {
luigi.setImage(luigiLaeuft);
if(fast) {
luigi.setDx(2);
}
else {
luigi.setDx(1);
}
luigi.moveHor();
}
if(up) {
luigi.moveVert();
fall = true;
}
}
}
class KeyCommand implements KeyListener
{
Logik l;
public KeyCommand(Logik l) {
this.l = l;
}
@Override
public void keyPressed(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
l.right = true;
l.left = false;
}
else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
l.left = true;
l.right = false;
}
else if(e.getKeyCode() == KeyEvent.VK_UP) {
l.up = true;
l.down = false;
}
else if(e.getKeyCode() == KeyEvent.VK_S) {
l.fast = true;
}
}
@Override
public void keyReleased(KeyEvent e) {
if(e.getKeyCode() == KeyEvent.VK_RIGHT) {
l.right = false;
l.luigi.setImage(l.luigiSteht);
}
else if(e.getKeyCode() == KeyEvent.VK_LEFT) {
l.left = false;
l.luigi.setImage(l.luigiSteht);
}
else if(e.getKeyCode() == KeyEvent.VK_UP) {
l.up = false;
}
else if(e.getKeyCode() == KeyEvent.VK_S) {
l.fast = false;
}
}
public void keyTyped(KeyEvent e) {
}
}
}
Ich hoffe, dass ich die Aufteilung in Logik,Grafik und GUI richtig gemacht habe. Ich würde jetzt nur gerne wissen wieso sich meine Figur(luigi) nicht bewegt? Ich füge in der Klasse GUI den KeyListener ja hinzu:
Java:
addKeyListener(key);
requestFocus();
Würde mich über Hilfe riesig freuen
Vielen Dank für alle die sich die Zeit nehmen und sich das hier wenigstens mal angucken
Mfg, Zitrus