全45度角2.5D游戏如何计算该被显示出的tile地形图片

    我采用的是类似于计算机几何图形填充光栅化算法来处理的。

 

    游戏世界是个巨大的正方形,采用windows默认窗口坐标系表示它的左上角在( 0, 0 )处, 在全45度视角下通过往正方向( 逆时针 )旋转45度再把y坐标缩小二分之一,它看起来就应该是一个巨大的菱形。为了调试算法方便我用一个64*32(像素)的矩形表示tile图片,用这个矩形的内接菱形来表示实际被显示出来的tile菱形像素块,因为我建立的程序窗口式640*480,所以只假设游戏世界的大菱形是由10 * 10个tile组成的,也就是说整个游戏世界都被显示在窗口中。

 

 

 

 

 

    算法是建立在windows默认窗口坐标系下的,即X向右,Y向下为正方向。这个游戏世界里还有一个玩家角色,他显示在区域的中心。整个显示区域是随着他的移动而移动的。

 

    逻辑上的角色坐标应该是按照正方形来计算的。比如如果想往右边移动,只要增加角色的x属性数值,想往下移动只要增加角色的Y属性数值。反之则反之。我本来打算直接用像素为单位来表示万家x,y坐标,然后在屏幕上显示玩家位置的时候再把坐标转换成菱形里的坐标,可以借助公式:

 

 

x ’ = x * cos( -45 ) - y * sin( -45 );

 

y’  = x * sin( -45 ) + y * cos( -45 );

 

y’  /= 2;

 

ps:因为cos和sin是在笛卡尔坐标系中进行计算的,前面提到过的我把这个游戏建立在widnows默认坐标系上,下面我不再多说了。由于笛卡尔坐标系与windows坐标系的y轴是相反的,所以正方向旋转45度填入的参数应该是-45。考虑到使用习惯可以把系统提供的三角函数封装在自己写的函数里,只要把参数取反传给系统的三角函数即可。

 

由于在这个程序中我把整个游戏世界的大菱形显示在屏幕中央,y轴偏移了二分之一的屏幕高度,所以实际上这里代码还应该把y’加上屏幕高度的二分之一:

 

x ’ = x * cos( -45 ) - y * sin( -45 ) ;

 

y’  = x * sin( -45 ) + y * cos( -45 );

 

y’  /= 2;

 

y’ += GAME_SCREEN_HEIGHT;

 

但是这样做会遇到一些问题:

1 因为使用了浮点计算,所以可能会有精度上的问题存在。

2 用了cos和sin函数,存在效率问题,当然可以用查询表方法,但是第一个问题依然存在。

 

    前两天一个朋友告诉我人物的行走可以用小格表示,这给了我启发。一方面人的移动基本上不会是单个像素,所以没有必要以像素来作为单位,另一方面人物坐标的计算不一定非要从正方形地形的坐标转换成菱形地形的坐标。所以可以用格子的方法在菱形的地形上直接计算人物坐标。观察可以发现每当人物在

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值