使用XNA SpriteBatch的倾斜效果

使用XNA SpriteBatch的倾斜效果,xna,windows-phone,spritebatch,Xna,Windows Phone,Spritebatch,Windows Phone具有很好的按钮倾斜效果,如下图所示: 是否可以使用SpriteBatch在XNA中重新实现此行为?我可以检测触摸位置并计算矩形角应该位于的点,但我不知道如何使用这种失真来渲染图像。当然有可能,但涉及到相当多的数学问题 GetState()方法将以与Silverlight中使用TouchLocations几乎相同的方式返回所有屏幕触摸及其状态。 主要的不同之处在于,您已经在像素级工作,因此无需浏览XAML树 基本上是这样的: *使用GetState()获取当前触摸屏触摸

Windows Phone具有很好的按钮倾斜效果,如下图所示:


是否可以使用
SpriteBatch
在XNA中重新实现此行为?我可以检测触摸位置并计算矩形角应该位于的点,但我不知道如何使用这种失真来渲染图像。

当然有可能,但涉及到相当多的数学问题

GetState()方法将以与Silverlight中使用TouchLocations几乎相同的方式返回所有屏幕触摸及其状态。 主要的不同之处在于,您已经在像素级工作,因此无需浏览XAML树

基本上是这样的: *使用GetState()获取当前触摸屏触摸采集 *对UI元素进行更新并测试与接触点的冲突。 *计算您的UI元素的哪一部分被触摸过(取决于您想要的准确度,在4个角或更精确的角度) *在要倾斜的方向上设置UI元素的动画 *记录UI元素已被触摸或跟踪动画 *当一个触摸丢失时,确保UI元素识别出这一点并重新设置动画(或在触摸移动时设置另一个方向的动画)

对于您可以使用的一些很酷的动画和过渡,Reach demo(手机版)展示了一些很棒的效果以及如何实现这些效果。其中大多数都是整版效果,但您应该能够分解必要的部分以获得您想要的平铺动画效果:

如果有帮助,请告诉我

Matrix projection = Matrix.CreateOrthographicOffCenter(0, viewport.Width, viewport.Height, 0, 0, 1);
Matrix halfPixelOffset = Matrix.CreateTranslation(-0.5f, -0.5f, 0);

basicEffect.World = Matrix.Identity;
basicEffect.View = Matrix.Identity;
basicEffect.Projection = halfPixelOffset * projection;

basicEffect.TextureEnabled = true;
basicEffect.VertexColorEnabled = true;

spriteBatch.Begin(0, null, null, null, null, basicEffect);
您可以将基本效果传递到SpriteBatch.Begin方法中。这允许您将自定义着色器与SpriteBatch一起使用,更有趣的是,在您的情况下,它允许您控制相机并变换支持SpriteBatch的四边形。以上是默认值,应与标准SpriteBatch的行为相同,您不能更改点规格当然,旋转应该能达到你想要的效果

要更改四边形的三维位置,只需更改基本效果世界矩阵

例如:

basicEffect.View = Matrix.Identity * Matrix.CreateRotationY(.002);

我特别感兴趣的是如何在绘制精灵时变换它。我感觉可以通过将正确的
矩阵
传递给
SpriteBatch.Begin
。传递给sprite批处理的矩阵更多的是关于相机定位。如果你想看到它的实际效果,请查看xnaresources.com上的平铺教程。查看reach演示以了解以上内容的更多详细信息是的,当精灵直接面对相机时,此片段实现默认投影。我问题的本质是,如何创建倾斜精灵的非默认投影矩阵?我粘贴了您的代码,但似乎不起作用。现在只绘制了精灵的右半部分,不是吗他离开时是看不见的。我尝试了其他数字而不是0.002,但也不起作用。我得到了一条垂直条纹的精灵,它仍然像以前一样正对着相机,或者根本没有精灵。更改视图矩阵会产生完全相同的输出。你真的试过运行代码吗?