2016-03-04 82 views
0

所以我是libgdx的新手,最近一直在線教程和論壇來創建一個基本的遊戲,以真正瞭解libgdx的能力。 開始與我跟着這裏找到下落教程https://github.com/libgdx/libgdx/wiki/A-simple-gamelibgdx轉向更面向對象的方法

因爲我已經圍繞發揮,改變了整個遊戲方面都達到一個地步,我希望改變如何創建和繪製的對象從數組矩形轉換爲面向對象的方法,因此它們不僅具有用於碰撞的矩形,而且還可以輕鬆地應用和更新遊戲對象(如健康)的變量。

Drop教程使用矩形數組創建滴, 使用//註釋掉的代碼是drop教程處理產卵滴的方式,下面的代碼是如何試圖將其轉換爲敵人的對象數組。

// 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>(); 

這個方法被調用來創建一個新的矩形或在我的情況下是一個敵人。但是在這裏,我現在想從我的敵人類中創建一個敵人的實例

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; 
} 


} 

總的來說,當我運行這段代碼我的程序運行正常,但由於試圖從矩形陣列移動到敵人的對象數組的「敵人」不再被繪製。爲了測試這一點,我將第一個敵人集中在屏幕中間,並確保他們不僅僅是在屏幕外而且不移動。

最終我認爲我實現了幾乎完全相同的方法來繪製和移動「原始矩形方法」的「敵方」對象,但是對於libgdx而言,我缺少一些東西,並且我真的堅持了原來的樣子。

與缺乏任何錯誤和遊戲仍然運行良好我不能幫助,但認爲我關閉然而,長話短說我的問題是我採取了正確的方法使滴遊戲更加反對導向,我只是失蹤有些東西,還是有更好的方式來處理和創建libgdx中的對象。

回答

0

這個問題很可能與您使用冗餘變量並在不同時刻訪問其中一個或另一個有關。

你的Enemy類有x,y,寬度和高度的變量,但它也有一個矩形的變量,它有自己的x,y,寬度和高度。

Your Enemy構造函數在矩形上設置初始大小,但getWidth和getHeight方法引用這些的非矩形版本,它們仍然爲零,因此您正在繪製零大小的精靈。

您可能需要刪除矩形或刪除位置和大小變量。

如果您刪除矩形,請確保您還刪除enemyY變量中的static關鍵字!

編輯: 備用,保留矩形功能的解決方案:

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; 
    } 

} 
+0

我也跟着你的領導,並確保正確的高度和寬度被稱爲現在的精靈繪製,並去除靜態關鍵字y是後現在回到正常移動:)。 但是現在我有一個問題矩形碰撞不能像以前那樣正常工作。 在渲染過程中,我有一個穿過敵人陣列的小循環。 我有一個條件語句if(enemy.getRect()。overlap(player)) 來檢測碰撞,但它似乎沒有運行。任何想法在什麼我想念? – user2920648

+0

如果你想利用矩形的'overlaps'方法,那麼你可以做與你所做的相反的...刪除四個變量並使用矩形代替。或者你可以爲你的敵人級別創建自己的'overlapps'方法。或者最好,刪除這四個變量**和**矩形,並讓你的敵人擴展矩形。並讓玩家擴展矩形。然後你可以像現在一樣繼續使用'overlapps'。 – Tenfour04

+0

嗯好吧謝謝,這聽起來像延長矩形將是最好的方式去。我現在有點失去了我的敵人階級應該包含的東西。你可以給一個簡單的例子,如果我理解正確 – user2920648