【问题标题】:Making a local struct instance accessible to another function (C++)使另一个函数可以访问本地结构实例 (C++)
【发布时间】:2021-08-27 16:16:35
【问题描述】:

所以我有一个结构,它保存游戏中实体的变量(命中点、x 和 y 坐标等),并且我有全局声明的结构。但是,我在“设置”函数中创建了实例,并希望在单独的“逻辑”函数中修改它们的变量。但显然,由于实例是“设置”函数的本地实例,“逻辑”函数无法修改它们的变量。

这是我当前代码的简化。

// Global space
struct entity {
     int hp, atk, x, y;
};

void Setup()
{
    entity dummy;
    dummy.hp = 10;
    dummy.atk = 2;
    dummy.x = 5;
    dummy.y = 5;
}
void Logic()
{
    // if(dummy is attacked)
        dummy.hp -= 4;
}
int main()
{
    Setup();
    while(game is not over)
        Logic();
}

【问题讨论】:

  • 研究函数返回值
  • 函数也可以有参数。您可以让logic 使用enity,以便它可以在函数中使用它。
  • @NathanOliver 如果我创建了一个接受entity 但在logic 内调用的函数怎么办?原因是logic 处理移动和攻击(玩家和敌人的)以及寻路。我认为最好将它们中的每一个包装到它们自己的函数中并在logic 下调用它们

标签: c++ scope game-development


【解决方案1】:

有几种不同的方法可以解决这个问题:

  1. dummy 移动到全局范围:
struct entity {
    int hp, atk, x, y;
};
entity dummy;

void Setup()
{
    dummy.hp = 10;
    dummy.atk = 2;
    dummy.x = 5;
    dummy.y = 5;
}

void Logic()
{
    if (dummy is attacked)
        dummy.hp -= 4;
}

int main()
{
    Setup();
    while (game is not over)
        Logic();
}
  1. dummy移动到main(),然后通过引用(或指针)将其传递给Setup()Logic()
struct entity {
    int hp, atk, x, y;
};

void Setup(entity &e)
{
    e.hp = 10;
    e.atk = 2;
    e.x = 5;
    e.y = 5;
}

void Logic(entity &e)
{
    if (e is attacked)
        e.hp -= 4;
}

int main()
{
    entity dummy;
    Setup(dummy);
    while (game is not over)
        Logic(dummy);
}
  1. 上面 #2 的扩展,然后您可以将 Setup()Logic() 移动到结构本身中:
struct entity {
    int hp, atk, x, y;
    void Setup();
    void Logic();
};

void entity::Setup()
{
    hp = 10;
    atk = 2;
    x = 5;
    y = 5;
}

void entity::Logic()
{
    if (is attacked)
        hp -= 4;
}

int main()
{
    entity dummy;
    dummy.Setup();
    while (game is not over)
        dummy.Logic();
}

【讨论】:

  • 啊,我明白了。我可能应该澄清一下,制作结构的目的是在运行时根据需要添加尽可能多的不同实体实例。我不相信第二个或最后一个解决方案在这种情况下会起作用,但我也不知道第一个解决方案,因为它不是我可以控制的功能。
  • #2 和 #3 可以很好地处理多个 entity 对象。然后,您可以使用数组或向量或列表或任何您想在运行时跟踪对象的东西,根据需要在每个对象上调用 Setup()Logic()
  • 嗯,好的。我将尝试 #2 并将logic 分成不同的专用函数(问题中未显示)。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多