Я разрабатываю Rogue-подобную игру на Java, и у меня возникли проблемы с функцией атаки. Герой и враги должны атаковать по очереди, но враг движется одновременно с тем, как я перемещаю своего Героя, и когда герой пытается атаковать врага (идя в его направлении), именно Герой получает урон. Я публикую классы, связанные с этой логикой.
public class Engine {
private Hero hero;
private StatusBar statusBar;
private int BOARD_HEIGHT = 10;
private int BOARD_WIDTH = 10;
private List allRooms;
private List gameObjects;
private int currentRoomIndex = 0;
public Engine() {
this.statusBar = new StatusBar();
List roomPaths = Arrays.asList("rooms/room0.txt", "rooms/room1.txt", "rooms/room2.txt");
allRooms = new ArrayList();
for (String path : roomPaths) {
allRooms.add(Room.loadRoom(path));
}
}
private void loadRoom(List roomObjects) {
ImageMatrixGUI.getInstance().clearImages();
ImageMatrixGUI.getInstance().newImages(roomObjects);
this.gameObjects = roomObjects;
}
public void removeObject(GameObject obj) {
gameObjects.remove(obj);
ImageMatrixGUI.getInstance().removeImage(obj);
System.out.println(obj.getName() + " was removed from the game.");
}
public void notify(int keyPressed) {
Direction direction = null;
switch (keyPressed) {
case KeyEvent.VK_UP:
direction = Direction.UP;
break;
case KeyEvent.VK_DOWN:
direction = Direction.DOWN;
break;
case KeyEvent.VK_LEFT:
direction = Direction.LEFT;
break;
case KeyEvent.VK_RIGHT:
direction = Direction.RIGHT;
break;
}
if (direction != null) {
Position newHeroPosition = hero.move(direction, this);
if (isValidMove(newHeroPosition)) {
hero.setPosition(newHeroPosition);
}
for (GameObject obj : new ArrayList(gameObjects)) {
if (obj instanceof MovingObject && obj != hero) {
MovingObject enemy = (MovingObject) obj;
Position enemyNewPosition = enemy.move(this);
if (enemyNewPosition.equals(hero.getPosition())) {
enemy.attack(hero);
}
}
}
}
}
public boolean isValidMove(Position newPosition) {
for (GameObject obj : gameObjects) {
if (obj.getPosition().equals(newPosition) && !obj.isTransposable()) {
return false;
}
}
return true;
}
public GameObject getObjectAtPosition(Position position) {
for (GameObject obj : gameObjects) {
if (obj.getPosition().equals(position)) {
return obj;
}
}
return null;
}
public Hero getHero() {
return hero;
}
public void init() {
ImageMatrixGUI gui = ImageMatrixGUI.getInstance();
gameObjects = allRooms.get(currentRoomIndex);
loadRoom(gameObjects);
hero = new Hero(new Position(5, 3), 1, statusBar);
gameObjects.add(hero);
statusBar = new StatusBar();
List bar = statusBar.getBarTiles();
gui.setEngine(this);
gui.newStatusImages(bar);
gui.newImages(gameObjects);
gui.go();
gui.setStatus("Game has started");
while (true) {
gui.update();
}
}
public static void main(String[] args) {
Engine engine = new Engine();
engine.init();
}
}
public abstract class MovingObject extends GameObject {
protected static final List DIRECTIONS = Arrays.asList(Direction.UP, Direction.DOWN, Direction.LEFT, Direction.RIGHT);
protected static final Random RANDOM = new Random();
private int damage;
private int health;
public MovingObject(Position position, int damage, int health) {
super(position);
this.damage = damage;
this.health = health;
}
public MovingObject(Position position) {
this(position, 1, 100);
}
public Position move(Engine engine) {
Hero hero = engine.getHero();
Position heroPosition = hero.getPosition();
if (isNearHero(heroPosition)) {
moveTowardsHero(heroPosition, engine);
} else {
moveRandomly(engine);
}
return getPosition();
}
private boolean isNearHero(Position heroPosition) {
int distanceX = Math.abs(getPosition().getX() - heroPosition.getX());
int distanceY = Math.abs(getPosition().getY() - heroPosition.getY());
return distanceX 0 ? Direction.RIGHT : Direction.LEFT;
} else {
return deltaY > 0 ? Direction.DOWN : Direction.UP;
}
}
public void attack(Hero hero) {
System.out.println("Enemy attacks Hero!");
hero.takeDamage(damage);
}
public void takeDamage(int damage, Engine engine) {
health -= damage;
System.out.println(getName() + " took " + damage + " damage. Health remaining: " + health);
if (health
Подробнее здесь: https://stackoverflow.com/questions/791 ... inflicting
Игра-рогалик: почему мой герой и враг не атакуют по очереди и не наносят друг другу урон при столкновении? ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как я могу заставить каждый из моих объектов «отскакивать» друг от друга при столкновении?
Anonymous » » в форуме JAVA - 0 Ответы
- 42 Просмотры
-
Последнее сообщение Anonymous
-