Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 寻求建议,寻求最佳方式,创造一个反映;“光束”;用于XNA中的2D游戏_C#_Xna_2d_Collision Detection_Sprite - Fatal编程技术网

C# 寻求建议,寻求最佳方式,创造一个反映;“光束”;用于XNA中的2D游戏

C# 寻求建议,寻求最佳方式,创造一个反映;“光束”;用于XNA中的2D游戏,c#,xna,2d,collision-detection,sprite,C#,Xna,2d,Collision Detection,Sprite,很抱歉,如果这个问题有点开放,但我对C#和XNA还很陌生。。。事实上,这个论坛 我正在创建一个游戏,需要一束光从固定点(附加屏幕截图中的左下角,属于名为PowerStation的类)发射,并从用户可以移动和旋转的镜子反射。我已经添加了一个每像素的碰撞检测方法,可以在附加的捕获中看到(镜像变为红色) 目前,我一直在尝试通过创建一个点并沿着光的路径移动它,直到检测到碰撞,来测试光束路径上的障碍物;从那里记录移动的距离,然后以非均匀方式将光束精灵拉伸所需的量。事实证明,这已经很困难了,我认为这种方法

很抱歉,如果这个问题有点开放,但我对C#和XNA还很陌生。。。事实上,这个论坛

我正在创建一个游戏,需要一束光从固定点(附加屏幕截图中的左下角,属于名为PowerStation的类)发射,并从用户可以移动和旋转的镜子反射。我已经添加了一个每像素的碰撞检测方法,可以在附加的捕获中看到(镜像变为红色)

目前,我一直在尝试通过创建一个点并沿着光的路径移动它,直到检测到碰撞,来测试光束路径上的障碍物;从那里记录移动的距离,然后以非均匀方式将光束精灵拉伸所需的量。事实证明,这已经很困难了,我认为这种方法还有很长的路要走

我只是想知道,在我完全投入可能变得非常复杂或根本不起作用的工作之前,是否有人对检测障碍物、障碍物的旋转以及确定反射光束的方向(镜子的哪一侧被击中)的最佳方法有什么建议

下面是我的Beam课程目前的样子。。。除了一个类之外,所有类都从一个名为Object的基类继承,并且对象都在属于单独类项的静态objectList中声明。如果这是糟糕的、混乱的编码,请道歉

        class Beam : Object
{
    private Vector2 start;
    private double length;
    private Vector2 POC;



    public Beam(Vector2 pos)
        : base(pos)
    {

        spriteName = "beam";
        depth = 0.2f;
        solid = true;
        foreach (Object o in Items.objectList)
        {
            if (o.GetType() == typeof(PowerStation))
            {
                start = o.Origin;
            }
        }
    }

    public override void Update()
    {
        Point newPoint = new Point((int)Origin.X, (int)Origin.Y);
        while ((!(collision(new Mirror(new Vector2(0, 0))))) && (newPoint.X > 0) && (newPoint.Y > 0)) // && boundaries of window
        {
            newPoint.Y--; //will be changed to a Vector
        }

        POC = PointOfCollision(new Mirror(new Vector2(0, 0))); // Need to make it do POC of newPoint, not just the Beam Object!
        length = FindLength(start, new Vector2(50, 50));
        //Scale = new Vector2( , );     //amount to scale sprite


        base.Update();
    }

    private double FindLength(Vector2 pos1, Vector2 pos2)
    {
        return (Math.Sqrt(Math.Pow(Math.Abs(pos2.X - pos1.X), 2.0f) + Math.Pow(Math.Abs(pos2.Y - pos1.Y), 2.0f)));
    }
}

任何帮助都将不胜感激!提前感谢

将一切都表示为向量:你的光束和它们反弹到的形状的侧面。然后是非常简单的代数来检测交点和反射角。它也将比任何基于像素的检测都要快得多。

将一切都表示为向量:你的光束和它们反弹到的形状的侧面。然后是非常简单的代数来检测交点和反射角。它也将比任何基于像素的检测速度快得多。

忘记像素吧——因为镜子显然可以处于任何角度,你肯定会有与镜子相交的地方,而不是在偶数像素上。虽然您可以简单地将碰撞点计算为偶数像素,但这将为光束生成稍微错误的路径

取而代之的是,获取光束并迭代所有镜像,计算光束与镜像平面的交点(处理没有交点的情况),然后检查交点以确保其位于物理镜像内。记录在最短距离内发生的匹配

您几乎可以肯定地通过预先为所有镜像计算边界框来加快计算速度,并且在检查光束时,请注意它从当前点朝向哪个象限——您可以通过两个整数比较来拒绝至少一半(通常为3/4)的所有镜像

重复此操作,直到没有交叉点(光束逃逸),或者它撞到了阻止它而不是反射它的物体

如果有很多镜子,你可以把它放得更远,把屏幕分成几个扇区,每个扇区都有一个镜子列表。只检查当前扇区中的镜像,如果没有命中,请找出下一个扇区,然后重复。这是一个更加数学化的投射光束的方法,以交换在没有单个指令的情况下排除大多数镜像。如果你处理的是用户放置的镜像,我怀疑是否有足够的镜像值得这么做。

忘记像素——因为镜像显然可以在任何角度,你肯定会有与镜像相交的位置,而不是在偶数像素上。虽然您可以简单地将碰撞点计算为偶数像素,但这将为光束生成稍微错误的路径

取而代之的是,获取光束并迭代所有镜像,计算光束与镜像平面的交点(处理没有交点的情况),然后检查交点以确保其位于物理镜像内。记录在最短距离内发生的匹配

您几乎可以肯定地通过预先为所有镜像计算边界框来加快计算速度,并且在检查光束时,请注意它从当前点朝向哪个象限——您可以通过两个整数比较来拒绝至少一半(通常为3/4)的所有镜像

重复此操作,直到没有交叉点(光束逃逸),或者它撞到了阻止它而不是反射它的物体


如果有很多镜子,你可以把它放得更远,把屏幕分成几个扇区,每个扇区都有一个镜子列表。只检查当前扇区中的镜像,如果没有命中,请找出下一个扇区,然后重复。这是一个更加数学化的投射光束的方法,以交换在没有单个指令的情况下排除大多数镜像。如果您正在处理用户放置的镜像,我怀疑是否有足够多的镜像值得这么做。

只要一个提示,我就会将
findleength(Vector2,Vector2)
更改为
findleength(ref Vector2,ref Vector2)
,这样您就可以传递指向它的指针,而不是传递整个
结构,我将
findleength(Vector2,Vector2)
更改为
findleength(ref-Vector2,ref-Vector2)
,这样您就不用传递整个
struct
而只需传递指向它的指针。谢谢您的帮助!非常感谢你的帮助!非常感谢