PDA

View Full Version : [Java] Problema con lancio nuovo livello in un gioco.


Briliant
30-06-2012, 16:24
Allora, sto' programmando un piccolo shooter 2D in java. Ho creato due classi, Stage (Dove serve ammazzare 20 alieni) e Boss (Dove si spara alla nave madre).

Entrambe le classi funzionano in maniera perfetta se lanciate dal main, se invece lancio Boss da Stage, funziona tutto tranne le animazioni per la nave.

Boss


import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
import javax.swing.Timer;


public class Stage extends JPanel implements ActionListener, VariabiliComuni {

protected Timer timer;
protected R9XA craft;
protected ArrayList aliens;
protected boolean ingame;
protected boolean victory;
protected boolean destroyed;
//protected int earthealth;
public int earthealth = earth;
public float damage = (earthealth/100);



public Stage() {

addKeyListener(new Stage.TAdapter());
setFocusable(true);
setBackground(Color.BLACK);
setDoubleBuffered(true);
ingame = true;
victory = false;
destroyed = false;

setSize(StageW, StageH);

craft = new R9XA();

initAliens();

timer = new Timer(5, this);
timer.start();
}



public void initAliens() {
aliens = new ArrayList();

for (int i=0; i<AttackMatrix.length; i++ ) {
aliens.add(new Bydo(AttackMatrix[i][0], AttackMatrix[i][1]));
}
}


public void paint(Graphics g) {
super.paint(g);

if (ingame) {

Graphics2D g2d = (Graphics2D)g;

if (craft.isVisible())
g2d.drawImage(craft.getImage(), craft.getX(), craft.getY(),
this);

ArrayList ms = craft.getBurst();

for (int i = 0; i < ms.size(); i++) {
Beam m = (Beam)ms.get(i);
g2d.drawImage(m.getImage(), m.getX(), m.getY(), this);
}

for (int i = 0; i < aliens.size(); i++) {
Bydo a = (Bydo)aliens.get(i);

if (a.isVisible())
g2d.drawImage(a.getImage(), a.getX(), a.getY(), this);

}

g2d.setColor(Color.WHITE);
g2d.drawString("Aliens left: " + aliens.size(), 5, 15);
g2d.drawString("Earth Energy:" + earthealth, 5, 35);
}


else {
if ((victory == false) &&
(destroyed == false)) {
String msg = "You got destroyed! Failed to protect Earth!";
Font small = new Font("Helvetica", Font.BOLD, 14);
FontMetrics metr = this.getFontMetrics(small);

g.setColor(Color.white);
g.setFont(small);
g.drawString(msg, (StageW - metr.stringWidth(msg)) / 2,
StageH / 2);
}



else if ((victory == false) &&
(destroyed == true)) {
String msg = "Earth got destroyed! Mankind has no more an Home!";
Font small = new Font("Helvetica", Font.BOLD, 14);
FontMetrics metr = this.getFontMetrics(small);

g.setColor(Color.white);
g.setFont(small);
g.drawString(msg, (StageW - metr.stringWidth(msg)) / 2,
StageH / 2);
}

else if ((victory == true) &&
(earthealth < 2500)) {
String msg = "Too much damage to Earth! Mankind has become extinct! ";
Font small = new Font("Helvetica", Font.BOLD, 14);
FontMetrics metr = this.getFontMetrics(small);

g.setColor(Color.white);
g.setFont(small);
g.drawString(msg, (StageW - metr.stringWidth(msg)) / 2,
StageH / 2);
}


else {
String msg = "Invasion Repelled";
Font small = new Font("Helvetica", Font.BOLD, 14);
FontMetrics metr = this.getFontMetrics(small);

g.setColor(Color.white);
g.setFont(small);
g.drawString(msg, (StageW - metr.stringWidth(msg)) / 2,
StageH / 2);


}

}

Toolkit.getDefaultToolkit().sync();
g.dispose();
}


public void actionPerformed(ActionEvent e) {

//if (aliens.size()==0) {

if (aliens.size() < 20) {
//victory = true;
//ingame = false;

craft.setVisible(false);
timer.stop();
ingame = false;
//craft.setVisible(false);

add(new Boss());



}

if (earthealth < 0) {
destroyed = true;
ingame = false;
}

ArrayList ms = craft.getBurst();

for (int i = 0; i < ms.size(); i++) {
Beam m = (Beam) ms.get(i);
if (m.isVisible())
m.move();
else ms.remove(i);
}

for (int i = 0; i < aliens.size(); i++) {
Bydo a = (Bydo) aliens.get(i);




if (a.isVisible())
{
a.move();
if (a.getX() < 40)
earthealth--;
}
else aliens.remove(i);

}

craft.move();
checkCollisions();
repaint();
}


public void checkCollisions() {

Rectangle r3 = craft.getBounds();

for (int j = 0; j<aliens.size(); j++) {
Bydo a = (Bydo) aliens.get(j);
Rectangle r2 = a.getBounds();

if (r3.intersects(r2)) {
craft.setVisible(false);
a.setVisible(false);
ingame = false;
}


}

ArrayList ms = craft.getBurst();

for (int i = 0; i < ms.size(); i++) {
Beam m = (Beam) ms.get(i);

Rectangle r1 = m.getBounds();

for (int j = 0; j<aliens.size(); j++) {
Bydo a = (Bydo) aliens.get(j);
Rectangle r2 = a.getBounds();

if (r1.intersects(r2)) {
m.setVisible(false);
a.setVisible(false);
}
}
}
}

public int getDamage() {
return earthealth;
}




public class TAdapter extends KeyAdapter {

public void keyReleased(KeyEvent e) {
craft.keyReleased(e);
}

public void keyPressed(KeyEvent e) {
craft.keyPressed(e);
}
}
}



