Я занимаюсь этим проектом для этого семестрового класса, и это в основном очень простая игра типа Rogue Like.У меня возникают проблемы с остановкой движения этого объекта (летучей мыши), когда он пытается прыгнуть в локацию игроков (героев) и атаковать вместо этого, но он все еще пересекается со спрайтом игроков.Первый код принадлежит классу Bat, а второй - основной класс Rogue, запускающий игру.Есть также класс ImageMatrixGUI, который реализует игровое окно и спрайты.Заранее спасибо.
private static final int HP=3;
private static final int DAMAGE=1;
public Bat(Point2D position) {
super(position);
setHP(HP);
setDamage(DAMAGE);
// TODO Auto-generated constructor stub
}
@Override
public int getLayer() {
// TODO Auto-generated method stub
return 1;
}
@Override
public void move() {
Random ran = new Random();
int i = ran.nextInt(2);
if(i==0) {
Vector2D v = Vector2D.movementVector(getPosition(), Rogue.getInstance().getHeroPosition());
if(getPosition().plus(v) == Rogue.getInstance().getHeroPosition()) {
attack(getPosition().plus(v));
v = new Vector2D(0,0);
}
setPosition(getPosition().plus(v));
}else {
Point2D nextP = getPosition().plus(Direction.random().asVector());
if(nextP == Rogue.getInstance().getHeroPosition()) {
attack(nextP);
nextP = new Point2D(0,0);
}
if(nextP.getX()<1 || nextP.getY()<1 || nextP.getX()>8 || nextP.getY()>8)
nextP=getPosition();
setPosition(nextP);
}
}
@Override
public void attack(Point2D p) {
Rogue.getInstance().dealDamage(DAMAGE);
}
}
private static final Rogue INSTANCE = new Rogue();
// Singleton pattern: private constructor
private Rogue() {
// Do not delete/change or move these three lines
ImageMatrixGUI.setSize(WIDTH, HEIGHT + 1); // +1 because last row is the status bar
ImageMatrixGUI.getInstance().registerObserver(this);
ImageMatrixGUI.getInstance().setStatusMessage("Rogue Game Test"); // Try other message, keep track of the room number using this message
// staticInit() should be replaced by initFromFile(FILENAME); after first phase with FILENAME = "config/map.txt"
staticInit();
}
// Singleton pattern inspector
public static Rogue getInstance() {
return INSTANCE;
}
// Initialization for 1st phase
private void staticInit() {
hero = new Hero(new Point2D(1,1));
skeleton = new Skeleton(new Point2D(WIDTH-2, 1));
bat = new Bat(new Point2D(1, HEIGHT-2));
sword = new Sword(new Point2D(WIDTH-2, HEIGHT-2));
for(int w=0; w<WIDTH; w++) {
for(int h=0; h<=HEIGHT; h++) {
if(h<HEIGHT)
ImageMatrixGUI.getInstance().addImage(new Floor(new Point2D(w,h)));
if(w<WIDTH-3 && h==HEIGHT) {
ImageMatrixGUI.getInstance().addImage(new Green(new Point2D(w,h)));
ImageMatrixGUI.getInstance().addImage(new Black(new Point2D(w+3,h)));
}
}
}
for(int w=0; w<WIDTH; w++) {
for(int h=0; h<=HEIGHT-1; h++) {
ImageMatrixGUI.getInstance().addImage(new Wall(new Point2D(w,h)));
if(w!=0 && w!=WIDTH-1)
h+=HEIGHT-2;
}
}
ImageMatrixGUI.getInstance().addImage(hero);
ImageMatrixGUI.getInstance().addImage(skeleton);
ImageMatrixGUI.getInstance().addImage(bat);
ImageMatrixGUI.getInstance().addImage(sword);
// TODO: Initialize other objects in the appropriate lists (use a Factory to make switch to file-based initialization easy)
}
// Starting-up GUI
public void go() {
ImageMatrixGUI.getInstance().go();
ImageMatrixGUI.getInstance().update();
}
public Point2D getHeroPosition() {
return hero.getPosition();
}
public void dealDamage(int i) {
hero.getDamaged(i);
}
public int getTurn() {
return turn;
}
public int getWidth() {
return WIDTH;
}
public int getHeight() {
return HEIGHT;
}
// Called everytime a key is pressed
@Override
public void update(Observed source) {
int keyPressed = ImageMatrixGUI.getInstance().keyPressed();
Direction d = Direction.directionFor(keyPressed);
hero.move(d);
skeleton.move();
bat.move();
turn++;
//TODO: what else?
ImageMatrixGUI.getInstance().update();
}