Java 在android游戏中,以固定轨迹在四个不同位置繁殖敌人

Java 在android游戏中,以固定轨迹在四个不同位置繁殖敌人,java,android,android-studio,andengine,Java,Android,Android Studio,Andengine,这是我的第一个android游戏,我感谢所有的帮助。我想定义4个产卵区,从屏幕外的左、右、上、下开始。来自这个区域的敌人有一个固定的轨迹到中心,当这个敌人进入屏幕时,玩家可以将他们移动到一个特定的角落,但是如果它放开它,必须计算一个新的轨迹,使其继续移动到中心 我在思考如何定义这4个区域时遇到了困难,还有4种类型的敌人它们是相同的,但它们有不同的颜色,我应该将这4个敌人放在arrayList上吗?。如果我知道如何定义这4个随机决定产卵地点的产卵区域,那么我就不知道如何定义到中心的固定轨迹。此外,

这是我的第一个android游戏,我感谢所有的帮助。我想定义4个产卵区,从屏幕外的左、右、上、下开始。来自这个区域的敌人有一个固定的轨迹到中心,当这个敌人进入屏幕时,玩家可以将他们移动到一个特定的角落,但是如果它放开它,必须计算一个新的轨迹,使其继续移动到中心

我在思考如何定义这4个区域时遇到了困难,还有4种类型的敌人它们是相同的,但它们有不同的颜色,我应该将这4个敌人放在arrayList上吗?。如果我知道如何定义这4个随机决定产卵地点的产卵区域,那么我就不知道如何定义到中心的固定轨迹。此外,还需要将速度降低到更熟练的速度。抱歉,如果我问的太多了

当前代码看起来像我正在使用的AndEngine库:

public class gameEscene extends baseScene {

    // Regions for images
    private ITextureRegion BackgroundRegion;
    private ITextureRegion Corner;
    private ITextureRegion Center;
    private ITextureRegion Marco;
    // Sprites
    private Sprite spriteBackground;
    private Sprite spriteCorner;
    private Sprite spriteCenter;
    private Sprite spriteMarco;


    //  Enemies
    private ArrayList<Enemies> listEnemies;
    private ITextureRegion regionEnemy;
    //  Time to generate enemies
    private float timeEnemies = 0;              //  Counter
    private float   TIME_LIMIT  =   2.5f;       //  Every 2.5s it creates


    @Override
    public void loadResources() {
        BackgroundRegion = loadImage("black.jpg");
       Corner = loadImage("Corner_T.png");
        Center = loadImage("Center.png");
        Marco = loadImage("m.png");
        regionEnemy = loadimage("ship.png");
    }

    private void createEnemies() {
        for (int x = 700; x <= 1200; x += 100) {
            for (int y = 100; y <= 700; y += 100) {
                Sprite ship = loadSprite(x, y, regionEnemy);
                attachChild(ship);
                Enemies enemy = new Enemies(ship);
                listEnemies.add(enemy);
            }
        }

    }

    @Override
    public void createScene() {
        listEnemies = new ArrayList<>();
        spriteBackground = loadSprite(GameControl.CAMARA_WIDTH/2, GameControl.CAMARA_HEIGHT/2, BackgroundRegion);
        spriteCorner = loadSprite(GameControl.CAMARA_WIDTH/2, GameControl.CAMARA_HEIGHT/2, Corner);
        spriteCenter = loadSprite(GameControl.CAMARA_WIDTH/2, GameControl.CAMARA_HEIGHT/2, Center);
        spriteMarco = loadSprite(GameControl.CAMARA_WIDTH/2, GameControl.CAMARA_HEIGHT/2, Marco);
        attachChild(spriteBackground);
        attachChild(spriteCorner);
        attachChild(spriteCenter);
        attachChild(spriteMarco);
        createEnemies();
    }

    @Override
    public void onBackKeyPressed() {
        // Regresar al menú principal
        admScenes.createMenuScenes();
        admScenes.setScene(SceneType.MENU_SCENE);
        admScene.liberateGameScene();
    }

    @Override
    public sceneType getSceneType() {
        return sceneType.GAME_SCENE;
    }

    @Override
    public void liberateScene() {
        this.detachSelf();
        this.dispose();
    }

    @Override
    public void liberateResources() {
       BackgroundRegion.getTexture().unload();
        Corner.getTexture().unload();
        Center.getTexture().unload();
        Marco.getTexture().unload();
        regionEnemy.getTexture().unload();
        BackgroundRegion = null;
        Corner = null;
        Center = null;
        Marco = null;
        regionEnemy = null;
    }

