Java 2d游戏问题
Java 2d game issue
我用 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 吗?
初学者的常见障碍,以一种明智而灵活的方式切片状态。每当您可能需要某个事物的多个实例(例如此处的敌人)时,您 不能 以一对一的关系将此类实体的状态直接绑定到游戏状态。
所以首先,分解出敌人状态并将其作为一个单独的class敌人:
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))
。
你仍然希望敌人追逐玩家,所以追逐方法也进入敌人class。它接收要追踪的位置作为参数:
public void chase(float mainPositionX, float mainPositionY) {
...
}
然后你从 GameState 中循环调用它,就像你在 render() 中所做的那样:
for (Enemy enemy : enemies) {
enemy.chase(mainPositionX, mainPositionY);
}
关键要点是将状态放在单独的对象中并管理它们的关系。还有很多简化的可能性(例如,使用继承来利用 Player 和 Enemy 之间的共同点)。我留给你去探索。
我用 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 吗?
初学者的常见障碍,以一种明智而灵活的方式切片状态。每当您可能需要某个事物的多个实例(例如此处的敌人)时,您 不能 以一对一的关系将此类实体的状态直接绑定到游戏状态。
所以首先,分解出敌人状态并将其作为一个单独的class敌人:
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))
。
你仍然希望敌人追逐玩家,所以追逐方法也进入敌人class。它接收要追踪的位置作为参数:
public void chase(float mainPositionX, float mainPositionY) {
...
}
然后你从 GameState 中循环调用它,就像你在 render() 中所做的那样:
for (Enemy enemy : enemies) {
enemy.chase(mainPositionX, mainPositionY);
}
关键要点是将状态放在单独的对象中并管理它们的关系。还有很多简化的可能性(例如,使用继承来利用 Player 和 Enemy 之间的共同点)。我留给你去探索。