【问题标题】:XNA: How can I draw only a "pizza slice" of my sprite?XNA:我怎样才能只画出我的精灵的“披萨片”?
【发布时间】:2014-04-30 15:45:42
【问题描述】:

我目前正在用 XNA(C#) 构建一个关于基础设施建设和管理的游戏。 我目前想要实现的是让游戏在火车轨道之间画出“弯道”。我想通过仅绘制圆形纹理的特定部分来做到这一点。
换句话说,我只想绘制这种纹理的“披萨片”。需要绘制的圆的切片基于三个点:

  • 精灵的中心;
  • 可变位置'a';
  • 可变位置'b';

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

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

该切片必须实时更改,因此切片会根据“a”和“b”这两个位置变得更大和更小。

实现这种效果的最佳方法是什么?

【问题讨论】:

    标签: c# xna


    【解决方案1】:

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

    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 转换为度数,您也可以这样做,但我建议您使用弧度,因为它可以让您的数学变得更容易。

    你必须设置你的限制

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

    在致电EffectPass.Apply()之前。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-24
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多