C++ 如何使用偏移和剪裁将一个阵列复制到另一个阵列?
我有以下阵列用于玩家的当前视线在这种情况下,“A”表示演员或玩家C++ 如何使用偏移和剪裁将一个阵列复制到另一个阵列?,c++,arrays,C++,Arrays,我有以下阵列用于玩家的当前视线在这种情况下,“A”表示演员或玩家 // Sight with depth of 3 char sight[] = { 0, 0, 0, 0, 0, 0, 0, // 0-6 0, 0, 0, 0, 0, 0, 0, // 7-13 0, 0, 0, 0, 0, 0, 0, // 14-20 0, 0, 0, 'A', 0, 0, 0, // 21-27 0, 0, 0, 0, 0, 0, 0, /
// Sight with depth of 3
char sight[] = {
0, 0, 0, 0, 0, 0, 0, // 0-6
0, 0, 0, 0, 0, 0, 0, // 7-13
0, 0, 0, 0, 0, 0, 0, // 14-20
0, 0, 0, 'A', 0, 0, 0, // 21-27
0, 0, 0, 0, 0, 0, 0, // 28-34
0, 0, 0, 0, 0, 0, 0, // 35-41
0, 0, 0, 0, 0, 0, 0 // 42-48
};
我正在加载此自定义地图文件。W=墙,D=门地板
WWWWWWWWWWWWWWWW
W.W.D.........WW
W.W.WWWWW.WWW.WW
W...WWWWW...W.D.
WWWWWWWWWWWWWWWW
好的,我想用偏移量把这个数组复制到当前视线中。如果玩家处于位置(1,1),则x偏移量为1,y偏移量为1。同样,如果玩家处于位置(5,4),x偏移量为5,y偏移量为4。在这种情况下,他处于位置(1,1)
无论玩家在哪里,他的视线阵列都将他置于中心。那么,如何使用偏移和剪裁将地图阵列复制到他的视线阵列中?为什么需要复制阵列?您不需要数据的副本来获取信息,只需要一个能够返回给定玩家位置的偏移量的函数,例如:
class Player {
...
int getX() const { return x; }
int getY() const { return y; }
}
class Map {
...
char getWithOffset(const Player& player, int dx, int dy) const {
return map[player.getX()+dx][player.getY()+dy];
}
}
然后你可以打个电话
map.getWithOffset(player, -1, -1)
并根据播放器获得所需的增量位置
如果您真的需要一个单独的数组,可以通过此函数轻松构建一个数组,例如:
char sight[SIGHT_DEPTH][SIGTH_DEPTH];
int baseX = player.getX() - SIGHT_DEPTH / 2; // start from -3,-3
int baseY = player.getY() - SIGHT_DEPTH / 2;
for (int i = 0; i < SIGHT_DEPTH; ++i)
for (int j = 0; j < SIGHT_DEPTH; ++j)
sight[i][j] = map.getAt(baseX + i, baseY + j);
char-sight[sight_-DEPTH][SIGTH_-DEPTH];
int baseX=player.getX()-SIGHT\u DEPTH/2;//从-3开始,-3
int baseY=player.getY()-视线深度/2;
对于(int i=0;i
显示您现在使用的代码,并解释它在哪里失败。我有一个类似的函数,名为peek()。你可以从玩家那里查看什么是北,什么是南,等等。然而,这只是返回一个单元格。我最后要做的是:c=map.peek(m_x,m_y,EDir_N);视线[N]=c;然后我必须做20多次。似乎有一种更简单的方法可以做到这一点,比如使用delta/offset复制数组。因为您通过指定方向来使用peek,但没有什么可以阻止您使用数字偏移量(例如,将EDir\N
定义为{0,-1}
,这样它会上升1个单元格)我可以看出,使用delta作为参数更容易。谢谢。我可以循环使用这个(之前没有看到您的更新):int x_center=3;int y_中心=3;for(inty=0;y<7;y++){for(intx=0;x<7;x++){sight[y*7+x]=map.peek(m_x,m_y,x-x_center,y-y_center);}工作得非常好!谢谢