Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 2d游戏问题_Java_Sprite_Game Engine - Fatal编程技术网

Java 2d游戏问题

Java 2d游戏问题,java,sprite,game-engine,Java,Sprite,Game Engine,我用Slick2d库创建了2d java游戏。这个游戏是关于白色(玩家)和红色(敌人)方块的。在640 x 640游戏板上,红色的追白色的,你的任务是从红色的跑开,四处移动。。。很简单 我的问题是,我只定义了1个敌人追击者,我想被更多的人追击。我希望它就像当我按下“N”键时,另一个红色方块出现并开始追赶我。我再次按下“N”键,所以从现在起3个红色方块在追我。我希望它是这样的,我可以无限次地按下“N”,然后更多的红色方块出现 假设我得到了void init,render,update。我没有复制整

我用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);
 }
}
}
public类PlayTestState扩展了BasicGameState{
//移动法代表移动白色方块(玩家用箭头移动)
无效移动(输入){
if(input.isKeyDown(input.KEY_UP)){
//人类=移动;
主位置Y-=0.5f;
如果(主位置Y<32){
主位置Y+=0.5f;
}
}
if(input.isKeyDown(input.KEY_DOWN)){
//人类=移动;
主位置Y+=0.5f;
如果(主位置Y>576){
主位置Y-=0.5f;
}
}
if(input.isKeyDown(input.KEY_左)){
//人类=移动;
主位置X-=0.5f;
如果(主位置X<32){
主位置X+=0.5f;
}
}
if(input.isKeyDown(input.KEY_RIGHT)){
//人类=移动;
主位置X+=0.5f;
如果(主位置X>576){
主位置X-=0.5f;
}
}
}
想象你,敌人;
双主字符速度=0.5;
双enemyCharacterSpeed=0.3;
float main positionx=320;//表示白方块(玩家)开始位置
浮动主位置Y=320;
float enemyPositionX=320;//表示红方块(敌人-计算机)起始位置
漂浮灌肠位y=96;
//那个追逐法代表红场追逐白场
void chase(){
如果(enemyPositionYmainPositionX)
enemyPositionX-=enemyCharacterSpeed;
如果(enemyPositionXmainPositionY)
灌肠位置-=灌肠特征速度;
}
public void init(GameContainer gc、StateBasedGame sbg)
抛出异常{
you=新图像(“res/draws/mainCharacter.png”);
敌人=新图像(“res/draws/enemyCharacter.png”);
}
公共void渲染(GameContainer gc、StateBasedGame sbg、Graphics g)
抛出异常{
绘制(主位置X、主位置Y);
敌人.抽签(灌肠姿势X,灌肠姿势Y);
}
公共无效更新(GameContainer gc、StateBasedGame sbg、int delta)
抛出异常{
Input=gc.getInput();
移动(输入);
}
}
}
有什么办法吗?
我必须用敌方对象制作某种数组列表吗?

对于初学者来说,这是一个常见的障碍,以一种明智而灵活的方式分割状态。当您需要某个对象的多个实例(如此处的敌人)时,您不能以一对一的关系将此类实体的状态直接绑定到游戏状态

因此,首先,将敌国划分为单独的敌国:

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替换为以下内容,将游戏状态更改为容纳多个敌人:

class GameState {
    List<Enemy> enemies = new ArrayList<>();
}
现在让你的render()方法处理敌人列表,因此改变游戏状态的render()以将敌人的渲染委托给它的render方法:

public void render(...) {
    you.draw(...);
    for (Enemy enemy : enemies) {
        enemy.render(...);
    }
}
现在添加一个新敌人就像创建最初的敌人一样简单:
敌人。添加(新敌人(x,y))

你仍然希望敌人追逐玩家,因此追逐方法也进入敌人类。并将要追踪的位置作为参数接收:

 public void chase(float mainPositionX, float mainPositionY) {
     ...
 }
然后在循环中从游戏状态调用它,就像在render()中一样:


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

是的。类似于if(input==“N”)敌人。添加(new敌军());然后更新整个列表。但是如果一个敌人有一些由enemyPositionX、enemyPositionY定义的位置参数,那么另一个敌人也有相同的参数,这将使他处于相同的位置:/仔细看看Bene暗示了什么;你需要从游戏状态中移除敌人的位置,创建一个类敌人,并让游戏状态保存一个敌人实例列表。我也这么想,但不知道如何将这些游戏状态类与enemyClass连接起来。我想也许我能做到这一点:{我对这类事情非常熟悉:/
 public void chase(float mainPositionX, float mainPositionY) {
     ...
 }
 for (Enemy enemy : enemies) {
     enemy.chase(mainPositionX, mainPositionY);
 }