Hallo zusammen,
ich versuche mich gerade an meinem 2. "größeren" Projekt, sprich einem Super Mario das denen aus 1985 entspricht. Mein Problem im Moment ist, dass ich dem JPanel, indem das Spiel gezeichnet wird, keinen KeyListener hinzufügen kann. Ich habe versucht die Klasse das Interface implementieren zu lassen, aber leider reagiert zu Laufzeit nichts auf meine Testmethode keyPressed() vom JPanel.
Hier die Klasse Gui
Hier die Klasse Level, abgeleitet von JPanel, implementiert KeyListener
Ich entschuldige mich für den "Code-salat", ich habe länger an manchen sachen probiert und noch nicht alles wieder gelöscht bzw. endgültig beschlossen wie ich es mache.
Danke für die Aufmerksamkeit.
ich versuche mich gerade an meinem 2. "größeren" Projekt, sprich einem Super Mario das denen aus 1985 entspricht. Mein Problem im Moment ist, dass ich dem JPanel, indem das Spiel gezeichnet wird, keinen KeyListener hinzufügen kann. Ich habe versucht die Klasse das Interface implementieren zu lassen, aber leider reagiert zu Laufzeit nichts auf meine Testmethode keyPressed() vom JPanel.
Hier die Klasse Gui
Java:
package Mario;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.util.Timer;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.imageio.ImageIO;
import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JButton;
public class Gui extends JFrame {
private JPanel contentPane;
private Level panelLevel;
private Thread t;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Gui frame = new Gui();
frame.setVisible(true);
frame.setResizable(false);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public Gui() {
setTitle("Super Mario");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(400, 250, 900, 540);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
panelLevel = new Level();
panelLevel.addKeyListener(new Level()); //ich weiß nicht ob man diese Zeile braucht..?
panelLevel.setBounds(0, 40, getWidth(), getHeight());
panelLevel.setBackground(Color.BLACK);
panelLevel.setLayout(null);
//contentPane.add(panelLevel);
setContentPane(panelLevel);
JButton btnExit = new JButton("Exit");
btnExit.setBackground(Color.BLACK);
btnExit.setForeground(Color.LIGHT_GRAY);
btnExit.setBounds(5,5,70,50);
panelLevel.add(btnExit);
}
}
Java:
package Mario;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.imageio.ImageIO;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JPanel;
import javax.swing.KeyStroke;
import javax.swing.Timer;
public class Level extends JPanel implements KeyListener {
private ArrayList<Block> listeBlock;
private Spielfigur figur;
private int figX;
private int figY;
private MovementState movementState;
public Level() {
super();
listeBlock = new ArrayList<Block>();
levelAufbauen();
figur = new Mario("Mario", 100, 100, 20, 40);
figX = figur.getX();
figY = figur.getY();
movementState = new MovementState();
InputMap im = getInputMap(WHEN_IN_FOCUSED_WINDOW);
ActionMap am = getActionMap();
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, false), "down-pressed");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_DOWN, 0, true), "down-released");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, false), "up-pressed");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_UP, 0, true), "up-released");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, false), "left-pressed");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_A, 0, true), "left-released");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, false), "rechts-pressed");
im.put(KeyStroke.getKeyStroke(KeyEvent.VK_D, 0, true), "rechts-released");
am.put("down-pressed", new YDirectionAction(movementState, 2));
am.put("down-released", new YDirectionAction(movementState, 0));
am.put("up-pressed", new YDirectionAction(movementState, -2));
am.put("up-released", new YDirectionAction(movementState, 0));
am.put("left-pressed", new XDirectionAction(movementState, -1));
am.put("left-released", new XDirectionAction(movementState, 0));
am.put("rechts-pressed", new XDirectionAction(movementState, 1));
am.put("rechts-released", new XDirectionAction(movementState, 0));
Timer timer = new Timer(5, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if(kontaktBlock() && !figur.getSpringt()) {
figur.setFigurPos(figur.getX(), figur.getY()+2);
}
if(figur.getSpringt()) {
figur.setY(figur.getY()-4);
}
figur.setX(figur.getX()+movementState.xDirection);
System.out.println("x: " + movementState.xDirection);
figur.setY(figur.getY()+movementState.yDirection);
System.out.println("y: " + movementState.yDirection);
if (figur.getX() < 0) {
figur.setX(0);
} else if (figur.getX() + figur.getBreite() > getWidth()) {
figur.setX(getWidth() - figur.getBreite());
}
if (figur.getY() < 0) {
figur.setY(0);
} else if (figur.getY() + figur.getHoehe() > getHeight()) {
figur.setY(getHeight() - figur.getHoehe());
}
repaint();
}
});
timer.start();
}
public void levelAufbauen() {
for(int i = 0; i < 2000; i+= 20) {
NormalerBlock b = new NormalerBlock(i, 425, 20, 20);
listeBlock.add(b);
}
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
for(int i = 0; i < 50; i++) {
try {
Block b = listeBlock.get(i);
g.drawImage(b.getImage(), (int)b.getX(), (int)b.getY(), (int)b.getWidth(), (int)b.getHeight(), this);
} catch(Exception e) {
e.printStackTrace();
}
}
Graphics2D g2d = (Graphics2D) g.create();
g2d.drawImage(figur.getSkin(), figur.getX(), figur.getY(), this);
g2d.dispose();
}
/*
public void run() {
while(true) {
synchronized (this) {
if(kontaktBlock()) {
figur.setFigurPos(figur.getX(), figur.getY()+1);
}
figur.setX(figur.getX()+movementState.xDirection);
figur.setY(figur.getY()+movementState.yDirection);
if (figur.getX() < 0) {
figur.setX(0);
} else if (figur.getX() + figur.getBreite() > getWidth()) {
figur.setX(getWidth() - figur.getBreite());
}
if (figur.getY() < 0) {
figur.setY(0);
} else if (figur.getY() + figur.getHoehe() > getHeight()) {
figur.setY(getHeight() - figur.getHoehe());
}
}
this.repaint();
try{
Thread.sleep(1);
} catch (InterruptedException e) {
break;
}
}
}*/
public Spielfigur getFigur() { return this.figur; }
public boolean kontaktBlock() {
for(int i = 0; i < listeBlock.size(); i++) {
if(figur.getY()+41 != listeBlock.get(i).getY()) {
return true;
}
}
return false;
}
@Override
public void keyTyped(KeyEvent e) {
System.out.println("Nur ein Test, ob das panel reagiert1");
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("Nur ein Test, ob das panel reagiert2");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("Nur ein Test, ob das panel reagiert3");
}
}
Ich entschuldige mich für den "Code-salat", ich habe länger an manchen sachen probiert und noch nicht alles wieder gelöscht bzw. endgültig beschlossen wie ich es mache.
Danke für die Aufmerksamkeit.