在f#中找不到方法或对象构造函数

时间:2011-09-26 12:49:35

标签: visual-studio-2010 f# xna

过去几周我一直在努力学习f#,并且在某些方面遇到了一些麻烦。我正在尝试将它与XNA一起使用,并且正在编写一个非常简单的游戏。

我有一个简单的播放器类,它实现了DrawableGameComponent,然后覆盖了Draw,Update和LoadContent方法。

type Player (game:Game) =
        inherit DrawableGameComponent(game)

        let game = game
        let mutable position = new Vector2( float32(0), float32(0) )
        let mutable direction = 1
        let mutable speed = -0.1
        let mutable sprite:Texture2D = null

        override this.LoadContent() =
             sprite <- game.Content.Load<Texture2D>("Sprite")

        override this.Update gt= 
            if direction = -1 && this.Coliding then
                this.Bounce
            this.Jumping
            base.Update(gt)

        override this.Draw gt=
            let spriteBatch = new SpriteBatch(game.GraphicsDevice)
            spriteBatch.Begin()
            spriteBatch.Draw(sprite, position, Color.White)
            spriteBatch.End()
            base.Draw(gt)

依旧......

主Game类然后创建一个新的玩家对象等。

module Game=

    type XnaGame() as this =
        inherit Game()

        do this.Content.RootDirectory <- "XnaGameContent"
        let graphicsDeviceManager = new GraphicsDeviceManager(this)

        let mutable player:Player = new Player(this)
        let mutable spriteBatch : SpriteBatch = null
        let mutable x = 0.f
        let mutable y = 0.f
        let mutable dx = 4.f
        let mutable dy = 4.f

        override game.Initialize() =
            graphicsDeviceManager.GraphicsProfile <- GraphicsProfile.HiDef
            graphicsDeviceManager.PreferredBackBufferWidth <- 640
            graphicsDeviceManager.PreferredBackBufferHeight <- 480
            graphicsDeviceManager.ApplyChanges() 
            spriteBatch <- new SpriteBatch(game.GraphicsDevice)
            base.Initialize()

        override game.LoadContent() =
            player.LoadContent () //PROBLEM IS HERE!!!
            this.Components.Add(player)

        override game.Update gameTime = 
            player.Update gameTime


        override game.Draw gameTime = 
            game.GraphicsDevice.Clear(Color.CornflowerBlue)
            player.Draw gameTime

编译器报告错误“未找到方法或对象构造函数LoadContent”

我觉得这很奇怪,因为Draw和Update都可以正常工作并且可以通过intellisense找到但不是LoadContent!

这可能只是我犯过的一个非常愚蠢的错误,但如果有人发现问题,我会非常感激!

由于

2 个答案:

答案 0 :(得分:3)

DrawableGameComponent.LoadContent受到保护 - 因此您无权从XnaGame课程中调用它。

我不清楚最终会调用它是什么意思,但显然你不应该直接自己调用它。

答案 1 :(得分:2)

错误肯定听起来很混乱。您在LoadContent类型的定义中覆盖了Player成员,但是(正如Jon所指出的)该成员是protected。 F#不允许你使成员更加可见,所以即使你的定义仍然是protected(你通常不能在F#中定义protected成员,所以这就是错误信息很差的原因。)

您可以通过在LoadContent内添加调用Player的其他成员来解决问题:

override this.LoadContent() = 
    sprite <- game.Content.Load<Texture2D>("Sprite") 
member this.LoadContentPublic() = 
    this.LoadContent()

...然后LoadContent成员仍然是protected(无法从外部访问),但新的LoadContentPublic成员将是公开的(这是{{1}的默认设置在F#中,您应该能够从member中调用它。

然而,正如Jon指出的那样 - 也许你不应该自己调用这个方法,因为XNA运行时会在需要时自动调用它。