首先,您需要以下操作来转换等角坐标:
isoX = carX + carY;
isoY = carY - carX / 2.0;
carX = (isoX - isoY) / 1.5;
carY = isoX / 3.0 + isoY / 1.5;
右上角和左下角的直角变成了120度,另外两个角变成了60度。右下角变为底部角,左上角变为顶部角。这也假定y向上增加,x向右增加(如果你的系统不同,请相应地翻转符号)。你可以通过代换来验证这些操作是彼此的逆。
对于一个矩形,您需要转换4个点 - 即角落 - 因为它们在SDL的用途上不会是“矩形”的(将成为平行四边形)。这在数值上更容易看出。
首先,给角落起个名字。我喜欢按顺时针方向从左下角开始 - 这个坐标将被称为C1,并具有关联的X1和Y1,其他三个角将是C2-4。
C2 - C3
| |
C1 - C4
然后计算它们的笛卡尔坐标...
X1 = RECT.X;
Y1 = RECT.Y;
X2 = X1; // moving vertically
Y2 = RECT.Y + RECT.HEIGHT;
X3 = RECT.X + RECT.WIDTH;
Y3 = Y2; // moving horizontally
X4 = X3; // moving vertically
Y4 = RECT.Y;
最后,将变换分别应用于每个坐标,以获得I1、I2、I3、I4坐标...
iX1 = X1 + Y1;
iY1 = Y1 - X1 / 2.0;
// etc
而你最终得到的是屏幕坐标I1-4,它们具有以下形状:
I2
/ \
I1 I3
\ /
I4
但与这个低劣的描述不同的是,I4和I2的角度将会是约127度,而I1和I3的角度应该是约53度。(这可以微调为恰好60/120,并且取决于计算isoY时carX的2.0因子——它应该是sqrt(3)而不是2.0,但差不多就行了)
如果使用反向变换,可以将I1-4坐标转换为C1-4,或者从屏幕坐标中定位世界坐标等。
如果只是初次实现相机/视口,可能会有一点棘手,但这超出了要求的范围,所以我不会继续深入讨论它(除非进一步追问)...
(编辑)关于SDL...
SDL似乎不太适用于广义变换。我没有使用过它,但它的界面与我之前用于游戏引擎的GDI(windows)非常相似,我遇到了这个确切的问题(旋转+缩放纹理)。
有一个(看起来不是标准的)SDL函数,可以同时缩放和旋转纹理,但它按错误顺序执行,所以它始终保持图像的透视性,而这里并不需要。
基本几何图形会很好,因为填充和线条不需要缩放,只需要定位。但是对于纹理...你要么编写代码逐像素渲染纹理,要么使用一组变换(旋转后缩放),或层叠(绘制带阿尔法掩码的等角正方形并渲染预先计算的纹理)等等...
当然,如果您可以选择,可以使用适用于原始几何和纹理数据的东西,如OpenGL / Direct3D。个人建议使用OpenGL/SFML来实现这样的内容。