我知道标题可能看起来相当混乱,只是不确定如何问这个...... 所以,我正在制作一个基本的示例游戏(不会是一个完整的游戏或任何东西),你可以四处走动,被一个攻击你的敌人角色追逐。问题在于,当调用攻击函数时,它们不再只删除一个心脏/命中点,而是继续被“垃圾邮件删除”。这就是我正在使用的......
void Enemy::attackPlayer()
{
if (distance < 50)
{
Player::health--;
return;
}
}
非常简单,对吧?好吧问题是,我需要一些方法,我猜“睡觉”单一功能,这样它不会继续消除健康,而是在一次之后停止,然后在让我们说3秒之后,允许另一次攻击发生。
答案 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;
}
}