在Android游戏中以固定轨迹在四个不同位置产生敌人

时间:2015-10-23 20:55:03

标签: java android android-studio andengine

这是我的第一款安卓游戏,感谢所有的帮助。我想从屏幕外开始定义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);

            }
        }
    }

}

Enemies课程如下所示:

public class Enemies {

    private Sprite sprite;

    public Enemies(Sprite sprite) {
        this.sprite = sprite;
    }

    public Sprite getSpriteEnemy() {
        return sprite;
    }

    public void setSprite(Sprite sprite) {
        this.sprite = sprite;
    }

    public void mover(int dx, int dy) {
        sprite.setPosition( sprite.getX()+dx, sprite.getY()+dy );
    }

}

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

要回答您的第一个问题,是的,ArrayList可以正常运行。关于轨迹的问题,你需要一些三角函数。

double angle = Math.atan2(sprite.getY()-centerY,sprite.getX()-centerX);

这使用反正切来给出轨迹角度。您可能需要稍微调整此数字以获得精灵的正确旋转角度。

例如,如果您的精灵位于垂直中心但右边缘,此功能将返回0.但是如果您的精灵默认面向前方,则需要在此位置逆时针旋转90度。我不确切知道您的库中旋转的工作原理,但适当的代码可能是sprite.setRotation(angle-Math.PI/2)(PI弧度= 180度)。

答案 1 :(得分:0)

ArrayList可以很好地工作。

关于使用轨迹,我注意到推荐使用三角法的另一条评论。显然你需要这个,假设你想为图像设置一个旋转,虽然我没有注意到你的帖子中有任何东西说你希望敌人面对中心。如果你不需要它,那么使用trig通常是一个糟糕的选择 - 虽然这可能会让你的工作完成你所需要的程度我认为是一个非常简单的应用程序,它通常不是很好因为三角计算非常昂贵,所以你将获得的东西几乎总是不准确。

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