Modifier Keyのリアルタイムキースキャンを行なって、CotEditor書類上に文字でカーソル描画するAppleScriptです。30 x 30 の文字数のテキストを作成し、CotEditor書類に随時転送することで書き換えています。
AppleScriptでキースキャンといえば、Script/Applet起動時にoptionやcontrolなどのmodifier keys(装飾キー)が押されているかどうかを確認して、動作内容を変更するような用途でした。AppleScriptでGUIを作るのが大変だとか、AppleScriptで気軽にGUIを呼び出せない時代には、割と使われてきた手段です。
そんな中、macOS 10.10以降でCocoaの機能が気軽に利用できるようになってきたことで、Cocoaのキースキャン機能が利用できるようになりました。前述のModifier KeysのスキャンはmacOS側のセキュリティ機構でも問題視していないようで、気軽に使えそうです。ちなみに、SHIFTキーの左右は区別できません。
先日Pixelmator Proで「もぐら叩きゲーム」を作った際にも、このModifier Keysのスキャンは利用しましたが、実際にどの程度使い物になるのか確認しておきたいと考え、AppleScriptからの操作が高速なアプリケーションで試してみることにしてみました。
CotEditorにテキストで描画した画面を転送し、毎回テキスト内容をすべて書き換えることで本格的なゲームの用途に使えるのではないかと考えました。自分ではほとんどゲームを作ったこともないので、別にゲームを量産するつもりはありませんが……。テトリスぐらいならCotEditorのメニューから呼び出すAppleScript内で実行できそうな感じがします。
→ 冗談半分でAppleScriptで作られたTetrisを探してみたら、見つかりました
CotEditorでなくても、他のエディタでも同様の操作はできると思います。
AppleScript名:KeyScan TEST v3.scpt |
— – Created by: Takaaki Naganoya – Created on: 2020/10/03 — – Copyright © 2020 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use framework "AppKit" — for NSEvent use scripting additions –Initialize set curPosX to 1 set curPosY to 1 set curMax to 30 set rText to "" repeat curMax times set rText to rText & "🛑" end repeat tell application "CotEditor" write to console "Real-time Keyscan test with Modifier Keys [ Control ] : Move Left [ Shift ] : Move Right [ Option ] : Move Up [ Command ] : Move Down [ Caps Lock ] : Quit this script" make new document activate end tell –Main Loop repeat set leftF to my checkModifier:"control" set rightF to my checkModifier:"shift" set upF to my checkModifier:"option" set downF to my checkModifier:"command" set quitF to my checkModifier:"caps" if quitF = true then return if leftF = true then if curPosX > 1 then set curPosX to curPosX – 1 end if else if rightF = true then if curPosX ≤ curMax then set curPosX to curPosX + 1 end if end if if upF = true then if curPosY > 1 then set curPosY to curPosY – 1 end if else if downF = true then if curPosY < curMax then set curPosY to curPosY + 1 end if end if –make display text set aText to "" repeat with i from 1 to curMax + 1 if i = curPosX then set aText to aText & "🛑" else set aText to aText & "㍳" end if end repeat set bText to "" repeat with y from 1 to curMax if y = curPosY then set bText to bText & rText & return else set bText to bText & aText & return end if end repeat my displayText(bText) end repeat –テキスト画面描画 on displayText(aText) tell application "CotEditor" tell front document set contents to aText end tell end tell end displayText –複数同時検出に対応 on checkModifier:keyName if keyName = "option" then set theMask to current application’s NSAlternateKeyMask as integer else if keyName = "control" then set theMask to current application’s NSControlKeyMask as integer else if keyName = "command" then set theMask to current application’s NSCommandKeyMask as integer else if keyName = "shift" then set theMask to current application’s NSShiftKeyMask as integer else if keyName = "caps" then set theMask to current application’s NSEventModifierFlagCapsLock as integer else if keyName = "num" then set theMask to current application’s NSEventModifierFlagNumericPad as integer else if keyName = "help" then set theMask to current application’s NSEventModifierFlagHelp as integer else if keyName = "fn" then set theMask to current application’s NSEventModifierFlagFunction as integer else return false end if set theFlag to current application’s NSEvent’s modifierFlags() as integer if ((theFlag div theMask) mod 2) = 0 then return false else return true end if end checkModifier: |