欢迎来到我的个人博客!
- 关于我:一个热爱编程的开发者,喜欢探索新技术和分享学习心得
- 博客内容:主要分享编程技巧、开发经验、项目实践和个人思考 感谢你的访问,希望我的分享能对你有所帮助!
欢迎来到我的个人博客!
在 Windows 和 Arch Linux 上,让 Caps Lock 键变成中英文切换键 用惯了 Mac 之后,再回到 Windows 或 Linux 电脑上,总有些小地方让人感觉不太适应。对我来说,其中一个就是键盘上的 Caps Lock 键。 在 macOS 上,Caps Lock 键默认可以用来快速切换中英文输入法,这个设计非常直观,也减少了手指的移动距离。但在 Windows 和大多数 Linux 发行版里,这个键通常只负责大小写锁定,一个功能对我来说使用频率并不高。于是,我便开始琢磨,能不能在这两大主流操作系统上也实现类似的功能。 经过一番探索,我找到了解决方案。在 Windows 上,我们可以使用 AutoHotkey;而在 Arch Linux 上,我选择的是Keyd。 Windows 篇:使用 AutoHotkey AutoHotkey 是一款免费且功能强大的自动化脚本软件,可以通过编写脚本来定制各种键盘快捷键。我们只需要用到它最基础的一点功能。 准备工作 首先,你需要从 AutoHotkey 的官网(https://www.autohotkey.com/)下载并安装它。安装时选择默认选项即可。 实现 Caps Lock 切换中英文 这个脚本不仅能让单击 Caps Lock 切换中英文,还保留了长按切换大小写的功能。 在使用前,请确保你的 Windows 系统默认的中英文切换快捷键是 Ctrl + Space。如果不是,可以在“设置”->“时间和语言”->“语言和区域”->“输入”->“高级键盘设置”中进行修改。 脚本内容如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 #Requires AutoHotkey v2.0 #SingleInstance Force ; 让脚本在后台持续运行 Persistent global isCapsPressed := false CapsLock:: { if (KeyWait("CapsLock", "T0.5")) { if(!isCapsPressed){ ; 如果是单击,则发送 Ctrl+Space 来切换中英文 Send "^{Space}" } global isCapsPressed := false } else { if(!isCapsPressed){ global isCapsPressed := true ; 如果是长按(超过0.5秒),则切换大小写锁定状态 SetCapsLockState !GetKeyState("CapsLock", "T") } } } 如何使用这个脚本: ...
原理分析 核心概念:三维模型的二维切片 模型切片处理 将3D模型沿Y轴(垂直方向)切割为N层横截面,每层保存为单独的2D精灵图(Sprite) 分层渲染机制 1 2 3 4 5 6 7 for i = 1, layer_count do draw_sprite( position.x + i * offset_x, position.y + i * offset_y, layer[i] ) end 通过逐层叠加渲染,每层施加位移偏移量,模拟Z轴深度 视觉欺骗原理 利用人眼的透视错觉,通过各层错位移动产生立体感,配合光源统一处理增强立体效果
在 Roblox 游戏开发领域,高效的工具管理与资源整合是提升开发效率的关键。aftman 工作流凭借其强大的工具管理能力,成为开发者的得力助手。它以 aftman 作为工具管理器(也可以用使用npm,毕竟aftman很久不更新了),统筹 wally 和 rojo 两大工具,前者用于管理第三方库,后者负责同步,搭配 vscode 中的 roblox lsp 插件实现语法补全,还可借助 roblox lsp(knit)插件和 selene 进一步优化语法与错误检测。接下来,就为大家详细介绍具体使用方法。 安装 aftman 想要开启 aftman 工作流,首先要安装 aftman。前往 GitHub 网站,找到与你系统对应的版本进行下载安装。安装完成后,便可着手创建新项目。在当前文件夹下,通过运行aftman init命令,创建一个新的aftman.toml文件,这是后续管理工具的重要配置文件。 (这部分也以使用npm进行,不过wally好像在npm中没有包,可以自己放入环境变量中,rojo可以直接使用npm进行安装,比aftman方便些) 添加工具 添加 rojo 添加工具时,以 rojo 为例(==我这里使用的是当前的最新版,现在最新可能不是这个版本==)你可以使用以下命令: 1 2 3 4 5 6 # 添加最新版本的rojo aftman add rojo-rbx/rojo # 添加指定版本7.5.1的rojo aftman add rojo-rbx/rojo@7.5.1 # 以不同的二进制名称添加工具,例如添加ripgrep并命名为rg aftman add BurntSushi/ripgrep rg 添加 wally 使用 aftman 添加 wally 的流程如下: 1 2 3 4 5 6 # 初始化aftman配置 aftman init # 添加wally工具 aftman add UpliftGames/wally # 安装已添加的工具 aftman install 配置 wally 在 wally 中添加服务器或客户端的包,需要对配置文件进行设置。在相关配置文件中,通过以下内容进行配置: ...
核心功能实现 区域检测 使用 PartZone 模块创建检测区域(名为 “water”)(可以使用ZonePlus来实现) 当玩家进入指定 Part(Sea)时激活游泳状态 玩家离开区域时恢复正常状态 游泳状态控制 1 2 3 4 5 6 -- 进入水体时 humanoid:SetStateEnabled(Enum.HumanoidStateType.Jumping, false) -- 禁用跳跃 humanoid:ChangeState(Enum.HumanoidStateType.Swimming) -- 强制游泳状态 -- 离开水体时 humanoid:SetStateEnabled(Enum.HumanoidStateType.Jumping, true) -- 恢复跳跃能力 使用LinearVelocity推动人物移动 创建 LinearVelocity 对象施加推进力 1 2 3 Swim = Instance.new("LinearVelocity") Swim.MaxAxesForce = Vector3.new(3000,3000,3000) Swim.Attachment0 = Root.RootAttachment -- 绑定到角色根部件 游泳运动机制 1 2 3 4 function Swimming() -- 按移动方向和步行速度推进 Swim.VectorVelocity = Humanoid.MoveDirection * Humanoid.WalkSpeed end 关键代码设计 状态管理优化 动态创建/销毁 LinearVelocity 对象(Swim) 离开水域时通过 Swim:Destroy() 释放资源 每帧运行 1 2 3 RS.PreRender:Connect(function() if Swim then Swimming() end -- 每帧更新游泳动力 end) 利用 PreRender 事件保证流畅的水中移动 帧率无关的物理更新 玩家的状态设置 ...
在 Roblox 开发中,我们经常需要获取一个不受玩家本地时区影响的标准时间,即 UTC(协调世界时)。虽然在服务器上可以直接使用 os.time(),因为它本身就在一个受控的环境中运行,但在客户端,玩家的设备时区各不相同,直接获取本地时间可能会导致数据不一致。 这里记录一个从客户端获取 UTC 时间的 Lua 脚本函数,并对其原理进行简单说明。 脚本代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 TimeAbout = {} TimeAbout.GetUTC = function(add:number?) -- 如果传入的参数不是数字,则默认为 0 if type(add) ~= "number" then add = 0 end -- 获取当前本地时间戳 local currentTime = os.time() -- 使用 "!" 标记获取当前时间的 UTC 时间表 local UTC = os.date("!*t", currentTime) -- 获取当前时间的本地时间表 local localtime = os.date("*t", currentTime) -- 计算本地时间与 UTC 时间的时间差(秒) -- os.difftime 会返回两个时间戳的差值 local diff = os.difftime(os.time(UTC), os.time(localtime)) -- 将本地时间戳加上时差,得到 UTC 时间戳 local utcTime = currentTime + diff -- 返回 UTC 时间戳,并加上可选的小时偏移量 return utcTime + add * 3600 end 实现原理说明 这个函数的核心思想是计算出本地时间与 UTC 时间之间的时差,然后用这个时差来修正本地时间戳。 ...