0

これまでのところ、ロジックの場合はこれがあります

if (d.intersects(r1) && en.visible == true && en.isAlive == false)
{
    hit = 25;
    // System.out.println(enemy_count);
    hitmang(hit);
}

if (d.intersects(r2) && en2.visible == true && en2.isAlive == false)
{
    hit = 25;
    hitmang(hit);
    //  System.out.println(enemy_count);
}

この方法で

private void hitmang(int x) { 
    p.user_hp = p.user_hp - x;
}

これらは両方とも私の敵です

en = new Enemy(700, 150);
en2 = new Enemy (980, 150);

敵に当たったときに25hpしか減らないようにしたいのですが、敵の面積が大きいので(113、134)、その範囲を離れるまで25を引いて、hpを〜-6000にします(明らかに問題)、それを作る方法があるので、それは一度だけ減算します。

4

1 に答える 1

1

コードの最初のフラグメントが、1 秒間に何度も (通常は 30 回) 実行されるゲーム ループにあるためだと思います。すべての実行 (約 0.03 秒ごとに実行) で、形状敵と交差しています (離れていないため)。

ただし、敵から離れるまで、0.03 秒ごとに HP が 25 減少します。

これを試して:

まず、hittedPlayer クラスでフィールドを初期化します。

private boolean hitted = false;

次に、ゲームループで。

if (d.intersects(r1) && en.visible == true && en.isAlive == false && !p.hitted)
{
    hit = 25;
    // System.out.println(enemy_count);
    hitmang(hit);
    p.hitted = true;
}

// Same goes to 2nd enemy ....

// if no longer intersects
if (!d.intersects(r1) && !d.intersects(r2)){
    p.hitted = false;
}

または、コメントに従ってクールダウンメカニズムを実装することもできます。

それがあなたのやりたいことなら、代わりに別のフィールドを初期化してください

private int hitSince = 0;

次に、ゲームループで。

if (d.intersects(r1) && en.visible == true && en.isAlive == false && hitSince <= 0)
{
    hit = 25;
    // System.out.println(enemy_count);
    hitmang(hit);
    hitSince = 30; // once hit, you won't be 'hit' and lose HP again in 30 frames
}

// Same goes to 2nd enemy ....

// decrease cooldown time every frame
hitSince--;

このTimerコードはゲームの FPS に依存するため、他のプレイヤーのコンピューターでは不安定になる可能性があります (コンピューターが遅いか、バックグラウンドでアンチウイルスが実行されているため)。たとえば、これは一般に (ゲーマーから) 「ラグ」と呼ばれます)

ところで、敵がたくさんいる場合は、それらを次のように格納する必要がありarrayますcollectionArrayList

于 2012-12-28T03:18:55.390 に答える