0

次のように動作するようには見えません: このメソッド checkEnemyHealth() を取得しました。このメソッドは、スプライトを変更したり、キルを追加したりすることで敵の健康状態を管理します。ただし、特定の Playertank オブジェクトのキルを変更する必要があるため、次のコードを試しました:

public void collisionOccured(GameItem collidedItem)
{
    if(collidedItem instanceof Playertank) //Botsing met player
    {
        enemyHealth = 0.0;      
    }       
    if (collidedItem instanceof Weapon) //Botsing met wapen
    {
        lowerEnemyHealth(Weapon.weaponDamage);
        System.out.println("loweredddd");
    }
    if ((collidedItem instanceof Weapon) || (collidedItem instanceof Playertank))
    {
    checkEnemyHealth((GameItem)collidedItem);
    }
}

    public void checkEnemyHealth(GameItem collidedItem)
{
    if (enemyHealth >= (2.0/3.0 * startupEnemyHealth))
    {
        this.setFrame(0); //Green Enemy
        this.setEnemyStage(0);
    }
    else if (enemyHealth < (2.0/3.0 * startupEnemyHealth) && enemyHealth >= (1.0/3.0 * startupEnemyHealth))
    {
        this.setFrame(1); //Orange Enemy
        this.setEnemyStage(1);
    }
    else if (enemyHealth < (1.0/3.0 * startupEnemyHealth) && enemyHealth > 0)
    {
        this.setFrame(2); //Red Enemy
        this.setEnemyStage(2);
    }
    else if (enemyHealth <= 0 && (getEnemyStage() != 3))
    {
        setImage("/images/death.png", 27, 33); //Dead enemy     
        enemyOnDeath();
        if (collidedItem instanceof Playertank)
        {
            ((Playertank)collidedItem).raisePlayerKills(1); 
            mygame.setKillsonDashboard(((Playertank)collidedItem).getPlayerKills());
            ((Playertank)collidedItem).raisePlayerLandmines(1);
            mygame.setLandminesonDashboard(((Playertank)collidedItem).getPlayerLandmines());
        }
        mygame.setTimer(10, 33, this);
    }
    printHealth();
    System.out.println(this.getEnemyStage());
}

ただし、インスタンスが武器の場合でも raisePlayerKills() を実行する必要があります。私は解決策を見つけることができないようです。

いくつかの詳細情報:

Playertank.java creates the gameplayer and extends GamePlayer.java
GamePlayer.java extends MoveableGameItem.java
Enemytank.java extends MoveableGameItem.java
MoveableGameItem.java extends GameItem.java

この問題を解決するのに十分であることを願っています.Thxは事前にFlame

4

2 に答える 2

0

このキャストは何もしません:checkEnemyHealth((GameItem)collidedItem); -collidedItemはすでにタイプGameItemです。

このダウンキャストは失敗することが保証されています。私は、のサブクラスではないcheckEnemyHealth((Playertank)collidedItem);と想定しているため、またはその逆です。PlayertankWeapon

全体として、 -でNullPointerException呼び出すコードパスがないため、投稿した正確なコードでを上げることはできません。これが、「beforreee」の後にNPEを取得する唯一の方法ですが、「afterrrr」の後には取得できません。では、これを聞いてみましょう。コードはどのような例外をスローしますか?私は疑う:checkEnemyHealthnullClassCastException

((Playertank)collidedItem).raisePlayerKills(1);

これはPlayertankへのチェックされていないダウキャストです。

于 2012-04-20T13:27:51.237 に答える
0

まず、デバッガーでコードを確認することをお勧めします。これにより、ほとんどの場合、null が表示されます。衝突したアイテムが null のようです。インスタンス化されたオブジェクトをメソッド checkEnemyHealth に渡していますか?

于 2012-04-20T13:21:29.477 に答える