gpt4 book ai didi

.net - 在 F# 中运行 Monogame 的问题

转载 作者:行者123 更新时间:2023-12-03 23:48:06 25 4
gpt4 key购买 nike

我正在尝试使用 F#,我想看看是否可以在 F# 中使用 Monogame 做一些简单的事情。我认为从 C# 到 f# 的转换会很简单,但到目前为止还没有。到目前为止,我拥有的代码只是一个应该运行的简单空项目。或者至少它会在 C# 中。但是在 F# 中运行它会产生一个

Unhandled exception. System.InvalidOperationException: No Graphics Device Service

我的代码是这样的,它真的没有做任何疯狂的事情。我被迫为 spritebatch 使用可变 val,因为无论出于何种原因您都必须在 LoadContent 中实例化它。任何人都对我做错了什么有任何指示?我将不胜感激。
type GameState = 
inherit Game
new() = { inherit Game(); Sb = null; }
member this.Gfx : GraphicsDeviceManager = new GraphicsDeviceManager(this)
val mutable Sb : SpriteBatch

override this.Initialize() =
this.Content.RootDirectory <- "Content"
this.IsMouseVisible <- false
base.Initialize ()

override this.LoadContent () =
this.Sb <- new SpriteBatch(this.Gfx.GraphicsDevice)
base.LoadContent ()

override this.UnloadContent () =
base.UnloadContent ()

override this.Update (gameTime : GameTime) =
base.Update (gameTime)

override this.Draw (gameTime : GameTime) =
this.Gfx.GraphicsDevice.Clear (Color.CornflowerBlue)
this.Sb.Begin()
//draw here
this.Sb.End()
base.Draw (gameTime)

[<EntryPoint>]
let main argv =
let gs = new GameState()
gs.Run()
0 // return an integer exit code

最佳答案

Asti 是正确的,你不想创建一个新的 GraphicsDeviceManager反复。

这是一些对您的代码进行最小更改的工作代码。请注意,要在构造函数时定义值,您需要 ()在类型名称之后。使用 mutableSpriteBatch在这种情况下很难看但很常见,你不需要让它成为成员:

open Microsoft.Xna.Framework
open Microsoft.Xna.Framework.Graphics

type GameState() as this =
inherit Game()
let gfx = new GraphicsDeviceManager(this)
let mutable sb = Unchecked.defaultof<SpriteBatch>

override this.Initialize() =
this.Content.RootDirectory <- "Content"
this.IsMouseVisible <- false
base.Initialize ()

override this.LoadContent () =
sb <- new SpriteBatch(gfx.GraphicsDevice)
base.LoadContent ()

override this.UnloadContent () =
base.UnloadContent ()

override this.Update (gameTime : GameTime) =
base.Update (gameTime)

override this.Draw (gameTime : GameTime) =
gfx.GraphicsDevice.Clear (Color.CornflowerBlue)
sb.Begin()
//draw here
sb.End()
base.Draw (gameTime)

[<EntryPoint>]
let main argv =
let gs = new GameState()
gs.Run()
0 //

随意看看 this repo我的它给出了一个使用 F# 的 MonoGame 的工作示例(虽然它现在可能有点过时),包括基本的内容管道。

关于.net - 在 F# 中运行 Monogame 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61332117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com