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