过去几周我一直在努力学习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!
这可能只是我犯过的一个非常愚蠢的错误,但如果有人发现问题,我会非常感激!
由于
答案 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运行时会在需要时自动调用它。