Выпуск Запуск Monogame в F # - PullRequest
       20

Выпуск Запуск Monogame в F #

3 голосов
/ 21 апреля 2020

Я немного экспериментирую с F # и хочу посмотреть, смогу ли я сделать что-нибудь простое с Monogame в F #. Я подумал, что перевод с C# на f # будет простым, но это не так далеко. Код, который у меня есть, пока является простым пустым проектом, который должен быть запущен. Или, по крайней мере, в C#. Однако выполнение этого в F # дает

Unhandled exception. System.InvalidOperationException: No Graphics Device Service

Код, который у меня есть, это то, что действительно не делает ничего сумасшедшего. Я был вынужден использовать изменяемый val для spritebatch, так как вы должны создать его экземпляр в 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

1 Ответ

3 голосов
/ 21 апреля 2020

Асти верна, вы не хотите многократно создавать новый GraphicsDeviceManager.

Вот некоторый рабочий код с минимальными изменениями в вашем. Обратите внимание, что для определения значений во время конструктора вам нужно () после имени типа. Использование mutable для SpriteBatch в этом случае уродливо, но часто, и вам не нужно делать его членом:

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 // 

Не стесняйтесь взглянуть на этого репо моего, который дает рабочий пример использования MonoGame с F # (хотя, возможно, он сейчас немного устарел), включая основные c конвейеры контента.

...