Java 我想制作一个从我的hp值中减去25的方法,但有一个问题

Java 我想制作一个从我的hp值中减去25的方法,但有一个问题,java,Java,到目前为止,我有这个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

到目前为止,我有这个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点生命,但是因为敌人的面积很大(113134),所以它会减去25点,直到我离开这个范围,使我的生命减少到-6000点(显然是个问题),有没有办法让它只减法一次。

我想这是因为你的第一段代码在游戏循环中,每秒运行很多次(通常是30次)。在每次执行中(大约每0.03秒执行一次),你的形状都与敌人相交(因为你没有移动)

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

试试这个:

首先,在玩家类中初始化一个被命中的
字段

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

或者,您可能希望根据注释实现冷却机制

如果这是您想要做的,则初始化另一个字段

private int hitSince = 0;
然后,在你的游戏循环中

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

if(d.intersects(r1)&&en.visible==true&&en.isAlive==false&&hit,因为击退或在能够再次命中之前冷却会更改为“命中”出于语法原因,但在其他方面,这是一个非常好的系统,我在自己的游戏中广泛使用。但是,我建议使用计时器将命中变量重置为false,这样玩家就不能仅仅站在敌人面前而免疫伤害。我不使用
hit
,因为OA已经有一个名为命中
lol。计时器也不错,但我没有亲自使用计时器…第二个角色现在不会造成任何伤害?有什么提示吗?对第二个角色应用相同的代码。我将
//同样的代码留给第二个敌人…
给你:)我如何实现计时器?