在SdlDotNet中使用Video.Screen而不是Surface对象

时间:2012-07-08 04:08:23

标签: c# sdl sdl.net

我见过的每个SDL或SdlDotNet教程都使用已定义的Surface作为主屏幕。例如

private static Surface videoscreen;
videoscreen = SetVideoMode(800, 600, 16, false, false, false, true);
videoscreen.Fill(Color.Black);
videoscreen.Blit(sprite);
videoscreen.Update();

然而,在尝试使用SdlDotNet构建游戏时,我注意到我可以简单地使用Video.Screen来执行我通常在Surface屏幕上执行的任何操作。例如:

Video.SetVideoMode(800, 600, 16, false, false, false, true);
Video.Screen.Fill(Color.Black);
Video.Screen.Blit(sprite);
Video.Screen.Update();

为什么每个人仍然使用已定义的Surface?我假设在我的小游戏范围内我没有遇到某种性能或稳定性问题,但我想知道以后我可能会遇到麻烦。

1 个答案:

答案 0 :(得分:1)

我知道帖子很旧但是!如果你仍然感兴趣,这是我对这个主题的看法:

Surface方法和Video.SetVideoMode()属性返回的Video.Screen对象不相等,但它们都使用相同的句柄,即指向图形数据的指针。 我会说它主要是风格问题,两者都是在主显示器表面上工作的有效方法。

  • Video.SetVideoMode()在Video.cs中引出以下内容:

    public static Surface SetVideoMode(int width, int height, int bitsPerPixel, bool resizable, bool openGL, bool fullScreen, bool hardwareSurface, bool frame)
    {
        /* ... */
        return new Surface(Sdl.SDL_SetVideoMode(width, height, bitsPerPixel, (int)flags), true);
    }
    

    ...在Surface.cs中调用以下内部构造函数:

    internal Surface(IntPtr handle, bool isVideoMode)
    {
        this.Handle = handle;
        this.isVideoMode = isVideoMode;
    }
    
  • 或者,这是Video.cs中的Video.Screen属性定义:

    /// <summary>
    /// Gets the surface for the window or screen,
    /// must be preceded by a call to SetVideoMode
    /// </summary>
    /// <returns>The main screen surface</returns>
    public static Surface Screen
    {
        get
        {
            return Surface.FromScreenPtr(Sdl.SDL_GetVideoSurface());
        }
    }
    

    ...在Surface.cs中调用以下内部工厂方法:

    internal static Surface FromScreenPtr(IntPtr surfacePtr)
    {
        return new Surface(surfacePtr);
    }
    

    ...反过来在Surface.cs中调用以下内部构造函数:

    internal Surface(IntPtr handle)
    {
        this.Handle = handle;
    }
    

如果您比较SurfaceVideo.SetVideoMode()返回的Video.Screen个对象的句柄,您会发现它们是相同的,这是您需要知道的所有内容,以确保您实际上是使用相同的数据。

希望这有帮助!

来源:

https://www.assembla.com/code/lightcs/subversion/nodes/trunk/sdldotnet-6.1.0/source/src/Graphics/Video.cs?rev=4

https://www.assembla.com/code/lightcs/subversion/nodes/trunk/sdldotnet-6.1.0/source/src/Graphics/Surface.cs?rev=4