Boss



import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import javax.swing.JPanel;
import javax.swing.Timer;


public final class Boss extends JPanel implements ActionListener, VariabiliComuni {

protected Timer timer;
protected R9XA craft;
protected Mothership ship;
protected ArrayList aliens;
protected boolean ingame;
protected boolean victory;
protected boolean destroyed;
public int earthealth2 = earth;
protected int BossHP = 100;




public Boss() {

addKeyListener(new Boss.TAdapter());
setFocusable(true);
setBackground(Color.BLACK);
setDoubleBuffered(true);
ingame = true;
victory = false;
destroyed = false;



setSize(StageW, StageH);

craft = new R9XA();
ship = new Mothership();

initAliens2();

timer = new Timer(5, this);
timer.start();
}



public void initAliens2() {
aliens = new ArrayList();

for (int i=0; i<AttackMatrix2.length; i++ ) {
aliens.add(new Bydo(AttackMatrix2[i][0], AttackMatrix2[i][1]));
}
}



public void paint(Graphics g) {
super.paint(g);

if (ingame) {

Graphics2D g2d = (Graphics2D)g;

if (craft.isVisible())
g2d.drawImage(craft.getImage(), craft.getX(), craft.getY(),
this);

g2d.drawImage(ship.getImage(), ship.getX(), ship.getY(),
this);

ArrayList ms = craft.getBurst();

for (int i = 0; i < ms.size(); i++) {
Beam m = (Beam)ms.get(i);
g2d.drawImage(m.getImage(), m.getX(), m.getY(), this);
}

for (int i = 0; i < aliens.size(); i++) {
Bydo a = (Bydo)aliens.get(i);

if (a.isVisible())
g2d.drawImage(a.getImage(), a.getX(), a.getY(), this);

}

g2d.setColor(Color.WHITE);
g2d.drawString("Mothership Energy:" + BossHP, 5, 15);
g2d.drawString("Earth Energy:" + earthealth2, 5, 35);

}


else {
if ((victory == false) &&
(destroyed == false)) {
String msg = "You got destroyed! Failed to protect Earth!";
Font small = new Font("Helvetica", Font.BOLD, 14);
FontMetrics metr = this.getFontMetrics(small);

g.setColor(Color.white);
g.setFont(small);
g.drawString(msg, (StageW - metr.stringWidth(msg)) / 2,
StageH / 2);
}



else if ((victory == false) &&
(destroyed == true)) {
String msg = "Earth got destroyed! Mankind has no more an Home!";
Font small = new Font("Helvetica", Font.BOLD, 14);
FontMetrics metr = this.getFontMetrics(small);

g.setColor(Color.white);
g.setFont(small);
g.drawString(msg, (StageW - metr.stringWidth(msg)) / 2,
StageH / 2);
}

else if ((victory == true) &&
(earthealth2 < 2500)) {
String msg = "Too much damage to Earth! Mankind has become extinct! ";
Font small = new Font("Helvetica", Font.BOLD, 14);
FontMetrics metr = this.getFontMetrics(small);

g.setColor(Color.white);
g.setFont(small);
g.drawString(msg, (StageW - metr.stringWidth(msg)) / 2,
StageH / 2);
}


else if (victory == true) {
String msg = "Invasion Repelled";
Font small = new Font("Helvetica", Font.BOLD, 14);
FontMetrics metr = this.getFontMetrics(small);

g.setColor(Color.white);
g.setFont(small);
g.drawString(msg, (StageW - metr.stringWidth(msg)) / 2,
StageH / 2);


}

}

Toolkit.getDefaultToolkit().sync();
g.dispose();
}



public void actionPerformed(ActionEvent e) {

if (BossHP < 0) {
victory = true;
ingame = false;


}

if (earthealth2 < 0) {
destroyed = true;
ingame = false;
}

ArrayList ms = craft.getBurst();

for (int i = 0; i < ms.size(); i++) {
Beam m = (Beam) ms.get(i);
if (m.isVisible())
m.move();
else ms.remove(i);
}

for (int i = 0; i < aliens.size(); i++) {
Bydo a = (Bydo) aliens.get(i);




if (a.isVisible())
{
a.move2();
if (a.getX() < 40)
earthealth2--;
}
else aliens.remove(i);

}

craft.move();
checkCollisions();
repaint();
}

public void checkCollisions() {

Rectangle r3 = craft.getBounds();

for (int j = 0; j<aliens.size(); j++) {
Bydo a = (Bydo) aliens.get(j);
Rectangle r2 = a.getBounds();

if (r3.intersects(r2)) {
craft.setVisible(false);
a.setVisible(false);
ingame = false;
}


}

ArrayList ms = craft.getBurst();

Rectangle r4 = ship.getBounds();

for (int i = 0; i < ms.size(); i++) {
Beam m = (Beam) ms.get(i);

Rectangle r1 = m.getBounds();

for (int j = 0; j<aliens.size(); j++) {
Bydo a = (Bydo) aliens.get(j);
Rectangle r2 = a.getBounds();

if (r1.intersects(r2)) {
m.setVisible(false);
a.setVisible(false);
}

if (r1.intersects(r4)) {
m.setVisible(false);
BossHP--;
}
}
}
}




public class TAdapter extends KeyAdapter {

@Override
public void keyReleased(KeyEvent e) {
craft.keyReleased(e);
}

@Override
public void keyPressed(KeyEvent e) {
craft.keyPressed(e);
}
}
}



Sinceramente non so' proprio cosa sbaglio.

*Edit*

Per spiegare meglio, sto' cercando una maniera per azzerare l'istanza di Stage prima di lanciare Boss.

Briliant
02-07-2012, 04:36
*update*

Credo che la soluzione sia nel keylistener, in pratica quando lancio la nuova classe il jpanel viene "ridisegnato" nel JFrame (Fin qui tutto a posto, era quello che volevo) ma il KeyListener va' in conflitto con quello precedente.

Tanto e' che lanciando una classe NextLevel che mi apre lo stage 2 in una nuova finestra praticamente la prima si blocca e sulla seconda i comandi funzionano tranquillamente.

Altrimenti non ho la minima idea di cosa possa essere l'errore.