Hallo,
ich habe leider ein Problem mit meinem Spiel Space Invaders. Irgendwie werden manchmal mehrere Aliens auf einmal abgeschossen. Das liegt da dran, dass die Aliens horizontal sich hin und her bewegen. Leider weiß ich nicht, wie man das Problem lösen kann. Hier ist mein Code, ich hoffe ihr könnt mir helfen. Danke im Voraus.
ich habe leider ein Problem mit meinem Spiel Space Invaders. Irgendwie werden manchmal mehrere Aliens auf einmal abgeschossen. Das liegt da dran, dass die Aliens horizontal sich hin und her bewegen. Leider weiß ich nicht, wie man das Problem lösen kann. Hier ist mein Code, ich hoffe ihr könnt mir helfen. Danke im Voraus.
Java:
package pp2013.gruppe12.server.engine;
import pp2013.gruppe12.shared.Map;
import pp2013.gruppe12.shared.Player;
import pp2013.gruppe12.shared.Tile;
public class Shoot extends Thread {
private Map map;
private ServerEngine serverEngine;
private boolean shot;
private Player player;
/**
* This method is used by ServerEngine for when a shot has been fired
* @param shot if a shot has been fired
*/
public void setBoolean(Boolean shot){
this.shot= shot;
}
/**
* This is the constructor so set the map and serverEngine
* @param map the map be to set
* @param serverEngine the serverEngine to be set
* @param player the player to be set
*/
public Shoot(Map map, ServerEngine serverEngine, Player player){
this.map=map;
this.serverEngine=serverEngine;
this.player=player;
}
/**
* This method constantly checks if a shot has been fired
*/
public void run(){
while(true){
try{
sleep(10);
}catch (InterruptedException e) {
e.printStackTrace();
}
if(shot==true){
shot=false;
shoot();
}
}
}
/**
* This method reacts after a shot has been fired
*/
public void shoot(){
if(map.getTilePosition(Tile.MYPOSITION)!=null){
int xMyPosition=(int) map.getTilePosition(Tile.MYPOSITION).getX();//change
if(map.getTile(xMyPosition, 6).getTileID()!=Tile.HOUSE){
synchronized(map){
for(int y=6; y>=0; y--){
int currentTileID=map.getTile(xMyPosition, y).getTileID();
if(currentTileID==Tile.EMPTY){
map.setTile(xMyPosition,y, Tile.SHOT);//set new tile as shot
if(map.getTile(xMyPosition, y+1).getTileID()==Tile.SHOT){//clean the last tile
map.setTile(xMyPosition, y+1, Tile.EMPTY);
}
serverEngine.sendToClient(map);
}else if(map.getTile(xMyPosition, y).getTileID()==Tile.INVADERS||map.getTile(xMyPosition, y).getTileID()==Tile.BOMB){
//TODO bomb wird noch als punkt gezaehlt
map.setTile(xMyPosition, y, Tile.EXPLOSION);
map.setTile(xMyPosition, y+1, Tile.EMPTY);
serverEngine.sendToClient(map);
}try {
sleep(200);//so one can see the shot moving
} catch(InterruptedException e) {e.printStackTrace();}
if(map.getTile(xMyPosition, y).getTileID()==Tile.EXPLOSION){
map.setTile(xMyPosition, y, Tile.EMPTY);
player.minusInvadersLeft();
player.addPoint();
if(player.getInvadersLeft()==0){
player.increaseLevel();
player.setInvadersLeft(40);
map.setInvaders();
}
serverEngine.sendToClient(player);
serverEngine.sendToClient(map);
break;// so the bullet stops moving and shooting invaders
}
if(y==0){ //if the bullet is at the top and has not hit anything, then the bullet disappears
map.setTile(xMyPosition, y, Tile.EMPTY);
serverEngine.sendToClient(map);
}
}
}
}
}
}
}
Java:
package pp2013.gruppe12.server.engine;
import pp2013.gruppe12.shared.Map;
import pp2013.gruppe12.shared.Tile;
public class MoveInvaders extends Thread {
private Map map;
private ServerEngine serverEngine;
public MoveInvaders(Map map, ServerEngine serverEngine){
this.map=map;
this.serverEngine=serverEngine;
}
public void run(){
while(true){
try{
sleep(10);
}catch (InterruptedException e) {
e.printStackTrace();
}
moveInvaders();
}
}
public void moveInvaders(){
int max=0;
int min=13;
for(int i=0; i<Map.WIDTH;i++){
for (int j=0; j<Map.HEIGHT; j++){
if(map.getTile(i, j).getTileID()==Tile.INVADERS){
if(i<min){
min=i;
}
if(i>max){
max=i;
}
}
}
}
int rightSpace=13-max;
int leftSpace=min;
if(leftSpace>=rightSpace){
while(leftSpace>0){
for(int i=0; i<Map.WIDTH;i++){
for (int j=0; j<Map.HEIGHT; j++){
if(map.getTile(i, j).getTileID()==Tile.INVADERS){
map.setTile(i-1,j,Tile.INVADERS);
map.setTile(i,j,Tile.EMPTY);
//serverEngine.setMap(map);
serverEngine.sendToClient(map);
}
}
}try {
sleep(1500);//so one can see the invaders moving
} catch(InterruptedException e) {e.printStackTrace();}
leftSpace--;
}
}else if(leftSpace<rightSpace){
while(rightSpace>0){
for(int i=Map.WIDTH-1; i>=0;i--){
for (int j=Map.HEIGHT-1; j>=0; j--){
if(map.getTile(i, j).getTileID()==Tile.INVADERS){
map.setTile(i+1,j,Tile.INVADERS);
map.setTile(i,j,Tile.EMPTY);
//serverEngine.setMap(map);
serverEngine.sendToClient(map);
}
}
}try {
sleep(1500);//so one can see the invaders moving
} catch(InterruptedException e) {e.printStackTrace();}
rightSpace--;
}
}
}
}