【问题标题】:Java 2d game issueJava 2d 游戏问题
【发布时间】:2015-03-16 18:49:04
【问题描述】:

我用 Slick2d 库创建了 2d java 游戏。这个游戏是关于白色(玩家)和红色(敌人)方格的。红色的人在 640 x 640 的游戏板上追逐白色的人,而你的任务是逃离红色的人,四处走动......非常简单。

我的问题是,我只定义了 1 个敌人追逐者,我想被更多人追逐。我希望它就像当我按下“N”键时,另一个红色方块出现并开始追我。我再次按“N”键,所以从现在开始有 3 个红色方块在追我。我希望它就像我可以无限按“N”次,然后会出现更多的红色方块。

假设我得到了 void init、render、update。我没有复制整个代码(因为它看起来很乱),但这不是重点,因为游戏运行正常。

public class PlayTestState extends BasicGameState {

// moving method stands for moving WHITE square (player moves it with arrows)
void moving(Input input) {
        if (input.isKeyDown(Input.KEY_UP)) {
            // human = movingUp;
            mainPositionY -= .5f;

            if (mainPositionY < 32) {
                mainPositionY += .5f;
            }
        }
        if (input.isKeyDown(Input.KEY_DOWN)) {
            // human = movingUp;
            mainPositionY += .5f;

            if (mainPositionY > 576) {
                mainPositionY -= .5f;
            }
        }
        if (input.isKeyDown(Input.KEY_LEFT)) {
            // human = movingUp;
            mainPositionX -= .5f;

            if (mainPositionX < 32) {
                mainPositionX += .5f;
            }

        }
        if (input.isKeyDown(Input.KEY_RIGHT)) {
            // human = movingUp;
            mainPositionX += .5f;

            if (mainPositionX > 576) {
                mainPositionX -= .5f;
            }
        }
    }


Image you, enemy;

double mainCharacterSpeed = 0.5;
double enemyCharacterSpeed = 0.3;

float mainPositionX = 320; // stands for white square (player) start position
float mainPositionY = 320;

float enemyPositionX = 320; // stands for red square (enemy - computer) start position
float enemyPositionY = 96;

    //that chase method stands for red square chasing after white one
     void chase() {  
        if (enemyPositionY < mainPositionY)
            enemyPositionY += enemyCharacterSpeed;
        if (enemyPositionX > mainPositionX)
            enemyPositionX -= enemyCharacterSpeed;
        if (enemyPositionX < mainPositionX)
            enemyPositionX += enemyCharacterSpeed;
        if (enemyPositionY > mainPositionY)
            enemyPositionY -= enemyCharacterSpeed;
    }

    public void init(GameContainer gc, StateBasedGame sbg)
                throws SlickException {


    you = new Image("res/draws/mainCharacter.png");
    enemy = new Image ("res/draws/enemyCharacter.png");
        }
public void render(GameContainer gc, StateBasedGame sbg, Graphics g)
            throws SlickException {
you.draw(mainPositionX, mainPositionY);
        enemy.draw(enemyPositionX, enemyPositionY);
}
public void update(GameContainer gc, StateBasedGame sbg, int delta)
            throws SlickException {
Input input = gc.getInput();
moving(input);
 }
}
}

任何想法如何做到这一点? 我必须用敌人对象制作某种 ArrayList 吗?

【问题讨论】:

  • 是的。类似 if(input == "N")enemy.add(new Enemy());然后更新整个列表。
  • 但是如果1个敌人有一些由enemyPositionX,enemyPositionY定义的位置参数,那么另一个gona具有相同的参数,这将使他处于相同的位置:/
  • 仔细看看 Bene 暗示了什么;您需要从 GameState 中删除敌人位置,创建一个类 Enemy 并让 GameState 保存一个 List 的 Enemy 实例。
  • 我也是这么想的,但有点不知道如何将这些 playState 类与enemyClass 联系起来。我想也许我可以这样:{
  • 我非常适合这种事情的初学者:/

标签: java sprite game-engine


【解决方案1】:

初学者的常见障碍,以明智和灵活的方式切片状态。每当您可能需要多个某事物的实例(例如此处的敌人)时,您无法将此类实体的状态直接与游戏状态以一对一的关系联系起来。

首先,将敌人状态分解为一个单独的类 Enemy:

class Enemy {
    float x, y;
    Image image = ...

    // creates an enemy
    public Enemy(float x, float y) {
        this.x = x;
        this.y = y;
    }

    // draws this enemy
    public void render(...) {
        ...
    }
}

通过将enemyPositionX 和enemyPositionY 替换为:

将GameState 更改为容纳多个敌人
class GameState {
    List<Enemy> enemies = new ArrayList<>();
}

现在列表最初是空的,所以你需要明确地创建一个敌人,例如在 GameState 的 init() 方法中:

enemies.add(new Enemy(320, 96));

现在让你的 render() 方法处理敌人列表,所以改变你的 GameState 的 render() 以将敌人的渲染委托给它的 render 方法:

public void render(...) {
    you.draw(...);
    for (Enemy enemy : enemies) {
        enemy.render(...);
    }
}

现在添加新敌人就像创建初始敌人一样简单:enemies.add(new Enemey(x, y))

你仍然希望敌人追逐玩家,所以追逐方法也进入了敌人类。它接收作为参数的要追逐的位置:

 public void chase(float mainPositionX, float mainPositionY) {
     ...
 }

然后在循环中从 GameState 中调用它,就像在 render() 中一样:

 for (Enemy enemy : enemies) {
     enemy.chase(mainPositionX, mainPositionY);
 }

关键点是将状态放在单独的对象中并管理它们的关系。还有很多简化的潜力(例如,使用继承来利用 Player 和 Enemy 之间的共同点)。我把它留给你去探索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多