Hallo Freunde! Ich bin gerade am ausprogrammieren des Spiels Space Invaders und habe ein kleines Problem:
Beim erzeugen der Gegner verwende ich einen Parser der durch ein vom mir angegebenes Textfeld geht und dann je nach Buchstabe einen Gegner erzeugt. Gestern habe ich wieder beim Programm weiter gearbeitet und habe versehentlich einen Fehler eingebaut, den ich jetzt nicht mehr finden kann.
Fehler befindet sich vermutlich in MyGameField oder in einer der Enemie Klassen.
Danke im Voraus
P.S.: Bilder müsst ihr euch selber welche unter jeweiligen Namen einfügen.
Beim erzeugen der Gegner verwende ich einen Parser der durch ein vom mir angegebenes Textfeld geht und dann je nach Buchstabe einen Gegner erzeugt. Gestern habe ich wieder beim Programm weiter gearbeitet und habe versehentlich einen Fehler eingebaut, den ich jetzt nicht mehr finden kann.
Fehler befindet sich vermutlich in MyGameField oder in einer der Enemie Klassen.
Danke im Voraus
Java:
// My Game :
import javax.swing.*;
import java.awt.*;
public class MyGame {
private JFrame f;
private MyGameField field;
public static void main(String[] args) {
new MyGame().start();
}
public void start() {
f = new JFrame("Space Invaders");
Container c = f.getContentPane();
c.setLayout(new BorderLayout());
field = new MyGameField();
c.add(field, BorderLayout.CENTER);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setSize(800, 800);
f.setVisible(true);
f.setResizable(false);
field.start();
}
}
//Figure:
import java.awt.*;
import java.util.*;
public abstract class Figure {
protected Rectangle bounds;
int speedX;
int speedY;
public Figure(int x, int y, int w, int h) {
bounds = new Rectangle(x, y, w, h);
}
public abstract void draw(Graphics g);
public void invertDirection(ArrayList<Figure> figures, boolean left, boolean right){
}
public void move() {
}
public void fire(){
}
public void collidesWith(Figure f, ArrayList<Figure> removeList, ArrayList<Figure> addList) {
}
public void collisionWall(boolean left, boolean right, boolean top, boolean bottom) {
if(right) {
speedX = -Math.abs(speedX);
bounds.y += 44;
}
}
public int getXPos() {
return bounds.x;
}
public int getYPos() {
return bounds.y;
}
public int getWidth() {
return bounds.width;
}
public int getHeight() {
return bounds.height;
}
public Rectangle getBounds() {
return bounds;
}
}
//Enemie A-D:
import java.awt.*;
import java.util.*;
public class EnemieA extends Figure {
Image EnemieAimg;
Image EnemieA2img;
int speedX;
int speedY;
public EnemieA(int x, int y, int sx, int sy) {
super(x, y, 44, 36);
speedX = sx;
speedY = sy;
int cnt = 0;
EnemieAimg = Toolkit.getDefaultToolkit().getImage("EnemieA.jpg");
EnemieA2img = Toolkit.getDefaultToolkit().getImage("EnemieA2.jpg");
}
public void draw(Graphics g) {
g.drawImage(EnemieAimg, bounds.x, bounds.y, null);
}
public void collidesWith(Figure f, ArrayList<Figure> removeList, ArrayList<Figure> addList) {
if (f instanceof Fire){
removeList.add(this);
}
}
public void move() {
bounds.x += speedX;
bounds.y += speedY;
}
public void invertDirection(ArrayList<Figure> figures, boolean left, boolean right, int speedX){
int size = figures.size();
System.out.println("Aufgerufen");
for(int i = 0; i < size; i++){
Figure f = figures.get(i);
f.bounds.y += 44;
speedX = -Math.abs(speedX);
}
}
public void collisionWall(boolean left, boolean right, boolean top, boolean bottom, ArrayList<Figure> figures) {
if(left) {
invertDirection(figures, left, right);
System.out.println("Aufgerufen");
}
if(right) {
invertDirection(figures, left, right);
System.out.println("Aufgerufen");
}
if(top) {
}
if(bottom) {
}
}
}
import java.awt.*;
import java.util.*;
public class EnemieB extends Figure {
int a = 0;
int speedX;
int speedY;
Image EnemieBimg;
public EnemieB(int x, int y, int sx, int sy) {
super(x, y, 44, 36);
speedX = sx;
speedY = sy;
EnemieBimg = Toolkit.getDefaultToolkit().getImage("EnemieB.jpg");
}
public void draw(Graphics g) {
g.drawImage(EnemieBimg, bounds.x, bounds.y, null);
}
public void collidesWith(Figure f, ArrayList<Figure> removeList, ArrayList<Figure> addList) {
if (f instanceof Fire){
a ++;
while(a == 2) {
removeList.add(this);
a = 0;
}
}
}
public void move() {
bounds.x += speedX;
bounds.y += speedY;
}
public void collisionWall(boolean left, boolean right, boolean top, boolean bottom) {
if(left) {
speedX = Math.abs(speedX);
bounds.y += 44;
}
if(right) {
speedX = -Math.abs(speedX);
bounds.y += 44;
}
if(top) {
speedY = Math.abs(speedX);
}
if(bottom) {
speedY = -Math.abs(speedX);
}
}
}
import java.awt.*;
import java.util.*;
public class EnemieC extends Figure {
Image EnemieCimg;
MyGameField field;
int speedX;
int speedY;
public EnemieC(int x, int y, int sx, int sy) {
super(x, y, 44, 36);
speedX = sx;
speedY = sy;
EnemieCimg = Toolkit.getDefaultToolkit().getImage("EnemieC.jpg");
}
public void draw(Graphics g) {
g.drawImage(EnemieCimg, bounds.x, bounds.y, null);
}
public void collidesWith(Figure f, ArrayList<Figure> removeList, ArrayList<Figure> addList) {
if (f instanceof Fire){
removeList.add(this);
}
}
public void move() {
bounds.x += speedX;
bounds.y += speedY;
}
public void collisionWall(boolean left, boolean right, boolean top, boolean bottom) {
if(left) {
speedX = Math.abs(speedX);
bounds.y += 44;
}
if(right) {
speedX = -Math.abs(speedX);
bounds.y += 44;
}
if(top) {
speedY = Math.abs(speedX);
}
if(bottom) {
speedY = -Math.abs(speedX);
}
}
}
import java.awt.*;
import java.util.*;
public class EnemieD extends Figure {
Image EnemieDimg;
MyGameField field;
int speedX;
int speedY;
public EnemieD(int x, int y, int sx, int sy) {
super(x, y, 44, 36);
speedX = sx;
speedY = sy;
EnemieDimg = Toolkit.getDefaultToolkit().getImage("EnemieD.jpg");
}
public void draw(Graphics g) {
g.drawImage(EnemieDimg, bounds.x, bounds.y, null);
}
public void collidesWith(Figure f, ArrayList<Figure> removeList, ArrayList<Figure> addList) {
if (f instanceof Fire){
removeList.add(this);
}
}
public void move() {
bounds.x += speedX;
bounds.y += speedY;
}
public void collisionWall(boolean left, boolean right, boolean top, boolean bottom) {
if(left) {
speedX = Math.abs(speedX);
bounds.y += 44;
}
if(right) {
speedX = -Math.abs(speedX);
bounds.y += 44;
}
if(top) {
speedY = Math.abs(speedX);
}
if(bottom) {
speedY = -Math.abs(speedX);
}
}
}
//MyGameField:
import java.util.*;
import javax.swing.*;
import java.awt.*;
public class MyGameField extends JComponent implements Runnable {
private Thread aniTh;
ArrayList<Figure> figures;
public static final String[] feld1 =
new String[] {
"AC",
"BAC",
"CAB",
"X",
};
public MyGameField() {
figures = new ArrayList<Figure>();
figures.add(new Bar(this));
int y = 25;
for (int i = 0; i < feld1.length; i ++) {
String line = feld1[i];
int x = 25;
for (int j = 0; j < line.length(); j ++) {
char fig = line.charAt(j);
switch(fig) {
case 'A': figures.add(new EnemieA(x, y, 2, 0));
break;
case 'B': figures.add(new EnemieB(x, y, 2, 0));
break;
case 'C': figures.add(new EnemieC(x, y, 2, 0));
break;
case 'X': figures.add(new Baricade(x, y, 0, 0));
break;
}
}
x += 50;
}
y += 50;
}
public void start() {
aniTh = new Thread(this);
aniTh.start();
}
public void paint(Graphics g) {
g.setColor(Color.BLACK);
g.fillRect(0, 0, getWidth(), getHeight());
for (int i = 0; i < figures.size(); i ++) {
figures.get(i).draw(g);
}
}
public void collisionDetection() {
int size = figures.size();
for (int i = 0; i < size; i ++) {
Figure f = figures.get(i);
boolean left = false, right = false;
boolean top = false, bottom = false;
if (f.getXPos() < 0) { // Koll. links
left = true;
}
if (f.getYPos() < 0) { // Koll. oben
top = true;
}
if (f.getXPos() + f.getWidth() > getWidth()) { // Koll. rechts
right = true;
}
if (f.getYPos() + f.getHeight() > getHeight()) { // Koll. unten
bottom = true;
}
f.collisionWall(left, right, top, bottom);
}
ArrayList<Figure> removeList = new ArrayList<Figure>();
ArrayList<Figure> addList = new ArrayList<Figure>();
for (int i = 0; i < size; i ++) {
Figure f1 = figures.get(i);
Rectangle b1 = f1.getBounds();
for (int j = i + 1; j < size; j ++) {
Figure f2 = figures.get(j);
Rectangle b2 = f2.getBounds();
if (b1.intersects(b2)) {
f1.collidesWith(f2, removeList, addList);
f2.collidesWith(f1, removeList, addList);
}
}
}
figures.removeAll(removeList);
figures.addAll(addList);
}
public void run() {
while (true) {
for (int i = 0; i < figures.size(); i ++) {
figures.get(i).move();
}
collisionDetection();
repaint();
try {
Thread.sleep(20);
}
catch (InterruptedException ex) {
}
}
}
public void addFigure(Figure f){
figures.add(f);
}
}
//Bar:
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Bar extends Figure implements MouseMotionListener, MouseListener{
MyGameField field;
Image shipImg;
public Bar(MyGameField field){
super(100, 600, 60, 50); // Werte Rammy bar.jpg
shipImg = Toolkit.getDefaultToolkit().getImage("Ship.jpg");
this.field = field;
field.addMouseMotionListener(this);
field.addMouseListener(this);
}
public void draw(Graphics g){
// g.setColor(Color.BLUE);
// g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);
g.drawImage(shipImg, bounds.x, bounds.y, null); //NULL für ImageObserver
}
public void collidesWith(Figure f, ArrayList<Figure> removeList, ArrayList<Figure> addList) {
if (f instanceof EnemieA || f instanceof EnemieB || f instanceof EnemieC) {
boolean GameOver = false;
if(GameOver == true) {
System.out.print("Verloren!");
}
}
}
public void collisionWall(boolean left, boolean right, boolean top, boolean bottom) {
}
public void mouseDragged(MouseEvent e){
mouseMoved(e);
}
public void mouseMoved(MouseEvent e){
int x = e.getX();
int y = e.getY();
bounds.x = x - bounds.width / 2;
//bounds.y = y - bounds.height / 2;
}
public void mouseClicked(MouseEvent e){
}
public void mouseEntered(MouseEvent e){
}
public void mouseExited(MouseEvent e){
}
public void mousePressed(MouseEvent e){
Fire f = new Fire(bounds.x + bounds.width/2, bounds.y - 20);
field.addFigure(f);
}
public void mouseReleased(MouseEvent e){
}
}
//Fire:
import java.util.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Fire extends Figure{
public Fire(int x, int y){
super(x, y, 5, 25);
}
public void draw(Graphics g){
g.setColor(Color.RED);
g.fillRect(bounds.x, bounds.y, bounds.width, bounds.height);
}
public void move(){
bounds.y = bounds.y - 20;
}
public void collidesWith(Figure f, ArrayList<Figure> removeList, ArrayList<Figure> addList) {
if (f instanceof EnemieA) {
removeList.add(this);
}
if (f instanceof EnemieC) {
removeList.add(this);
}
if (f instanceof EnemieB) {
removeList.add(this);
}
if (f instanceof Baricade){
removeList.add(this);
}
}
}
//Baricade:
import java.awt.*;
import java.util.*;
public class Baricade extends Figure {
int cnt = 0;
Image Baricadeimg1;
Image Baricadeimg2;
Image Baricadeimg3;
Image Baricadeimg4;
Image Baricadeimg5;
public Baricade(int x, int y, int sx, int sy) {
super(x, y, 80, 40);
Baricadeimg1 = Toolkit.getDefaultToolkit().getImage("Baricade1.jpg");
Baricadeimg2 = Toolkit.getDefaultToolkit().getImage("Baricade2.jpg");
Baricadeimg3 = Toolkit.getDefaultToolkit().getImage("Baricade3.jpg");
Baricadeimg4 = Toolkit.getDefaultToolkit().getImage("Baricade4.jpg");
Baricadeimg5 = Toolkit.getDefaultToolkit().getImage("Baricade5.jpg");
}
public void draw(Graphics g) {
if (cnt <= 2) {
g.drawImage(Baricadeimg1, bounds.x, bounds.y, null);
}
if (cnt > 2 && cnt <= 5){
g.drawImage(Baricadeimg2, bounds.x, bounds.y, null);
}
if (cnt > 5 && cnt <= 7){
g.drawImage(Baricadeimg3, bounds.x, bounds.y, null);
}
if (cnt > 7 && cnt <= 9){
g.drawImage(Baricadeimg4, bounds.x, bounds.y, null);
}
if (cnt > 8 && cnt <= 10){
g.drawImage(Baricadeimg4, bounds.x, bounds.y, null);
}
}
public void collidesWith(Figure f, ArrayList<Figure> removeList, ArrayList<Figure> addList) {
if (f instanceof Fire){
cnt ++;
if(cnt == 10) {
removeList.add(this);
}
}
}
}
P.S.: Bilder müsst ihr euch selber welche unter jeweiligen Namen einfügen.
Anhänge
Zuletzt bearbeitet: