创建自定义键盘控件 [Elm]

2023-12-11

我正在尝试为 4 人游戏创建自定义键盘控件。现在,密钥是这样预先确定的:

type Orient = { x:Int, y:Int }
type GameInput = { space:Bool, delta:Time, so1:Orient, so2:Orient, so3:Orient, 
                   so4:Orient, amount:Int }


gameInput : Signal GameInput
gameInput = 
             let sampledInput = sampleOn delta 
                                <| GameInput <~ Keyboard.space
                                              ~ delta
                                              ~ Keyboard.arrows
                                              ~ Keyboard.wasd
                                              ~ Keyboard.directions (toCode 'O')
                                                                    (toCode 'L')
                                                                    (toCode 'K')
                                                                    (toCode 'M')
                                              ~ Keyboard.directions (toCode 'Y')
                                                                    (toCode 'H')
                                                                    (toCode 'G')
                                                                    (toCode 'J')
                                              ~ amountPlayers.signal
             in  lift (Debug.watch "input") sampledInput

我(为每个玩家)创建了以下形式的输入:

type CustomKeys = { up:Char, down:Char, left:Char, right:Char }

customKeys2 : Signal CustomKeys
customKeys2 = CustomKeys <~ ck2up.signal 
                          ~ ck2down.signal 
                          ~ ck2left.signal 
                          ~ ck2right.signal

ck2up : Input Char
ck2up = input 'W'

ck2down : Input Char
ck2down = input 'S'

ck2left : Input Char
ck2left = input 'A'

ck2right : Input Char
ck2right = input 'D'

其他地方的处理程序将根据玩家的需要调整输入的值。但我很难弄清楚如何将这些值插入到参数中Keyboard.directions.

我尝试将论点提升为Keyboard.directions直接地:

~ Keyboard.directions <~ ...

任何结果都将成为信号的信号,无法被提升到GameInput(正确)。

我尝试将字符作为参数传递给gameInput:

gameInput2 : Signal GameInput
gameInput2 = gameInput <~ customKeys2

gameInput : CustomKeys -> Signal GameInput
gameInput { up,down,left,right } = GameInput <~ Keyboard.directions (toCode up)
                                                                    (toCode down)
                                                                    (toCode left)
                                                                    (toCode right)

Now gameInput2结果将得到一个信号的信号。

我的最后一个想法是组合信号,但这对我来说似乎不是一个选择,因为我希望一个信号依赖于另一个信号。


直接使用Keyboard.directions是行不通的。问题是在游戏开始时可以更改按键,这样你就有了一些Signal Char. And Keyboard.direction从“正常类型”到“信号类型”。所以你举不起来。

但您也可以访问当前按住的键,Keyboard.keysDown。我查了一下实施Keyboard.directions我认为你可以在 Elm 中以一种需要的方式重新创建它Signal Int论据。

这是正常的 Elm 实现Keyboard.directions:

directions : Int -> Int -> Int -> Int -> Signal { x : Int, y : Int }
directions up down left right = 
  (\kd -> 
    List.filter (\ky -> List.member ky [up,down,left,right]) kd |>
      List.foldl (\ky st -> if | ky == up    -> { st | y <- st.y + 1 }
                               | ky == down  -> { st | y <- st.y - 1 }
                               | ky == left  -> { st | x <- st.x - 1 }
                               | ky == right -> { st | x <- st.x + 1 }
      ) {x=0,y=0}
  ) <~ Keyboard.keysDown

这是您想要使用的实现:

directions : Signal Int -> Signal Int -> Signal Int -> Signal Int -> Signal { x : Int, y : Int }
directions up down left right = 
  (\u d l r kd -> 
    List.filter (\ky -> List.member ky [u,d,l,r]) kd |>
      List.foldl (\ky st -> if | ky == u -> { st | y <- st.y + 1 }
                               | ky == d -> { st | y <- st.y - 1 }
                               | ky == l -> { st | x <- st.x - 1 }
                               | ky == r -> { st | x <- st.x + 1 }
      ) {x=0,y=0}
  ) <~ up ~ down ~ left ~ right ~ Keyboard.keysDown

请随意重构,我只是快速地将这段代码组合在一起,因此对于单个函数来说它有点太大了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

创建自定义键盘控件 [Elm] 的相关文章

