SDL中文论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 3745|回复: 1
打印 上一主题 下一主题

[Discuss] display的一些函数

[复制链接]

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
跳转到指定楼层
楼主
发表于 2016-8-1 10:24:55 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
  • 屏幕坐标系:屏幕(0, 0)是它的原点。
  • 地图坐标系:大地图(0, 0)是它的原点。当没有滚动、并且地图元素的左上角在屏幕(0, 0),则此个坐标系的值等于屏幕坐标系。

屏幕坐标系转换到地图坐标系要经过两个步骤,1)减去地图元素在场景中的左上角坐标;2)加上滚动尺寸。
  1. const map_location display::hex_clicked_on(int xclick, int yclick) const
  2. {
  3.         const SDL_Rect& rect = map_area();
  4.         if (point_in_rect(xclick,yclick,rect) == false) {
  5.                 return map_location();
  6.         }
  7.         xclick -= rect.x;
  8.         yclick -= rect.y;
  9.         return pixel_position_to_hex(xpos_ + xclick, ypos_ + yclick);
  10. }
复制代码

  1. const map_location display::pixel_position_to_hex(int x, int y) const
复制代码

功能
把像素坐标转换为格子坐标。

参数
x、y:地图坐标系中的像素坐标。

返回值
x < 边界宽度时,loc.x返回-1。y < 边界高度时,loc.y返回-1。
回复

使用道具 举报

149

主题

331

帖子

2445

积分

版主

Rank: 7Rank: 7Rank: 7

积分
2445
沙发
 楼主| 发表于 2016-8-1 10:26:05 | 只看该作者
本帖最后由 ancientcc 于 2016-8-1 11:04 编辑
  1. -1 % 2 = -1
  2. -1 & 1 = 1

  3. 对于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。计算公式
  1. res.left = static_cast<int>(std::floor(-border + x / tile_width - 0.333))
  2. 格子是72x72时,tile_width值是54。-0.3333是左侧向右凸出的鳞形部分。72x72时,它是18像素,但由于以上公式是54为除数,对54来说,18像素是0.333...。border允许最大值是0.5,以上公式可以推出,这是0.5换为像素后不是36,而是27。
复制代码

right: 12
  1. res.right = static_cast<int>(std::floor(-border + (x + r.w-1) / tile_width))
  2. 为什么要r.w-1,可以假设x=0, border=0, r.w正好是tile_width整数倍情况,如果r.w不减1的,这时计算出的right比实际要画多出一个格子。
  3. 直观上如何理解54是72的左侧还是右侧?这里理解为左侧。
复制代码

top[0]: -1
top[1]: -1。计算公式
  1. res.top[0] = static_cast<int>(std::floor(-border + y / tile_size));
  2. res.top[1] = static_cast<int>(std::floor(-border + y / tile_size - 0.5));
  3. top[0]是格子坐标x是偶数时对应的y最小值,[1]则是奇数时对应的最小值,即top的取值来自top[loc_.x & 1]。
  4. 当x是奇数时,它比偶数时“下陷”半格子高度。
复制代码

bottom[0]: 6
bottom[1]: 5。计算公式
  1. res.bottom[0] = static_cast<int>(std::floor(-border + (y + r.h-1) / tile_size));
  2. res.bottom[1] = static_cast<int>(std::floor(-border + (y + r.h-1) / tile_size - 0.5));
  3. r.h-1原因类似计算right时的r.w-1。
  4. 这里的[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,它们四个值都有效。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|丽谷软件|libsdl.cn

GMT+8, 2025-5-2 00:19 , Processed in 0.037790 second(s), 22 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表