Проблема с настройкой направления для нескольких объектов в Java-игре - PullRequest
0 голосов
/ 18 апреля 2019

Я не хочу указывать всем своим гостевым объектам случайное направление, но я не могу понять, как

Мне удалось установить все мои сущности Направление, чтобы они двигались либо по шагам X, либо по Y, но это статическое движение, есть ли способ их произвольного перемещения? может быть, используя какой-то таймер?

    private GameScreen gs;

    private boolean gameRunning = true;
    private int fps;

    private Entity player;

    private ArrayList<Entity> entityList = new ArrayList<>();

    private HashMap<String, Boolean> keyDown = new HashMap<>();

        public void loadObjects() {
        Image playerImg = new ImageIcon(getClass().getResource("/playerImg.png")).getImage();
        Image gostImg = new ImageIcon(getClass().getResource("/gostImg.png")).getImage();

        player = new Entity(playerImg, 100, 200, 200);

        entityList.add(player);
        entityList.add(new Entity(gostImg, 224, 350, 60));
        entityList.add(new Entity(gostImg, 460, 250, 60));
        entityList.add(new Entity(gostImg, 624, 300, 60));
        entityList.add(new Entity(gostImg, 942, 550, 60));
        entityList.add(new Entity(gostImg, 520, 560, 60));
    }

    public void update(long deltaTime) {
        checkCollisionandRemove();

        if(keyDown.get("right")) {
            player.setDirectionX(1);
            player.setDirectionY(0);
        }
        else if(keyDown.get("left")){
            player.setDirectionX(-1);
            player.setDirectionY(0);
        }

        if(keyDown.get("up")) {
            player.setDirectionY(-1);
            player.setDirectionX(0);
        }
        else if(keyDown.get("down")) {
            player.setDirectionY(1);
            player.setDirectionX(0);
        }

        if(player.getX() < 0) {
            player.setX(0);
        }

        if(player.getX() > gs.getWidth() -  player.getWidth()) {
            player.setX(gs.getWidth() -  player.getWidth());
        }

        if(player.getY() < 0) {
            player.setY(0);
        }

        if(player.getY() > gs.getHeight() -  player.getHeight()) {
            player.setY(gs.getHeight() -  player.getHeight());
        }

        for(Entity entity : entityList) {
            entity.moveX(deltaTime);
            entity.moveY(deltaTime);
            entity.setDirectionX(1);

            if(entity.equals(player)) {
                player.setDirectionX(0);
                player.setDirectionY(0);
            }

            if(entity.getX() < 0){
                entity.setX(0);
            }

            if(entity.getX() > gs.getWidth() - entity.getWidth()) {
                entity.setX(gs.getWidth() - entity.getWidth());
            }

            if(entity.getY() < 0) {
                entity.setY(0);
            }

            if(entity.getY() > gs.getHeight() - entity.getHeight()) {
                entity.setY(gs.getHeight() - player.getHeight());
            }
        }

        player.moveX(deltaTime);
        player.moveY(deltaTime);

    }

Я не хочу, чтобы мои сущности имели случайное направление вместо одного статического.

1 Ответ

0 голосов
/ 18 апреля 2019

Итак, у вас есть несколько проблем.Во-первых, у вас есть единственный объект "gost", определенный как глобальная переменная.Затем вы устанавливаете значение несколько раз и добавляете его в ArrayList.Я предполагаю, что в вашем списке только один гост.

Вот ваш код с несколькими изменениями.Я не проверял ничего из этого, но попробовал.

private GameScreen gs;

private boolean gameRunning = true;
private int fps;

private Entity player;

//private Entity gost; Removed because I don't think you need this. 

private ArrayList<Entity> entityList = new ArrayList<>();

private HashMap<String, Boolean> keyDown = new HashMap<>();

public void loadObjects() {
    Image playerImg = new ImageIcon(getClass().getResource("/playerImg.png")).getImage();
    Image gostImg = new ImageIcon(getClass().getResource("/gostImg.png")).getImage();

    player = new Entity(playerImg, 100, 200, 200);
    //entityList.add(player); I don't think you need this either, unless you check all of your entities in your checkCollisionandRemove() method

    //Create your "Gost" entities this way.
    entityList.add(new Entity(gostImg, 224, 350, 10));
    entityList.add(new Entity(gostImg, 460, 20, 10));
    entityList.add(new Entity(gostImg, 624, 300, 10));
    entityList.add(new Entity(gostImg, 942, 550, 20));
    entityList.add(new Entity(gostImg, 520, 760, 30));
}
public void update(long deltaTime) {
    checkCollisionandRemove();

    if(keyDown.get("right")) {
        player.setDirectionX(1);
        player.setDirectionY(0);
    }
    else if(keyDown.get("left")){
        player.setDirectionX(-1);
        player.setDirectionY(0);
    }

    if(keyDown.get("up")) {
        player.setDirectionY(-1);
        player.setDirectionX(0);
    }
    else if(keyDown.get("down")) {
        player.setDirectionY(1);
        player.setDirectionX(0);
    }

    if(player.getX() < 0) {
        player.setX(0);
    }

    if(player.getX() > gs.getWidth() -  player.getWidth()) {
        player.setX(gs.getWidth() -  player.getWidth());
    }

    if(player.getY() < 0) {
        player.setY(0);
    }

    if(player.getY() > gs.getHeight() -  player.getHeight()) {
        player.setY(gs.getHeight() -  player.getHeight());
    }

    player.moveX(deltaTime);
    player.moveY(deltaTime);

    //Move each gost this way.
    for(Entity entity : entityList) {   
        /*
            If you need to include your player object into the entity list you will need a way to tell whether entity is a gost or player.
            Something like: if(entity.getType().equalsIgnoreCase("gost")) then move
        */

        entity.moveX(deltaTime);
        entity.moveY(deltaTime);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...