3

我正在尝试将TexturedCube monodroid 的示例从 C# 转换为 F# 并点击这行 C# 代码(来自类CreateFrameBuffer上的方法PaintingView):

GLContextVersion <- GLContextVersion.Gles1_1

在 F# 中,我必须明确说明的来源,GLContextVersion但我找不到它,因为爱情和金钱。例如,如果PaintingView实现了一个暴露此GLContextVersion属性的接口,那么我相信我必须向上this转换为该接口类型才能调用该属性。

根据文档,AndroidGameView(从中PaintingView派生)实现了此属性,但以下失败并显示Error FS0039: The field, constructor or member 'GLContextVersion' is not defined (FS0039) (TexturedCube)

base.GLContextVersion <- GLContextVersion.Gles1_1

我的 F# 程序在没有这行的 Nexus 7 上运行得很好,但是作为一个书呆子,我也想翻译最后一行!

4

2 回答 2

4

我刚刚查看了 Xamarin 中的代码(它有一个非常简洁的程序集浏览器,可以显示反编译的代码!)。

在我看来,OpenTK-1.0 中确实不存在该属性(在 Android OpenGL 示例中默认引用),并且看起来已被 ContextRenderingAPI 取代(?)。

所以代码可能看起来像

base.ContextRenderingApi <- GLVersion.ES1

查看为 C# 版本提供的源代码,它是 OpenTK 而不是 OpenTK-1.0 引用,因此很可能是一个破坏性的 API 更改,而不是 C#/F# 问题。

编辑: 使用 Monodroid 进行 OpenGL 2.0 绘图(使用 OpenTK) 看起来同样的问题

于 2013-08-05T04:59:57.480 回答
3

可以GLContextVersion保护吗?

来自 F# 规范:注意:此版本的 F# 语言不支持系列规范和受保护规范。

你可以使用反射来做到这一点。

正如 F# 规范所提到的,您可以在实例化期间使用对象表达式访问受保护的成员。如果您使用对象表达式而不是子类进行实例化,它似乎可以工作。使用 Windows 窗体的示例:

{
    new System.Windows.Forms.Form() with
        override this.CreateControlsInstance() =
            System.Windows.Forms.Control.ControlCollection(this)
}
于 2013-08-05T01:09:37.823 回答