    @Override
    protected void onManagedUpdate(float pSecondsElapsed)   {

        super.onManagedUpdate(pSecondsElapsed);
        timeEnemies +=  pSecondsElapsed;        //  Acumulates time
        if  (timeEnemies>TIME_LIMIT)    {   //  Time has completed
            tiemeEnemies    =   0;
            Sprite spriteEnemy  =   loadSprite(GameControl.CAMARA_WIDTH+regionEnemy.getWidth(),
                    (float)(Math.random()*GameControl.CAMARA_HEIGHT-regionEnemy.getHeight())    +
                            regionEnemy.getHeight(),regionEnemy);

            Enemies newEnemy = new Enemies(spriteEnemies);
            //newEnemies.mover(0,10);
            listEnemies.add(newEnemy);  //  Adds it to the scene
            attachChild(newEnemy.getSpriteEnemy()); //  Adds it to the list
        }

        //  Updates every enemy and sees if any has gotten out of the screen
        for (int    i=listEnemies.size()-1; i>=0;   i--)    {
            Enemies enemy   =   listEnemies.get(i);
            enemy.mover(-10, 0);
            if  (enemy.getSpriteEnemy().getX()<-enemy.getSpriteEnemy().getWidth())  {
                detachChild(enemy.getSpriteEnemy());        //  Deletes it from the scene
                listEnemies.remove(enemy);                                                                  //  eliminates it from the list
            }
            //  Checks the collision of enemy with another sprite

            if  (spriteCenter.collidesWith(enemy.getSpriteEnemy())) {
                detachChild(enemy.getSpriteEnemy());
                //enemies.remove(enemy);

            }
        }
    }

}

提前感谢您的帮助。

要回答您的第一个问题,是的,ArrayList会很好地工作。关于轨迹的问题,你需要一些三角学

double angle = Math.atan2(sprite.getY()-centerY,sprite.getX()-centerX);
这将使用反切线来提供轨迹角度。您可能需要稍微调整此数字,以获得精灵的正确旋转角度


例如,如果精灵位于垂直中心,但位于右边缘,则此函数将返回0。但是,如果您的精灵在默认情况下面朝前,则需要在此位置将其逆时针旋转90度。我不知道旋转在你的库中是如何工作的,但是一个合适的代码可能是sprite.setRotationangle-Math.PI/2 PI radians=180度。

一个ArrayList可以很好地实现这一点

关于使用轨迹,我注意到另一个建议使用三角学的评论。显然,如果你想设置图像的旋转,你需要这个,尽管我没有注意到你的帖子中有任何内容说你想让敌人面对中心。如果你不需要它,那么使用trig通常是一个糟糕的选择——虽然这可能会在你需要的程度上完成工作,因为我假设这是一个非常简单的应用程序,但这通常不是一个很好的主意,因为trig计算非常昂贵,而且你将获得的几乎总是不准确的


为了在不旋转图像的情况下向中心移动,我建议您只需确定需要移动的梯度,然后使用标量调整此速度向量,使其处于正确的速度(如毕达哥拉斯)。如果你想有一个恒定的速度,你可能还需要平方根函数,这也有点贵,但肯定比使用三角法便宜得多。

我认为你应该解释一下你所描述的数学过程,因为不是每个人都知道。为了确定梯度,你只需计算上升/运行=y1-y2/x1-x2,其中x1,y1和x2,y2分别是敌人和中心的坐标。假设你想要每帧k的距离,那么我们的梯度告诉我们的是y移动的比率/x移动的比率。我们想调整x和y方向的运动,使总运动为k。这是通过计算常数c来实现的,其中c=k/sqrtx1-x2^2+y1-y2^2,那么x和y中的正确运动分别是c*x2-x1和c*y2-y1。你只需将它们加到你的x和y值中,你就可以按照你的要求移动到中心和正确的长度。顺便说一句,你实际上不需要在这里计算梯度。这对理解很有帮助。是的,我知道在这个例子中,你真正需要做的就是取斜率,但是梯度是一个更大的概念。来试试这个。你知道我如何设置4个不同的产卵区,让敌人从屏幕左、右、上、下三个方向出来吗?该区域将随机选择。我要做的是从0到高度生成2个随机数,从0到宽度生成2个随机数,并将繁殖位置设置为0,r1,width,r2,r3,0,r4,height。是否将该坐标发送到类似setPosition的方法中?是,他们确实会的。试过了,但不幸的是,这种方法似乎将精灵设置在那个位置,之后无法移动。
double angle = Math.atan2(sprite.getY()-centerY,sprite.getX()-centerX);