3

スプライトをプレイヤーの近くに配置しようとすると問題が発生します。小さな地図と横スクロールがあります。成長と真ん中のプレーヤーだけがあります。彼は見て左または右に歩くことができ、プレイヤーが左を向いて「ショット」を押した場合、私はモブのリンクリストで私のプレイヤーに最も近いモブを検索し、このモブがダメージを受けるようにします。

私はこのコードを持っています: - mobs はモブのリンクリストです。(AnimatedSprite の拡張)

これは私の最初のゲームであり、これを行うためのより良い方法があるかどうかはわかりません。これは、リストの最初の要素のみをより近くで検索しないでください。何か考えはありますか? :)

public void shot(){
    float playerx = player.getX();
    Mob target = mobs.element();
    if(player.getDireccion()==Entidad.DIR_IZQUIERDA){//If direction if left
        for(Mob z:mobs){
            if(z.getX()<playerx &&
               z.getX()>target.getX())
                target= z;
        }
    }else if(player.getDireccion()==Entidad.DIR_DERECHA){//If direction is right
        for(Mob z:mobs){
            if(z.getX()>playerx && z.getX()<target.getX())
                target= z;
        }
    }

    target.recibeDaño();//receibe damaget (loss life basically)

    if(objetivo.getVida()<=0){ //These delete body and sprite of the game
        final Mob eliminar = target;
        eliminarZombie(eliminar,this);
        mobs.remove(target);
        System.gc();
    }
}

申し訳ありませんが私の英語。

4

1 に答える 1

1

すべての敵をループし、距離を計算します。

距離 = x2 - x1

ここで、x2 は敵の x 属性、x1 はプレイヤーの x 属性です。

右を向いている場合は正の距離のみを考慮し、左を向いている場合は負の距離のみを考慮します。

次に、距離の最小絶対値を選択します

だからそれはこのようなものです

float shortest = 1000; //just put a large number here

for(Mob z:mobs){
    distance = z.x - player.x;
    if((player.getDirection == Direction.RIGHT) && distance > 0 && distance < shortest){
        //set the target to the current mob and change the value of the shortest
    }
    if((player.getDirection == Direction.LEFT) && distance < 0 && Math.abs(distance) < shortest){
        //same as above
    }
}
//damage the target here and remove it

ターゲットが敵の真上にあり、距離 == 0 の場合を考慮していないことに注意してください。

コードも機能するはずですが、リストを 2 回ループするのではなく、1 回ループする方がよいでしょう。

コードに関するその他の注意事項は次のとおりです。

  • System.gc() を呼び出さないでください。良い考えではありません
  • リンクされたリストからアイテムを削除したい場合は、 updateThread で this.runOnUpdateThread() を使用してアイテムを削除し、ランナブルにします [このようにしないと、ゲームがランダムにクラッシュします]
  • また、イテレータを使用して項目を調べてから、.remove() を使用して到達した最新の項目を削除することもできます。これはスレッドセーフです
于 2012-11-05T19:28:32.987 に答える