随机推荐

  • 产品口味本地化

    我有 3 种产品风格 每种风格都进行了调试和发布 我已经成功地为每种风格赋予了独特的字符串和图标 现在我正在准备本地化 这需要针对每种产品口味使用不同的字符串 这是我当前的文件夹 目录设置 myApp src main res values
  • 如何在运行 CLI 和 Apache2Handler 时将系统环境变量获取到 PHP 中?

    我的系统是Ubuntu我已经设置了我的环境变量 etc environment 如果我在跑步PHP脚本使用CLI 环境变量来自 etc environment被认可 但是 如果我去执行PHP脚本通过http domain test php
  • Python电子邮件引用-可打印编码问题

    我使用以下命令从 Gmail 中提取电子邮件 def getMsgs try conn imaplib IMAP4 SSL imap gmail com 993 except print Failed to connect print Is
  • 使用 PyQt4 进行 OpenCV 视频捕获

    我一直在尝试使用 PyQt4 GUI 和 OpenCV 捕获视频 我创建了一些按钮 如 开始 结束 等来控制捕获 开始很好 但我无法停止捕捉 要停止捕获 我需要中断 while 循环开始捕获 下面的功能 我无法实现 现在 结束捕获 毁坏了窗
  • 在贪婪重复中回溯平衡组可能会导致不平衡?

    作为出于此问题的目的而一般编写的示例 我的目的是匹配一些数量a的 那么同样数量的b的 再加上一个b 检查此片段中展示的两种模式 也在 ideone com 上 var r1 new Regex xn a a a
  • 如何使CardView具有可点击和可检查的效果,以及如何使其成为深色主题?

    背景 在引入CardView之前 我在上面做了一些选择器my app模仿卡片 并让用户选择应用程序使用的主题 有些人更喜欢深色主题 问题 我想让它看起来和工作起来更原生 所以我尝试使用 CardView 遗憾的是 我无法理解如何设置 Car
  • Math.cos 不准确

    alert Math cos Math PI 2 为什么结果不精确为零 这是不准确的 还是一些实施错误 Math PI 2是实际值的近似值pi 2 取该近似值的精确余弦值不会产生零 您获得的值是该精确值的近似值 最高可达基础浮点数据类型的精
  • 恢复已删除的 Eclipse 项目

    我想在 eclipse 中创建一个新的 git 存储库 当我删除旧的存储库时 不幸的是整个项目已从工作区中删除了 有什么办法可以恢复项目吗 我将不胜感激你的回答 如果您的工作有另一个存储库 例如中央 git 服务器 另一个开发人员 另一台计
  • 在应用程序之间共享文件

    我可以与另一个应用程序共享一个应用程序相关的数据吗 假设我在 apk2 的 resources raw 文件夹中有一个音乐文件 我可以在 apk1 1 中使用相同的文件吗 thx 如果您的应用程序使用相同的证书进行签名并具有相同的andro
  • 为什么 Vue 无法解析本地主机的图像?

    作为 vue js 的后端 我使用 laravel 端口 8000 在我的数据库中 我有用户及其个人资料照片的名称 this user photo 所以 我想展示这张照片 img alt Profile Photo 当我去http loca
  • MySQL:事务与锁定表

    我对事务与锁定表有点困惑 以确保数据库完整性并确保 SELECT 和 UPDATE 保持同步并且没有其他连接干扰它 我需要 SELECT FROM table WHERE LIMIT 1 if condition passes Update
  • Objective-C:`@synthesize fooBar;` 与`@synthesize fooBar=_fooBar;` [重复]

    这个问题在这里已经有答案了 可能的重复 带下划线前缀的综合属性和变量 这是什么意思 我在代码中见过这两个 有什么不同 synthesize fooBar synthesize fooBar fooBar synthesize fooBar
  • 处理IE浏览器中的ctrl+按键事件

    I m using hotkeys Ctrl key in my flex application getting problem when my app is running in IE when I press Ctrl D im ge
  • 使用 Doctrine 构建通用的 OO ACL

    我正在寻求设计一个以学说为基础的 ACL 系统供我自己使用 尽管我在一些最初的设计考虑因素上遇到了困难 现在我正在考虑根据类和唯一标识符来制作它 并将它们存储在表中 如下所示 Table ACL ResourceClass Resource
  • 子进程打开('source venv/bin/activate'),没有这样的文件?

    我想进入 python 文件中的虚拟环境 但它没有引发这样的文件 import subprocess subprocess Popen source Users XX Desktop mio worker venv bin activate
  • 如何绘制双对数 R 图的线性回归?

    我有以下数据 someFactor 500 x c 1 250 y x 25 someFactor 我以双对数图显示 plot x y log xy 现在我使用线性模型 找出 数据的斜率 model lm log y log x model
  • 如何以编程方式从 Android 删除 SQLite 数据库

    我想从以下位置删除数据库文件Android file system以编程方式 我可以启动 shell 脚本吗adb它又在 Android 空间中运行 shell 脚本来删除数据库 我可以在短时间内完成这件事吗JUnit测试用例 带有syst
  • 哈希表和Trie(前缀树)如何选择?

    因此 如果我必须在哈希表或前缀树之间进行选择 那么导致我选择其中之一的区别因素是什么 从我自己天真的角度来看 使用 trie 似乎有一些额外的开销 因为它不是存储为数组 但就运行时间而言 假设最长的键是最长的英语单词 它本质上可以是 O 1
  • 使用 LightOpenID 登录/注销用户状态

    我正在尝试在我的网站上使用 LightOpenId 来登录 注销用户 这工作正常 但我的问题是 如何跟踪用户登录 注销状态并采取相应的操作 我希望用户仅在登录时访问我的网站功能 并在用户注销时重定向到登录页面 提前致谢 你的问题实际上与Op
  • 创建自定义键盘控件 [Elm]

    我正在尝试为 4 人游戏创建自定义键盘控件 现在 密钥是这样预先确定的 type Orient x Int y Int type GameInput space Bool delta Time so1 Orient so2 Orient s