我目前正在大学上一门中级C ++课,而且我们刚刚完成了课程/多态性工作,所以我决定自己做一个小项目。我认为这不是家庭作业,可以避免。

因此,我正在使用SFML制作一些“闲置”游戏。它由一个实体类,一个武器类和一个装甲类组成。我有2个实体,分别是玩家和“其他”或敌人。到目前为止,一切都很好,但是当我尝试使用另一个实体作为参数调用实体类上的成员函数时,我遇到了麻烦。
这是两个功能

/*
Simulates the entity attacking another entity
*/
void Entity::attackEntity(Entity other) {
    other.decreaseHP(5);
    if (other.getCurrentHP() <= 0) {
        killEntity(other);
    }
}

/*
Simulates main entity defeating another
*/
void Entity::killEntity(Entity other) {
    if (other.getEntityType() == "Enemy") {
        other.setXP(rand() % (other.getRequiredXP() / 9) + 1);
        addXP(other.getXP());
        //addXP(rand() % (rand() % (getRequiredXP() / 10) + 1) + getEntityLevel()); // testing
        addGold(rand() % getEntityLevel() + getEntityLevel());

        // Increment the level of the entity to give them better armor/weapon
        other.incrementLevel();
        // Regenerate a weapon and armor for the enemy
        other.setWeapon(other.getWeapon().generateRandomWeapon(other.getEntityLevel()));
        other.setArmor(other.getArmor().generateRandomArmor(other.getEntityLevel()));
    }
    else if (other.getEntityType() == "Player") {
        other.setXP(other.getXP() / 10);
        other.setCurrentHP(other.getMaxHP());
        other.refreshEntityInfo();
    }
}


目前,在主程序中,我将其称为

if (clock.getElapsedTime().asSeconds() >= 1.0f) {
    player.attackEntity(enemy);
    clock.restart();
}


我想要代码做的是每1秒钟,玩家将“攻击”另一个实体,成为敌人。这会将另一个实体的生命值降低5,并且当另一个实体的健康点降至1以下时,它将“杀死”该实体,从而赋予玩家经验并重置另一个实体的装甲和武器,从而为其赋予新的属性统计资料。
但是,发生了什么,什么都没有。健康点不会减少。
显然我在这里做错了事,因为它不起作用。

我测试了仅在时间循环中单独调用reduceHP()方法,该方法有效:

if (clock.getElapsedTime().asSeconds() >= 1.0f) {
    //player.attackEntity(enemy);
    player.decreaseHP(5);
    clock.restart();
}


但是我在使用AttackEntity()方法之前提供的方法却没有。

这是reduceHP()方法。

/*
    Decreases the entity's current health by amount
*/
void Entity::decreaseHP(int amount) {
    setCurrentHP(getCurrentHP() - amount);
}


我是否需要传递其他实体对象作为参考?我会以糟糕的方式使用这些功能吗?我应该如何处理呢?

编辑-所以我知道我刚刚发布了此内容,但是我同时更改了AttackEntity()函数和killEntity()函数的参数,因此它通过引用获取实体对象,这似乎可以解决问题。

/*
Simulates main entity defeating another
*/
void Entity::killEntity(Entity &other) {
    if (other.getEntityType() == "Enemy") {
        other.setXP(rand() % (other.getRequiredXP() / 9) + 1);
        addXP(other.getXP());
        //addXP(rand() % (rand() % (getRequiredXP() / 10) + 1) + getEntityLevel()); // testing
        addGold(rand() % getEntityLevel() + getEntityLevel());

        // Increment the level of the entity to give them better armor/weapon
        other.incrementLevel();
        // Regenerate a weapon and armor for the enemy
        other.setWeapon(other.getWeapon().generateRandomWeapon(other.getEntityLevel()));
        other.setArmor(other.getArmor().generateRandomArmor(other.getEntityLevel()));
    }
    else if (other.getEntityType() == "Player") {
        other.setXP(other.getXP() / 10);
        other.setCurrentHP(other.getMaxHP());
        other.refreshEntityInfo();
    }
}

/*
Simulates the entity attacking another entity
*/
void Entity::attackEntity(Entity &other) {
    other.decreaseHP(5);
    if (other.getCurrentHP() <= 0) {
        killEntity(other);
    }
}


但是,我的最后一个问题仍然存在:我会以正确的方式这样做吗?

最佳答案

签名void Entity::attackEntity(Entity other)使other是实体的副本。对other所做的任何更改都是attackEntity函数的本地更改。

如果您需要更改以从源项目中保留下来,最直接的方法是通过引用传递other,将签名更改为:void Entity::attackEntity(Entity& other)

10-01 11:45