0
class block
{
     private:
          int xPos;
          int yPos;
};

 vector<block> stoneBlocks;

 int stoneBlockXpos[] = {1, 2, 3, 4, 5, 6};
 int stoneBlockYpos[] = {1, 2, 3, 4, 5, 6};

基本上,我想做的是分配数组的xPosyPos值。最简单的方法是什么?我在几个if()语句中都有这些数组,它们几乎是我正在制作的游戏关卡数据的 x 和 y 坐标。

我能想到的唯一可行的解​​决方案是for()在每个语句中放置一个循环if(),然后以这种方式分配值。但是,这不会非常有效。

是的,如果有必要知道的话,这一切都会以同样的方式发生。我正在我制作的“地图创建者”中创建这些数组。这是一个单独的事情。编写在 creator 中完成的事情的唯一方法是将向量数字以数组格式(x 和 y 各一个)打印到文本文档中,然后将它们粘贴到游戏项目的代码中。

谢谢!:)

4

2 回答 2

1

如果你只想初始化一次向量(并且你有一个兼容 C++11 的编译器),你可以使用这种类型的方法:

#include <vector>
#include <initializer_list>

using namespace std;

class block
{
public:
    block(int x, int y) : xPos(x), yPos(y) {}
private:
    int xPos;
    int yPos;
};


int main()
{
  static vector<block> stoneBlocks1 { {1, 1}, {2, 2}, {3, 3} };
  static vector<block> stoneBlocks2 { {5, 6}, {7, 8}, {9, 10} };

  ... 
}
于 2013-08-24T22:52:14.130 回答
1

假设您block的构造函数采用两个ints,您可以执行以下操作:

std::transform(std::begin(stoneBlockXpos), std::end(stoneBlockXpos),
               std::begin(stoneBlockYpos),
               std::back_inserter(stoneBlocks),
               [](int x, int y) { return block(x, y); });

(同样可以用 C++03 完成,但它需要一些辅助函数)。

假设您需要经常这样做,您可以创建一个小型包装器,它执行相同的操作,但也确保两个数组都具有正确的大小,例如:

template <int Size>
std::vector<block>
makeBlocks(int (&xpos)[Size], int (&ypos)[Size])
{
    std::vector<block> rc;
    std::transform(std::begin(xpos), std::end(xpos),
                   std::begin(ypos),
                   std::back_inserter(rc),
                   [](int x, int y) { return block(x, y); });
    return rc;
}

stoneBlocks = makeBlocks(stoneBlockXpos, stoneBlockYpos);
于 2013-08-24T22:53:01.063 回答