首页 / C# / c# – F#游戏开发:修改状态变量
c# – F#游戏开发:修改状态变量
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – F#游戏开发:修改状态变量,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3596字,纯文字阅读大概需要6分钟。
内容图文
open SFML.Graphics
open SFML.Window
let window = new RenderWindow(new VideoMode(200u, 200u), "SFML works!")
let shape = new CircleShape(10.0f, FillColor=Color.Green)
let mutable pressedKey = Keyboard.Key.Unknown
let moveKeys = [ Keyboard.Key.Up; Keyboard.Key.Left;
Keyboard.Key.Down; Keyboard.Key.Right ]
let keyPress (e : KeyEventArgs) =
match e.Code with
| moveKeys -> pressedKey <- e.Code
| _ -> pressedKey <- Keyboard.Key.Unknown
let keyRelease (e : KeyEventArgs) =
let pressedKeys = List.filter (fun key -> Keyboard.IsKeyPressed(key)) moveKeys
if pressedKeys.IsEmpty then pressedKey <- Keyboard.Key.Unknown
else pressedKey <- pressedKeys.Head
window.Closed.Add(fun evArgs -> window.Close())
window.KeyPressed.Add(keyPress)
window.KeyReleased.Add(keyRelease)
while window.IsOpen() do
match pressedKey with
| Keyboard.Key.Up -> shape.Position <- new Vector2f(shape.Position.X, shape.Position.Y - 0.1f)
| Keyboard.Key.Left -> shape.Position <- new Vector2f(shape.Position.X - 0.1f, shape.Position.Y)
| Keyboard.Key.Down -> shape.Position <- new Vector2f(shape.Position.X, shape.Position.Y + 0.1f)
| Keyboard.Key.Right -> shape.Position <- new Vector2f(shape.Position.X + 0.1f, shape.Position.Y)
| _ -> ()
window.DispatchEvents()
window.Clear()
window.Draw(shape)
window.Display()
在上面的代码示例中,我创建了一个圆圈,让它通过按箭头键移动.有问题的状态变量是圆的位置,由Vector2f对象(SFML库的一部分)表示
我的问题涉及代码段的结束,在那里我找到按下的键然后移动圆圈.从C#背景我的代码的这部分看起来很糟糕.
在C#中我会简单地执行以下操作:
switch (pressedKey) {
case Keyboard.Key.Up:
shape.Position.Y -= 0.1f;
// etc, etc
}
>创建这些新的Vector2f对象是否会导致不必要的
与我修改状态变量的方式相比
C#?
>有更好的方法吗?
解决方法:
1)这是一个始终具体案例的性能问题.在这种情况下答案是否定的.如果您在循环中对10,000个对象执行此操作,则使用可变数据.一般来说,使事物变得不可变,可以让你对他们的行为做出更容易的假设,这是非常重要的.
2)这是您可以使用此代码的方向.
open SFML.Graphics
open SFML.Window
open System
type HandleKeyboard(window : RenderWindow) =
let mutable keyState = Set.empty
let keyPressedHandle =
window.KeyPressed.Subscribe(fun key ->
keyState <- keyState.Add key.Code)
let keyReleasedHandle =
window.KeyReleased.Subscribe(fun key ->
keyState <- keyState.Remove key.Code)
let validMovementKey (keyPress : Keyboard.Key) =
match keyPress with
| Keyboard.Key.Up
| Keyboard.Key.Left
| Keyboard.Key.Down
| Keyboard.Key.Right -> true
| _ -> false
let keyToMovement (keyPress : Keyboard.Key) =
match keyPress with
| Keyboard.Key.Up -> Vector2f( 0.0f, -0.1f)
| Keyboard.Key.Left -> Vector2f(-0.1f, 0.0f)
| Keyboard.Key.Down -> Vector2f( 0.0f, 0.1f)
| Keyboard.Key.Right -> Vector2f( 0.1f, 0.0f)
| _ -> Vector2f(0.0f, 0.0f)
member this.IsKeyPressed (key : Keyboard.Key) =
keyState |> Set.contains key
member this.GetMovement () =
keyState
|> Set.filter validMovementKey
|> Seq.map keyToMovement
|> Seq.fold (+) (Vector2f(0.0f, 0.0f))
interface IDisposable with
member this.Dispose() =
keyPressedHandle.Dispose()
keyReleasedHandle.Dispose()
type SomeState = {
position : Vector2f;
}
let startGame() =
use window = new RenderWindow(VideoMode(200u, 200u), "SFML works!")
use shape = new CircleShape(10.0f, FillColor = Color.Green)
use keyboard = new HandleKeyboard(window)
window.Closed.Add(fun evArgs -> window.Close())
let rec mainLoop state =
window.DispatchEvents()
if keyboard.IsKeyPressed Keyboard.Key.Escape then
window.Close()
let newPosition = state.position + keyboard.GetMovement()
shape.Position <- newPosition
if window.IsOpen() then
window.Clear()
window.Draw(shape)
window.Display()
mainLoop {position = newPosition}
mainLoop {position = Vector2f(0.0f, 0.0f)}
startGame()
内容总结
以上是互联网集市为您收集整理的c# – F#游戏开发:修改状态变量全部内容,希望文章能够帮你解决c# – F#游戏开发:修改状态变量所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。