关于c#:XNA:如何仅绘制sprite的”比萨饼切片”?

 2021-02-26 

XNA: How can I draw only a “pizza slice” of my sprite?

我目前正在开发一个有关XNA(C#)中的基础结构构建和管理的游戏。
我目前试图实现的目标是使游戏在火车Rails之间绘制"弯曲"。我想通过仅绘制圆形纹理的特定部分来做到这一点。
换句话说,我只想绘制此纹理的"比萨饼切片"。需要绘制的圆的切片基于三个点:

  • sprite的中心;
  • 可变位置" a";
  • 可变位置" b";

这三个点共同决定了我在屏幕上绘制了多少圆圈,例如披萨片有多大。

简单地说:如果我有一个圆并将其从中心切到点" a",然后又从中心切到点" b",我怎么能只画出我刚切过的部分出来了吗?

此切片必须实时更改,因此根据这两个位置" a"和" b",切片会变得越来越大。

达到此效果的最佳方法是什么?


这完全可以在着色器中通过相对简单的触发来完成。在您的像素着色器(效果)中尝试以下操作:

1
2
3
float dX = b.x - a.x;
float dY = b.y - a.y;
float theta = Math.Atan2(dY, dX);

请注意theta将以弧度为单位。然后只要检查theta是否在您的限制范围内即可。假设介于0和pi / 2之间。如果是,则对纹理进行采样;如果不是,则返回不带alpha(透明)的float4。那应该给您纹理的右上四分之一,其余的都被遮盖了。如果您想将theta转换为度数,也可以这样做,但是我建议保持弧度,因为这样会使您的数学变得容易得多。

您必须使用

设置限制

1
2
effect.Parameters['thetamin']=/*minTheta*/;
effect.Parameters['thetamax']=/*maxTheta*/;

呼叫EffectPass.Apply()之前。