浏览 3992 次
锁定老帖子 主题:条形小地图玩家位置显示
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2010-06-22
此方法有很多局限性,但确实很适用,很多很多地方都需要他,比如说横板过关游戏,小地图是条形框,玩家的位置要按玩家在大地图上的位置的比例来显示在小地图条形框上,再比如经验值,升级所需经验值和现有经验值显示经验值浮标到哪的问题,基于数字庞大的精确运算,而不适用于可以通过口算得出坐标的场合,比如,地图总长1440像素,条形框200像素,你现在的坐标是在地图总长上的430,那么该方法的返回值就是小地图上你应该在的偏差值。
说了这么多,其实方法简单的很。
以地图例子来说,第一个参数就是条形框的宽,第二个参数就是你现在所在大地图上的X坐标(相对大地图X零点的坐标,也可称为世界坐标),第三个参数就是大地图的宽。 private final int getXY(int w, int x, int Exp) { return (int)(((long)(x * w) * 1000000) /((long)Exp * 1000000)); }
返回的是偏差值,是小地图上你该出现在相对小地图条形框X零点坐标的点。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-06-29
最后修改:2010-06-29
个人意见哈,这样首先乘法计算比较耗时间,然后int转long,long值的计算是比int慢的……其实你整个大地图的长度和小的显示框的长度是知道的,那么他们的比值也就知道。假设大地图的宽是mapWidth, 小地图的宽式smallWidth,那么你可以先把他们的比值算出来,rate = ((double)smallWidth / (double)mapWidth) * Math.power(2,14),然后最后再把人物的实际位置和哪个rate一乘,然后再用移位运算来除以刚才乘的值,移位(x * rate)>>14 = 实际坐标
public int getX(int xOnBigmap){ return (xOnBigmap * rate)>>14 } 你原来是三个乘法一个除法,还是long的,这样一边之后就只用一次乘法,一个移位,而且还不转类型,移位那速度不用说了……而且地图一般的大小,这样算下来的rate根本不会溢出int 嘛,其实不一定14,我觉得再多点都可以…… 看了鸟哥的帖子之后才知道这种方法的…… |
|
返回顶楼 | |
发表时间:2010-06-30
puhao7117441 写道 个人意见哈,这样首先乘法计算比较耗时间,然后int转long,long值的计算是比int慢的……其实你整个大地图的长度和小的显示框的长度是知道的,那么他们的比值也就知道。假设大地图的宽是mapWidth, 小地图的宽式smallWidth,那么你可以先把他们的比值算出来,rate = ((double)smallWidth / (double)mapWidth) * Math.power(2,14),然后最后再把人物的实际位置和哪个rate一乘,然后再用移位运算来除以刚才乘的值,移位(x * rate)>>14 = 实际坐标
public int getX(int xOnBigmap){ return (xOnBigmap * rate)>>14 } 你原来是三个乘法一个除法,还是long的,这样一边之后就只用一次乘法,一个移位,而且还不转类型,移位那速度不用说了……而且地图一般的大小,这样算下来的rate根本不会溢出int 嘛,其实不一定14,我觉得再多点都可以…… 看了鸟哥的帖子之后才知道这种方法的…… 我测试一下,总觉得在精度上,你的这个方法会有偏差,不过,使用位移来代替乘法,确实是可行的,因为我发的那个方法很早以前就写出来了,当时没考虑用位移来代替乘法,感谢puhao7117441提醒! 求高人比较两方法优缺! |
|
返回顶楼 | |
发表时间:2010-06-30
其实实现这个主要是解决一个很重要的问题,那就是:
如果地图长度1440,条形框200长,那么,人物的世界坐标X在1440上移动的时候,并不是每移动一像素条形框上的小图标都要移动,拿1440和200举例是因为《监狱兔》项目就是这个坐标,记得人物的世界坐标在地图上每移动8像素条形框上的小图标才移动1像素,当然这些值都可能不准确,因为时间太长了。 |
|
返回顶楼 | |
发表时间:2010-07-08
贴图看看嘛
|
|
返回顶楼 | |