libgdx转向更面向对象的方法

时间:2016-03-04 13:49:33

标签: arrays oop libgdx

所以我是libgdx的新手,最近一直在线学习教程和论坛,创建一个基本游戏,真正了解libgdx的功能。 从i开始,按照https://github.com/libgdx/libgdx/wiki/A-simple-game

中的下拉教程进行操作

我已经玩过并改变了游戏的整个方面,并且已经达到了一个点,我希望改变对象的创建方式,并从矩形数组中绘制到更加面向对象的方法,这样它们不仅有矩形对于碰撞但我也可以轻松地应用和更新游戏对象的变量,例如健康。

drop教程使用矩形数组创建drop, 带有注释掉的代码//是drop教程如何处理产生的drop以及下面的代码是我如何尝试将其转换为Enemy'对象。

 // Array<Rectangle> enemies;
    Array<Enemy> enemies;

alienImage = new Sprite(new Texture(Gdx.files.internal("enemies/alien.png")));

  // enemies = new Array<Rectangle>();
    enemies = new Array<Enemy>();

这个方法被调用来为一个drop或者在我的情况下为敌人创建一个新的矩形。但是在这里我现在想要从我的敌人类中创建一个敌人的实例

private void spawnEnemy() {

   // Rectangle enemy = new Rectangle();
   // enemy.x = MathUtils.random(0, Gdx.graphics.getWidth() - 64);
  //  enemy.y = Gdx.graphics.getHeight();
  //  enemy.setSize(32, 34);
   // enemies.add(enemy);

    Rectangle enemy = new Rectangle();

// maxhhealth,当前生命值,中心x,中心y,宽度,高度,矩形

enemies.add(new Enemy(30,30,300,200,32,34,enemy ));

    lastEnemyTime = TimeUtils.nanoTime();
}

//在渲染方法中,这里是使用矩形滴体数组绘制水滴的地方。但是现在我试图对敌人物体阵列做同样的事情。

    for(Enemy enemy : enemies) {
        game.batch.draw(alienImage, enemy.getenemyX(), enemy.getenemyY(), enemy.getWidth(),enemy.getHeight());
    }

    //for (Rectangle enemy : enemies) {
    //    game.batch.draw(alienImage, enemy.x, enemy.y, enemy.getWidth(),enemy.getHeight());
    //}

////这是我的敌人类,我正在尝试创建一个实例,它有基本变量和一些getter和setter。

public class Enemy {
float enemyX;
static float enemyY;
int width , height, health , maxhealth;
Rectangle enemy = new Rectangle();

public Enemy(int maxHealth, int health, int enemyX, int enemyY, int width , int height, Rectangle enemy) {
    setenemyX(enemyX);
    setenemyY(enemyY);
    setMaxHealth(maxHealth);
    sethealth(health);
    enemy.x = enemyX;
    enemy.y = enemyY;
    enemy.width = width;
    enemy.height = height;

}

public Rectangle getRect(){
    return enemy;
}

public int getWidth() {
    return width;
}

public int getHeight() {
    return height;
}


public int getMaxHealth() {
    return maxhealth;
}

public int getHealth() {
    return health;
}

public float getenemyX() {
    return enemyX;
}

public float getenemyY() {
    return enemyY;
}

public void setMaxHealth(int maxhealth) {
    this.maxhealth = maxhealth;
}

public void sethealth(int health) {
    this.health = health;
}

public void setenemyX(float enemyX) {
    this.enemyX = enemyX;
}

public void setenemyY(float enemyY) {
    this.enemyY = enemyY;
}


}
总的来说,当我运行这段代码时,我的程序运行正常,但是由于试图从一个矩形阵列移动到一个敌人物体阵列,所以“敌人”#39;不再被吸引为了测试这个,我将第一个敌人置于屏幕中间并确保它们不在屏幕上而不移动。

最终我认为我实施了几乎完全相同的方法来绘制和移动“敌人”。对象作为原始的矩形方法,但对libgdx来说是新手,我错过了一些东西而且我真的很难理解它是什么。

没有任何错误,游戏仍然运行良好我无法帮助,但我认为我很接近,长话短说我的问题是我采取了正确的方法使得下拉游戏更加反对导向而我只是遗漏了一些东西,或者是否有更好的方法在libgdx中处理和创建对象。

1 个答案:

答案 0 :(得分:0)

问题很可能与你使用冗余变量并在不同时刻访问其中一个或另一个。

你的Enemy类有x,y,width和height的变量,但它也有一个矩形的变量,它有自己的x,y,width和height。

你的Enemy构造函数在矩形上设置初始大小,但是getWidth和getHeight方法引用了这些的非矩形版本,它们仍然为零,所以你要绘制零大小的精灵。

您需要删除矩形或删除位置和大小变量。

如果删除矩形,请务必删除static变量上的enemyY关键字!

编辑: 保留Rectangle功能的替代解决方案:

public class Enemy extends Rectangle {
    int health, maxHealth;

    public Enemy (float x, float y, float width, float height, int health, int maxHealth) {
        super(x, y, width, height);
        this.health = health;
        this.maxHealth = maxHealth;
    }

}