Hallo,
Ich bin gerade dabei ein Spave Invanders Spiel zu programmieren.
Aktueller Stand:
- Raumschiff (bloßes Viereck)gezeichnet
- Raumschiff steuerbar (Pfeiltasten)
- Raumschiff kann einen Schuss abfeuern mit Leertaste (hier liegt das Problem)
Das Problem besteht darin, dass wenn ich einen Schuss abfeuere und kurz danach noch einen Schuss abfeuern will, der alte Schuss plötzlich verschwindet.
Ich hab schon versucht eine extra Klasse für Schüsse zu erstellen und jedes mal wenn Leertaste gedrückt wird, soll ein seperates Schuss-Objekt erzeugt werden mit eigenen Koordinaten usw.
Das Problem ist aber: Wenn ich Leertaste drücke, befinde ich mich in der keyListener Methode, wo ich mein Schuss-Objekt erstellt habe. Wenn ich nun in der paintComponent Methode auf das Schuss Objekt zugreifen will, exestiert das Objekt ja garnicht mehr, da es ja nur in der keylistener Methode besteht...
Ich hab schon rumprobiert, aber mir fällt keine Lösung mehr ein. Habt ihr vielleicht einen Tipp, wie man das angehen könnte?
Ich bin gerade dabei ein Spave Invanders Spiel zu programmieren.
Aktueller Stand:
- Raumschiff (bloßes Viereck)gezeichnet
- Raumschiff steuerbar (Pfeiltasten)
- Raumschiff kann einen Schuss abfeuern mit Leertaste (hier liegt das Problem)
Das Problem besteht darin, dass wenn ich einen Schuss abfeuere und kurz danach noch einen Schuss abfeuern will, der alte Schuss plötzlich verschwindet.
Ich hab schon versucht eine extra Klasse für Schüsse zu erstellen und jedes mal wenn Leertaste gedrückt wird, soll ein seperates Schuss-Objekt erzeugt werden mit eigenen Koordinaten usw.
Das Problem ist aber: Wenn ich Leertaste drücke, befinde ich mich in der keyListener Methode, wo ich mein Schuss-Objekt erstellt habe. Wenn ich nun in der paintComponent Methode auf das Schuss Objekt zugreifen will, exestiert das Objekt ja garnicht mehr, da es ja nur in der keylistener Methode besteht...
Ich hab schon rumprobiert, aber mir fällt keine Lösung mehr ein. Habt ihr vielleicht einen Tipp, wie man das angehen könnte?
Java:
package ABC;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.Ellipse2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
public class SpaceInvenderPanel extends JPanel implements KeyListener, ActionListener {
private int x = 300;
private int y = 400;
private int dx = 0;
private int dy = 0;
public int laserX1, laserX2, laserY1, laserY2;
boolean links = false;
boolean rechts = false;
boolean oben = false;
boolean unten = false;
boolean leertaste = false;
boolean laserActive = false;
Timer t = new Timer(5, this);
//Konstruktor
public SpaceInvenderPanel(JFrame frame) {
frame.add(this);
setFocusable(true);
addKeyListener(this);
}
// Zeichnen
public void paintComponent(Graphics g) {
//Raumschiff (Rechteck) zeichnen
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.setColor(Color.BLACK);
g2.fillRect(x, y, 30, 30);
// Laser-Schuss zeichnen
if(leertaste) {
g2.drawLine(laserX1, laserY1, laserX2, laserY2);
}
if(laserActive) {
laserY1 -= 1;
laserY2 -= 1;
g2.drawLine(laserX1, laserY1, laserX2, laserY2);
}
t.start();
}
// Key-Listener
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if(code==KeyEvent.VK_UP) {
oben = true;
} else if(code==KeyEvent.VK_DOWN) {
unten = true;
} else if(code==KeyEvent.VK_RIGHT) {
rechts = true;
} else if(code==KeyEvent.VK_LEFT) {
links = true;
}
if(code==32) {
leertaste = true;
laserActive = true;
laserX1 = x+15;
laserX2 = x+15;
laserY1 = y;
laserY2 = y-20;
}
}
public void keyReleased(KeyEvent e) {
int code = e.getKeyCode();
if(code==KeyEvent.VK_UP) {
oben = false;
} else if(code==KeyEvent.VK_DOWN) {
unten = false;
} else if(code==KeyEvent.VK_RIGHT) {
rechts = false;
} else if(code==KeyEvent.VK_LEFT) {
links = false;
}
if(code==32) {
leertaste = false;
}
}
public void keyTyped(KeyEvent e) {
}
public void actionPerformed(ActionEvent e) {
if(oben) {
dy = -1;
dx = 0;
}
if(unten) {
dy = 1;
dx = 0;
}
if (links) {
dy = 0;
dx = -1;
}
if (rechts) {
dy = 0;
dx = 1;
}
x +=dx;
y +=dy;
repaint();
dx = 0;
dy = 0;
}
}
Java:
package ABC;
import javax.swing.JFrame;
public class SpaceInvenderFrame extends JFrame {
public SpaceInvenderFrame(int frameSizeX, int frameSizeY, String frameName) {
this.setSize(frameSizeX, frameSizeY);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle(frameName);
this.setLocation(500, 200);
}
}
Java:
package ABC;
public class SpaceInvenderStart {
public static void main(String[] args) {
SpaceInvenderFrame frame = new SpaceInvenderFrame(700, 500, "Space Invander");
SpaceInvenderPanel panel = new SpaceInvenderPanel(frame);
}
}