一个拉选框的制作

我做了一个区块栏
但是当前的功能只能选中一个格子 

他看起来就是这样的   
但是功能很薄弱只能选择一个区域(32x32)

如果我想复制这个 4 x 5 的树 那么我就要点20次
所以我做了一个可以让鼠标产生一个拉框的功能 
 int rx = tileClickStartX < tileClickEndX ? tileClickStartX : tileClickEndX;
 int ry = tileClickStartY < tileClickEndY ? tileClickStartY : tileClickEndY;
 int rw = Math.Abs(tileClickStartX - tileClickEndX);
 int rh = Math.Abs(tileClickStartY - tileClickEndY);
 tileClickingRect = new Rectangle(rx,ry,rw,rh);


同时后台我也将数据简化了
简化到了    一个矩阵的起点坐标 和 结束坐标 


问题似乎得到了一定的解决
那么新的问题来了    我在后台的图片 是一个一维的数组储存的  那么如何 又有哪些编号被选中呢?



如果用视觉去数的话 很直观
但是用代码我们得换一下思维去想如何处理这种数学转化
我们可以知道  10 对应的坐标是  2 , 1 
x = 2 
y = 1
而 一列(c) = 8
所以对应公式就是    y * c + x 
相同的  47 的坐标分别是 x7y5
5 * c(8) + 7  = 47
现在我们知道了 格子的编号 与其坐标的对应关系
那么我们先来看看第一列 
也就是   编号10 ~ 15 
的变化

 他们的Y坐标没啥变化
那么  推导一下
 y * c + x 
 1 * 8 + (2~7)   
2~7 是连续的数字 所以我们如果用一个 for循环 (int x = 2 ; x<= 7 ;x++) 就可以解决  10~15的编号了

 那么我们再来看一下  10 18  26 34  42 这一列
也就是粉色的这一列
他们的 x坐标都没变
也就是说  y是一个变量
y * 8 + 2 
而y 的范围是 1 ~ 5
(1~5) * 8 +2   结果就是粉色这一列的编号

我们把一开始得到的 公式和刚刚得到的公式组合一下 (StartY < EndY) * Column + (StartX <  EndX)



for(int y = StartY ;y<=EndY;y++)
{
   for(int x = StartX;x<=EndX;x++)
{
   int index = y * column + x;
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值