如何阻止从整数中删除多个?

时间:2017-04-02 20:50:54

标签: c++

我知道标题可能看起来相当混乱,只是不确定如何问这个...... 所以,我正在制作一个基本的示例游戏(不会是一个完整的游戏或任何东西),你可以四处走动,被一个攻击你的敌人角色追逐。问题在于,当调用攻击函数时,它们不再只删除一个心脏/命中点,而是继续被“垃圾邮件删除”。这就是我正在使用的......

void Enemy::attackPlayer()
{
    if (distance < 50)
    {
        Player::health--;
        return;
    }
}

非常简单,对吧?好吧问题是,我需要一些方法,我猜“睡觉”单一功能,这样它不会继续消除健康,而是在一次之后停止,然后在让我们说3秒之后,允许另一次攻击发生。

4 个答案:

答案 0 :(得分:1)

我认为您可以创建两个传递给攻击函数的全局时间变量。一旦调用攻击函数(外部),就会启动startTime。从播放器(在您的函数内)中删除一个健康状况后立即启动endTime。然后,您只需在距离if语句之前添加if语句,以检查这两者之间的增量时间,如果它们超过3秒,则执行其余操作以删除另一个运行状况。

答案 1 :(得分:1)

您可能让bool canAttack(){ if(attackTimer >= 3000){ attackTimer = 0; return true; } return false; } 类包含如下方法:

if (distance < 50 && canAttack())

然后你可以将你的伤害状况修改为:

Enemy

当然,你必须为{{1}}课程添加一个计时器,并根据与玩家的距离来启动和停止计时器。

我确信有更好的方法来处理这个问题 - 这也取决于其余代码的实现。如果您正在使用类似SFML的东西,那么有一个内置的事件系统可以使这更容易处理。希望这有点帮助!

答案 2 :(得分:0)

在得到一些答案之后,你们给了我一些考虑并且自己弄乱了一些事情,我想出了一个非常简单的解决方案:

int Enemy::attackTime = 0;

然后......

void Enemy::attackPlayer()
{
    if (distance > 60)
        return;

    if (time(0) > attackTime)
    {
        attackTime = time(0) + 3;
        Player::health--;
    }
}

答案 3 :(得分:0)

我猜,玩家在3秒钟内不会被任何敌人攻击。但是,如果存在,敌人可以攻击另一个玩家。因此,这个计时器变量保持在Player类中。如果我是正确的,我认为这段代码可行。

class Player
{
private:
    uint32_t last_attack_timer;
    ...
public:
    void set_last_attack_timer(uint32_t timer){this->last_attack_timer = timer;};
    uint32_t get_last_attack_timer(void){return last_attack_timer;};
    ...
}

void Enemy::attackPlayer()
{
    uint32_t timer = time(0);

    if (distance < 50 && timer-Player::get_last_attack_timer>3000)
    {
        Player::health--;
        Player::set_last_attack_timer(timer(0));
        return;
    }
}