使用XNA SpriteBatch进行倾斜效果

时间:2013-07-08 12:00:12

标签: xna windows-phone spritebatch

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

Metro Tilt Effect

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

2 个答案:

答案 0 :(得分:3)

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);

您可以将BasicEffect传递给SpriteBatch.Begin方法。这允许您使用带有spritebatch的自定义着色器,更有趣的是在您的情况下允许您控制相机并转换支持SpriteBatch的四边形。以上是默认值,并且应该像标准的SpriteBatch一样,你不能专门改变点,但旋转应该达到你想要的效果。

要更改四边形的3D位置,只需更改basicEffect.World矩阵。

示例:

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

答案 1 :(得分:2)

嗯,这当然是可能的,但涉及到相当多的数学。

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

基本上它会是这样的: *使用GetState()获取当前的触摸面板触摸集合 *通过更新UI元素并测试与触摸点的碰撞。 *计算您的UI元素的哪个部分被触摸(取决于您想要的精确度,无论是4个角还是更精确) *在您想要倾斜的方向上为UI元素设置动画 *记录已触摸UI元素或跟踪动画 *当触摸丢失时,确保UI元素识别出这个并动画回来(如果触摸移动,则在另一个方向上设置动画。

对于您可以使用的一些很酷的动画和过渡,Reach演示(用于手机)显示了一些很棒的效果以及如何实现它们。它们中的大多数都是整页效果,但你应该能够打破必要的位来获得你正在寻找的那种平铺动画效果: http://xbox.create.msdn.com/en-US/education/catalog/sample/reach_graphics_demo

如果有帮助,请告诉我