C#游戏引擎模拟游戏相机/视图

时间:2017-05-22 11:13:32

标签: c# views gdi+

我是新来的,但在我遇到问题时多年来一直提到这个网站。你们非常乐于助人。不幸的是,我希望实现的目标,我无法在任何地方找到。

我正在使用C#GDI +构建一个游戏引擎,并且它的表现非常出色(考虑到GDI +对游戏的无能为力)。

我正在尝试模拟视图。因此,如果视图位于某个位置,则会根据ViewXViewY位置更新GameObject位置(在Engine.Loop()循环中)。例如:

obj.X -= ViewY;
obj.Y -= ViewY;

在实践中,这是有效的。视图移动,GameObject全部位于正确的位置。但问题是,当我返回对象的值时,它们只返回该位置,如果ViewX位置例如设置为1,则对象全部移动,看起来像视图正在移动...除了视图不是。

下面是游戏循环的代码(非常自我解释):

                //Game loop
            if (objects.Count > 0)
            {

                foreach (GameObject obj in instances)
                {
                    try
                    {
                        if (obj.Active) //Only perform this action if the object is currently active
                        {
                            if (RectangleInsideView(obj.X, obj.Y, obj.Width, obj.Height))
                            {
                                obj.Draw();
                            }
                            obj.Step();

                            //It's because it is constantly updating the object position based on the views position rather than accepting where the view is and
                            //Just relating it's position to it. 
                            //Eg. if ViewX = 2, obj.X is = obj.X -2...
                            //We some how need to have a false X and Y variable to set and return...
                            obj.X = obj.X - ViewX;
                            obj.Y = obj.Y - ViewY;
                        }
                    }
                    catch (Exception ex) { }
                }
            }

我知道为什么会这样,但我不明白我是如何解决它的。

1 个答案:

答案 0 :(得分:0)

我不太理解这个问题,但这听起来不对:

  

因此,如果视图位于某个位置,则GameObject位置为   更新(在Engine.Loop()循环中)基于ViewX和ViewY   位置。

obj.X = obj.X - ViewX;
obj.Y = obj.Y - ViewY;

有物体有位置。视图只绘制对象。如果您使用GDI +进行游戏,那么还有很多工作要做!

这是什么?

foreach (GameObject obj in instances)
{
    if (obj.Active) //Only perform this action if the object is currently active
    {
        // obj.X -= ViewY and obj.Y -= ViewY;;
        GameObject objCopy = view.convertViewIn();

        Point[] points = view.convertToScreenCoords(objCopy.getPoints());
        Point a = ps[0];
        Point b = ps[1];
        graphics.DrawLine(usePen, a.X, a.Y, b.X, b.Y);
    }
}

public override Point[] convertToScreenCoords(IList<Vector3D> list)
{
    Point[] points = new Point[list.Count];
    for (int i = 0; i < list.Count; i++)
    {
        points[i] = convertToScreenCoords(list[i]);
    }
    return points;
}

public override Point convertToScreenCoords(TheoCAD.Maths.Vector3D coords)
{
    return coords.GetTransformedCoord(this.matrixRotateScaleToScreen).toPoint();
}

public Vector3D GetTransformedCoord(Matrix3D matrix)
{
    double[] result = new double[4];
    double[] temp = new double[4];
    temp[0] = this.X;
    temp[1] = this.Y;
    temp[2] = this.Z;
    temp[3] = 1d;

    for (int i = 0; i <= 3; i++)
    {
        result[i] = 0;
        for (int j = 0; j <= 3; j++)
        {
            result[i] += matrix[i, j] * temp[j];
        }
    }

    if (Math.Abs(result[3]) >= 1e-8)
    {
        result[0] /= result[3];
        result[1] /= result[3];
        result[2] /= result[3];
    }
    return new Vector3D(result[0], result[1], result[2]);
}

我会推荐“Java中的杀手游戏编程”。有怎么做这样的事情。 http://shop.oreilly.com/product/9780596007300.do