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

C++ 如何阻止从整数中删除多个?,c++,C++,我知道标题可能看起来相当混乱,只是不知道如何问这个。。。 所以,我正在制作一个基本的示例游戏(不是一个完整的游戏或任何东西),在这个游戏中,你可以四处移动,被攻击你的敌人角色追赶。问题是,当调用攻击函数时,它们不是只删除一个心脏/生命点,而是继续被“垃圾邮件删除”。这是我的工作内容 void Enemy::attackPlayer() { if (distance < 50) { Player::health--; return; }

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

void Enemy::attackPlayer()
{
    if (distance < 50)
    {
        Player::health--;
        return;
    }
}
void敌人::attackPlayer()
{
如果(距离<50)
{
玩家:健康--;
返回;
}
}

很简单,对吧?问题是,我想我需要某种方法来“休眠”单个函数,这样它就不会继续删除运行状况,而是在一次之后停止,然后,比如说,3秒钟之后,允许另一次攻击发生。

我认为您可以创建两个全局时间变量,并将其传递给攻击函数。一旦调用攻击函数(外部),启动时间即启动。endTime在从玩家(在你的函数中)移除一个生命值后立即启动。然后,您只需在distance if语句之前添加一个if语句,以检查这两个语句之间的增量时间,如果它们超过3秒,则执行其余操作以删除另一个运行状况

您可能会让
敌人
类包含如下方法:

bool canAttack(){
    if(attackTimer >= 3000){
        attackTimer = 0;
        return true;
    }
    return false;
}
然后,您可以将损坏条件修改为:

if (distance < 50 && canAttack())
if(距离<50&&canAttack())
当然,你必须在
敌方
类中添加一个计时器,并根据与玩家的接近程度使其启动和停止


我相信有更好的方法来处理这个问题——而且,这在一定程度上取决于代码其余部分的实现。如果您使用的是类似于SFML的东西,那么有一个内置的事件系统可以使它更易于处理。希望这有点帮助

在考虑了你们给我的一些答案后,我自己处理了一些事情,我想出了一个非常简单的解决方案:

int Enemy::attackTime = 0;
然后

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

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

我猜,玩家在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;
    }
}
职业玩家
{
私人:
uint32最后一次攻击计时器;
...
公众:
void set_last_attack_timer(uint32_t timer){this->last_attack_timer=timer;};
uint32_t get_last_attack_timer(void){return last_attack_timer;};
...
}
无效敌人::攻击玩家()
{
uint32_t定时器=时间(0);
如果(距离<50&&计时器播放器::获取最后一次攻击\u计时器>3000)
{
玩家:健康--;
玩家::设置上次攻击计时器(计时器(0));
返回;
}
}

您可以使用Sleep(3000);由#include在每次成功的攻击后加上一个时间戳,然后在该时间戳后3秒才允许另一次攻击。要获取时间戳,请看
std::chrono
已经尝试过Mohammed,但是它不是孤立于函数的,它冻结了整个程序。从本质上说,在事件处理程序中确保这类事情是更好的解决方案。您不应该实际冻结,例如使用
Sleep
,我觉得这听起来比我建议的好一点,也容易一点。