|
沙发

楼主 |
发表于 2016-8-1 10:26:05
|
只看该作者
本帖最后由 ancientcc 于 2016-8-1 11:04 编辑
- -1 % 2 = -1
- -1 & 1 = 1
- 对于val有可能出现负数场合,要判断奇、偶建议使用“val & 1”。
复制代码
像素坐标系:以像素为单位的坐标系。
格子坐标系:以格子为单位的坐标系。
像素坐标系和格子坐标系都以左上角为原点,x方向上,值向右增大;y方向上,值向下增大。
gamemap::w()、gamemap::h()返回不包括边界的宽度、高度。
gamemap::total_width()、gamemap::total_height()返回包括边界的宽度、高度,值是w()+2、h()+2。
格子坐标系最小值是(-1, -1),但负值只可能是-1。为什么会出现-1呢?
部队可放置在的格子坐标是从(0, 0)开始(编写mod则是(1, 1)),也就是说可放置的坐标最左上角是(0, 0),那么在它左侧、上侧的边界和为补全的鳞形部分坐标就只能是负值。由于限定边界最大不会超过0.5宽度/高度,也就是说边界部分最大不会占用一个格子位置,负值也就只能是-1。
rect_of_hexes display::hexes_under_rect(const SDL_Rect& r)
函数返回格子坐标系,坐标值最小(-1, -1)。
上图状态下返回的res值(类型rect_of_hexs):
left: -1。计算公式- res.left = static_cast<int>(std::floor(-border + x / tile_width - 0.333))
- 格子是72x72时,tile_width值是54。-0.3333是左侧向右凸出的鳞形部分。72x72时,它是18像素,但由于以上公式是54为除数,对54来说,18像素是0.333...。border允许最大值是0.5,以上公式可以推出,这是0.5换为像素后不是36,而是27。
复制代码
right: 12- res.right = static_cast<int>(std::floor(-border + (x + r.w-1) / tile_width))
- 为什么要r.w-1,可以假设x=0, border=0, r.w正好是tile_width整数倍情况,如果r.w不减1的,这时计算出的right比实际要画多出一个格子。
- 直观上如何理解54是72的左侧还是右侧?这里理解为左侧。
复制代码
top[0]: -1
top[1]: -1。计算公式- res.top[0] = static_cast<int>(std::floor(-border + y / tile_size));
- res.top[1] = static_cast<int>(std::floor(-border + y / tile_size - 0.5));
- top[0]是格子坐标x是偶数时对应的y最小值,[1]则是奇数时对应的最小值,即top的取值来自top[loc_.x & 1]。
- 当x是奇数时,它比偶数时“下陷”半格子高度。
复制代码
bottom[0]: 6
bottom[1]: 5。计算公式- res.bottom[0] = static_cast<int>(std::floor(-border + (y + r.h-1) / tile_size));
- res.bottom[1] = static_cast<int>(std::floor(-border + (y + r.h-1) / tile_size - 0.5));
- r.h-1原因类似计算right时的r.w-1。
- 这里的[0]是格子坐标x是偶数时对应的y最大值,[1]则是奇数时对应的最大值,和top类似。
复制代码 rect_of_hexes返回的不是纯正“矩形”,而是所有行宽度一致,但高度是所有奇数行一致,偶数行一致。
要得到rect_of_hexes中所有格子采用的++方式的迭代器方法,返回格子次序不是第一行从左到右,然后第二行从左到右,然后第三行从左到右,依次下去,而是第一列从上到下,然后第二列从上到下,然后第三列从上到下,依次下去。
上图迭代器返回的格子依次是:
(-1, -1),(-1, 0),(-1, 1),(-1, 2),(-1, 3),(-1, 4),(-1, 5),(0, -1),(0, 0),(0, 1),(0, 2),(0, 3),(0, 4),(0, 5),(0, 6),(1, -1),(1, 0),(1, 1),(1, 2),(1, 3),(1, 4),(1, 5),(2, -1)......
即使只有一列时候,rect_of_hexes中的top、bottom依旧会被设置为正确值。
此例中rect2距形只涉及到一列,但不管是top、bottom,它们四个值都有效。 |
|