「 👆 ゲームパッドが届いたので Godot はゲームパッドを使えるか 調べようぜ?」
「 ハードウェアと ハードウェアは結局 ピンが束になったバスで つながってるだけで
そこを電気信号が通るだけだぜ。
現代だと USB規格 を使うだろうから、
USB端子を USBポートに差し込めば
OS に何か刺さった、という 自動認識まではしてくれるんじゃないかな」
「 USB メモリータイプの端子挿したら PCから音が出て 反応して セットアップが自動的に始まって
セットアップが終わったぜ」
「 ケーブル挿して1、2時間でチャージが終わるそうだぜ。電池は取り出せなさそう」
📖 Controllers, gamepads, and joysticks
E 0:00:00:0571 director.gd:24 @ _process(): The InputMap action "move_back" doesn't exist. Did you mean "ui_text_backspace"?
<C++ エラー> Condition "!InputMap::get_singleton()->has_action(p_action)" is true. Returning: 0.0
<C++ ソース> core/input/input.cpp:346 @ get_action_raw_strength()
<スタックトレース> director.gd:24 @ _process()
func _process(_delta):
var velocity = Input.get_vector(
&"ui_left", # 左の方
&"ui_right", # 右の方
&"ui_up", # 上の方
&"ui_down") # 下の方
$"GuiArtist/CanvasLayer/→値".text = str(velocity.x)
$"GuiArtist/CanvasLayer/↓値".text = str(velocity.y)
「 👆 よし、取れたぜ。 -1
、0
、1
のいずれかになる感じだぜ」
「 たいてい、公式の記事を読め、と言うところなんだが、 Godot
は金も人手も足りてないのか ホームページもドキュメントも ぐちゃぐちゃなんで……」
func _input(event):
print(event.as_text())
Output:
Joypad Button 0 (Bottom Action, Sony Cross, Xbox A, Nintendo B)
Joypad Button 1 (Right Action, Sony Circle, Xbox B, Nintendo A)
「 この文字列が仕様なのか Godot をアップデートしたら あっさり変わるのか分からん」
📖 Input
func _input(event):
for action in InputMap.get_actions():
if InputMap.event_is_action(event, action):
print("action: " + action)
Output:
Joypad Button 0 (Bottom Action, Sony Cross, Xbox A, Nintendo B)
「 じゃあ この長ったらしい文字列が ボタンのIdになってるわけかだぜ、変なの」
Joypad Button 0 (Bottom Action, Sony Cross, Xbox A, Nintendo B)
Joypad Button 0 (Bottom Action, Sony Cross, Xbox A, Nintendo B)
「 👆 1ボタンと 連射1ボタンが 同じ文字列 返ってくるぜ」
「 連射ボタンだからじゃないか? 押しっぱなしにしてみろだぜ?」
「 確かに 1ボタンは 押しっぱなしにしても反応しないが、
連射1ボタンは 押しっぱなしにしてると 何度も反応するぜ、いわゆるキー・リピート」
「 せっかく 4つ ボタンが付いてるのに そのうちの半分は キーリピートするだけ……」
Joypad Button 4 (Back, Sony Select, Xbox Back, Nintendo -)
Joypad Button 6 (Start, Xbox Menu, Nintendo +)
Unknown
「 👆 セレクト・ボタンが ボタン4、
ラン・ボタンが ボタン6 だぜ。
模倣品のゲームパッドの真ん中上の方にある 本来付いてない何か分からんボタンを押すと Unknown
で、パソコン画面上に 各種設定が出てきたぜ」
&"Unknown"
&"ui_up" &"Joypad Button 1 (Right Action, Sony Circle, Xbox B, Nintendo A)"連射 &"Joypad Button 0 (Bottom Action, Sony Cross, Xbox A, Nintendo B)"連射
&"ui_left" &"ui_right"
&"ui_down" &"Joypad Button 1 (Right Action, Sony Circle, Xbox B, Nintendo A)" &"Joypad Button 0 (Bottom Action, Sony Cross, Xbox A, Nintendo B)"
&"Joypad Button 4 (Back, Sony Select, Xbox Back, Nintendo -)" &"Joypad Button 6 (Start, Xbox Menu, Nintendo +)"
「 美しくないが その文字列に従って コーディングしてみるか、美しくないが」
# 入力1つ1つに分解されて呼び出されるようだ
func _unhandled_input(event):
# 文字列だけだと、押したのか放したのか分からない
var event_as_text = event.as_text()
print("入力: " + event_as_text)
var description = "判定: "
# 初期状態は、ボタンを離しているということにする
var presentation = "."
# ボタンの状態(何もしていないときはこの関数自体が呼び出されない)
if event.is_pressed():
description += "pressed "
presentation = "■"
if event.is_released():
description += "released "
presentation = "."
# 操作したボタン
var button_number = -1
if event_as_text == &"Joypad Button 0 (Bottom Action, Sony Cross, Xbox A, Nintendo B)":
description += "Joypad Button 0"
button_number = 0
elif event_as_text == &"Joypad Button 1 (Right Action, Sony Circle, Xbox B, Nintendo A)":
description += "Joypad Button 1"
button_number = 1
elif event_as_text == &"Joypad Button 4 (Back, Sony Select, Xbox Back, Nintendo -)":
description += "Joypad Button 4"
button_number = 4
elif event_as_text == &"Joypad Button 6 (Start, Xbox Menu, Nintendo +)":
description += "Joypad Button 6"
button_number = 6
print(description)
# "Joypad Button 0 (Bottom Action, Sony Cross, Xbox A, Nintendo B)"
if button_number == 0:
$"GuiArtist/CanvasLayer/I値".text = presentation
# "Joypad Button 1 (Right Action, Sony Circle, Xbox B, Nintendo A)"
elif button_number == 1:
$"GuiArtist/CanvasLayer/II値".text = presentation
# "Joypad Button 4 (Back, Sony Select, Xbox Back, Nintendo -)"
elif button_number == 4:
$"GuiArtist/CanvasLayer/Select値".text = presentation
# "Joypad Button 6 (Start, Xbox Menu, Nintendo +)"
elif button_number == 6:
$"GuiArtist/CanvasLayer/Run値".text = presentation
var is_lever = false
for action in InputMap.get_actions():
if InputMap.event_is_action(event, action):
print("action: " + action)
# 十字キーを想定
if action == &"ui_left" or action == &"ui_right" or action == &"ui_up" or action == &"ui_down":
is_lever = true
# if action == &"JOY_AXIS_INVALID":
# print("JOY_AXIS_INVALID")
# elif action == &"JOY_AXIS_LEFT_X":
# print("JOY_AXIS_LEFT_X")
# elif action == &"JOY_AXIS_LEFT_Y":
# print("JOY_AXIS_LEFT_Y")
# elif action == &"JOY_AXIS_MAX":
# print("JOY_AXIS_MAX")
# elif action == &"JOY_AXIS_RIGHT_X":
# print("JOY_AXIS_RIGHT_X")
# elif action == &"JOY_AXIS_RIGHT_Y":
# print("JOY_AXIS_RIGHT_Y")
# elif action == &"JOY_AXIS_SDL_MAX":
# print("JOY_AXIS_SDL_MAX")
# elif action == &"JOY_AXIS_TRIGGER_LEFT":
# print("JOY_AXIS_TRIGGER_LEFT")
# elif action == &"JOY_AXIS_TRIGGER_RIGHT":
# print("JOY_AXIS_TRIGGER_RIGHT")
# elif action == &"JOY_BUTTON_A":
# print("JOY_BUTTON_A")
# elif action == &"JOY_BUTTON_B":
# print("JOY_BUTTON_B")
# elif action == &"JOY_BUTTON_BACK":
# print("JOY_BUTTON_BACK")
# elif action == &"JOY_BUTTON_DPAD_DOWN":
# print("JOY_BUTTON_DPAD_DOWN")
# elif action == &"JOY_BUTTON_DPAD_LEFT":
# print("JOY_BUTTON_DPAD_LEFT")
# elif action == &"JOY_BUTTON_DPAD_RIGHT":
# print("JOY_BUTTON_DPAD_RIGHT")
# elif action == &"JOY_BUTTON_DPAD_UP":
# print("JOY_BUTTON_DPAD_UP")
# elif action == &"JOY_BUTTON_GUIDE":
# print("JOY_BUTTON_GUIDE")
# elif action == &"JOY_BUTTON_INVALID":
# print("JOY_BUTTON_INVALID")
# elif action == &"JOY_BUTTON_LEFT_SHOULDER":
# print("JOY_BUTTON_LEFT_SHOULDER")
# elif action == &"JOY_BUTTON_LEFT_STICK":
# print("JOY_BUTTON_LEFT_STICK")
# elif action == &"JOY_BUTTON_MAX":
# print("JOY_BUTTON_MAX")
# elif action == &"JOY_BUTTON_MISC1":
# print("JOY_BUTTON_MISC1")
# elif action == &"JOY_BUTTON_PADDLE1":
# print("JOY_BUTTON_PADDLE1")
# elif action == &"JOY_BUTTON_PADDLE2":
# print("JOY_BUTTON_PADDLE2")
# elif action == &"JOY_BUTTON_PADDLE3":
# print("JOY_BUTTON_PADDLE3")
# elif action == &"JOY_BUTTON_PADDLE4":
# print("JOY_BUTTON_PADDLE4")
# elif action == &"JOY_BUTTON_RIGHT_SHOULDER":
# print("JOY_BUTTON_RIGHT_SHOULDER")
# elif action == &"JOY_BUTTON_RIGHT_STICK":
# print("JOY_BUTTON_RIGHT_STICK")
# elif action == &"JOY_BUTTON_SDL_MAX":
# print("JOY_BUTTON_SDL_MAX")
# elif action == &"JOY_BUTTON_START":
# print("JOY_BUTTON_START")
# elif action == &"JOY_BUTTON_TOUCHPAD":
# print("JOY_BUTTON_TOUCHPAD")
# elif action == &"JOY_BUTTON_X":
# print("JOY_BUTTON_X")
# elif action == &"JOY_BUTTON_Y":
# print("JOY_BUTTON_Y")
# 以上
if is_lever:
var velocity = Input.get_vector(
&"ui_left", # 左の方
&"ui_right", # 右の方
&"ui_up", # 上の方
&"ui_down") # 下の方
$"GuiArtist/CanvasLayer/→値".text = str(velocity.x)
$"GuiArtist/CanvasLayer/↓値".text = str(velocity.y)
「 ゲームパッドと キーボード、両方の操作を プログラムするの めんどくさいぜ。
仮想キーを作らな」
&"VK_Ok"
&"VK_SystemMenu"
&"VK_FastForward"
「 キーボードが Push Any Key じゃなくなったが……」
「 1つ1つ 仮想の Ok ボタン当てはめていくの めんどくさいんで エンターキー使えだぜ」
「 これもUSBが入ってるな。 同じ 8 Bit Do というメーカーのようだぜ、知らんけど」
「 最後に挿したUSB端子のせいで おかしくなったとか 画面右下で言いわけがポップアップされたぜ」
「 2時間 充電してみましょう。
それで動かなかったら 床に叩きつけて 割りましょう」
「 👆 サポートサイトはここにあるが、悪意のあるサイトか、そうでないか分からない。
わたしが人柱になるんで、あとは頼む」
「 PC-Engine風のゲームパッド用のドライバーをダウンロードすると説明書が入っているのでそれを読む」
「 👆 8BitDo のゲームパッドには 上図のような柄のボタンが付いていて、 ホームボタン(Home Button) と呼ぶそうだぜ」
「 ゲームパッドのUSB接続を抜き、ホームボタンを3秒押すと、赤いランプも青いランプも消えた状態になる。
これが 電源オフの状態だぜ」
「 無線ではなく、USBケーブルを使って ゲームパッドとPCを接続する」
「 すると ゲームパッド側は USB フラッシュ・ドライブ になっているらしく、
そのファイル・エクスプローラーが開く」
「 8BitDo_PCE_Gamepad_Fw_V4.02.dat
ファイルを、 USB フラッシュ・ドライブへ
コピー貼り付けする」
「 まだ 青いランプと 黄色いランプが点滅しているから、
そのランプが消えるよう、ホームボタンを 3秒間 押し続ける」
「 あとは 工場から出荷されて自宅に届いたつもりになって 普通にゲームパッドを使えば 使える」
「 だったら 使用前に ドライバーの更新をすることを 必須にしてほしい」
「 8BitDO のメガドライブ風のゲームパッドも、実用的な話を言えば、ドライバーを再インストールする必要がある」
「 何の案内も無いのに 探した者だけが見つけることができるところに 手順だけあるの、海外製品のサポートよね~」
「 👇 とりあえず 自分の持ってる製品に合ったドライバーを入手しろだぜ。ゲームパッドのどこかに型番が刻印されているだろう」
📂 M30_24G_Mini_GamepadV208
「 パターンがいくつかあるようなので、わたしのケースで説明する」
「 ゲームパッドとPCが接続されていない状態にする。USBケーブルを抜くとか」
「 ゲームパッドのど真ん中にあるスタートボタンを、体感で10秒ぐらい長押しする。
すべてのランプが消灯する」
「 L、Rボタンの両方を押しっぱなしにして、スタートボタンを押す。
これで 黄色いランプと、青いランプが点灯し続ける。これは アップグレード・モード と呼ぶそうだぜ」
「 すると ゲームパッド側は USB フラッシュ・ドライブ になっているらしく、
そのファイル・エクスプローラーが開く」
「 CopyFwToUDisk.exe
ファイルをダブルクリックする」
「 Open
ボタンをクリックして、*.dat
ファイルが添付されてるから、それを選ぶ」
「 Update
ボタンをクリックする。黒い画面が出る。それが勝手に閉じられるまで待つ」
「 また、ゲームパッドとPCを接続しているUSBケーブルを抜く」
「 スタートボタンを 3秒間 押し続ける。これでコントローラーの電源がオフになる」
「 あとは 工場から出荷されて自宅に届いたつもりになって 普通にゲームパッドを使えば 使える」
「 だったら 使用前に ドライバーの更新をすることを 必須にしてほしい」
「 👆 次は XBox風のコントローラーだぜ。ぷちぷちにくるまれてただけで、説明書もないぜ。
メーカー名も刻印されてないぜ」
「 USB端子を挿しただけで認識したぜ。もう すぐに使える状態のようだぜ」
「 8BitDo のメガドライブ風のゲームパッドが反応しなくなった。
もう ドライバーの再インストールなんてしないぜ クソだろ このゲームパッド」
「 👆 新品が ぷちぷちに くるまれて送られてくるんだな。こんなんでいいんだな」
「 もっと調べてみろだぜ。他のボタンも反応しないかもしれないぜ?」
「 👇 PCでうまくいかね。BGM消えたり、レバーが入りっぱなしだったり分かんね。もう止めよかな」
「 即売会への時間も そろそろ無くなってきたし ゲームパッドの調査は打切りとする」
.
Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。
また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!
こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?
コメント