首页 > 解决方案 > 在java游戏中为多个实体设置方向的问题

问题描述

我不想给我所有的 gost 实体一个随机的方向,但我不知道如何

我已经设法将我的所有实体方向设置为在 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);

    }

我不希望我的实体有一个随机方向而不是一个静态。

标签: javaentity

解决方案


所以你有几个问题。第一个是您将单个“gost”对象定义为全局变量。然后您多次设置它的值并将其添加到 ArrayList。我的假设是您的列表中只有一个 gost。

这是您的代码,并进行了一些修改。我没有测试任何这些,但试一试。

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);
    }
}

推荐阅读