0

到目前为止,我有这个 if 逻辑

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

我想这样当我击中敌人时它只会从我身上减去 25 hp,但由于敌人的面积很大(113、134)它会减去 25,直到我离开那个范围使我的 hp ~-6000(显然是一个问题),有没有办法让它只减去一次。

4

1 回答 1

1

我猜是因为你的第一个代码片段在游戏循环中,它每秒运行很多次(通常是 30 次)。在每次执行(大约每 0.03 秒运行一次)中,您的形状都会与敌人相交(因为您没有离开)。

也就是说,你的生命值每 0.03 秒减少 25 秒,直到你远离敌人!

尝试这个:

hitted首先,在您的 Player 类中初始化一个字段。

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或一个collection诸如ArrayList

于 2012-12-28T03:18:55.390 回答