在制作2D游戏和绘画艺术时,一个角色应该画多少个视角?
现在我们来看看屏幕,如果我们选择640x480的分辨率。啊哈,640:480=4:3,会有这样的好事;那么游戏坐标系中的一条水平线正好是屏幕的对角线,这样就很容易判断游戏世界中的一个坐标点是否在屏幕区域内;-)请看左图。外面的菱形框是游戏世界的矩形部分,中间的矩形框代表屏幕区域。我们的屏幕坐标范围从左上角的(0,0)到右下角的(639,479)。为了说明问题,游戏世界的坐标原点也设置在屏幕的左上角。好了,现在我们来计算一下屏幕四个角对应的游戏世界的坐标。既然屏幕对角线是800,那么右上角。左下角是(400,400);右下角是(800,0)。判断一个点是否在屏的依据是0 ≤ x+y ≤ 800,就这么简单。
最后说一下发动机设计的优化。在坐标变换中,最常用的运算是除法5。除法指令是最慢的。有什么办法可以优化吗?鉴于我们的动作值不是很大,这个操作可以达到最快的速度。也就是用*205/1024代替/5,205=(1+5*8)*5,386以上的CPU计算都可以使用LEA指令,速度非常快。向右移动10。-)当然,现在的C语言编译器把优化选项开到最大的时候,会自动帮你优化,你就不用写嵌入式汇编了。如果真要自己写,大概就是几行字:
mov edx,eax在eax是被除数a lea eax,[EDX+4 * EDX];eax = 5*a lea eax,[EDX+8 * eax];eax = a+8*eax = 41*a lea eax,[eax+4 * eax];eax = 5*eax = 205*a sar eax,10;Eax = 205*a/1024注:如果用C语言写,不如直接把/1024写成>;& gt10,虽然/1024会优化右移,但是除法是四舍五入的,所以编译器在优化的时候会考虑更多的东西,更多的指令。
担心计算的准确性?不用说,205/1024=0.200195,也就是说,一个点有0.000195的误差,所以即使累计到800个点(屏幕的对角线是最长的线),也只会有0.17个点的误差,而屏幕上的那个,