Java 2d游戏问题

时间:2015-03-16 18:49:04

标签: java sprite game-engine

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

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

让我说我得到了无效的init,渲染,更新。我没有复制整个代码(因为它看起来很乱),但这不是重点,因为游戏运行正常。

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?

1 个答案:

答案 0 :(得分:0)

初学者的常见障碍,以明智和灵活的方式切入状态。每当你需要一个以上的某个实例(比如这里的敌人)时,就不能以一对一的关系将这样一个实体的状态直接绑定到游戏状态。

首先,将敌人状态分解出来并将其作为一个单独的类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()来将敌人的渲染委托给它的渲染方法:

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

点是将状态放在单独的对象中并管理其关系。存在很多简化的可能性(例如,使用继承来利用玩家和敌人之间的共同方面)。我留给你探索。