PlayStation 2のプログラミング:コントローラーライブラリ-パート2

画像
前回の記事では、EEモード専用のモジュールについて説明しました。 この章では、かなり複雑で理解しにくいが、多くの機会を与えるモジュールについて説明します

このモジュールは、ジョイスティックを1つだけ使用するゲームでの使用をお勧めします。
マルチタップのサポートはありますが、このモジュールについては説明しません。

特別なlibpad2ライブラリがあります。 このライブラリは、Emotion Engineコプロセッサー(EEの略)および入出力プロセッサー(IOP)を使用します。



現時点では、通常のデジタルコントローラーDualShockおよびDualShock 2にのみ使用できます。
EEを接続するためのライブラリ:「libdbc.a」および「libpad2.a」。 ヘッダーファイル:「libdbc.h」および「libpad2.h」。
IOPを接続するためのモジュール:「sio2man.irx」(バージョン2.4以降)、「sio2d.irx」、「dbcman.irx」、コントローラードライバーモジュール(***。Irx)。

IOPは、EEアプリケーションのロード後にsceSifLoadModule()関数を使用してロードされます。
モジュールは仮想ソケットを使用します。

次のモジュールは、コントローラードライバーの接続に使用されます。

モジュール名デジタルコントローラーデュアルショックデュアルショック2
ds1u.irxサポートサポートDualShockエミュレーション
ds2u.irxサポートサポートサポート
dgco.irxサポートデジタルコントローラーエミュレーションデジタルコントローラーエミュレーション
ds1o.irx互換性がないサポートDualShockエミュレーション
ds2o.irx互換性がない互換性がないサポート

特定のコントローラーを接続すると、ドライバーが自動的に切り替わります。

また、ロードされるドライバーの数は、使用されるコントローラーの数と一致する必要があります。

どうやってやるの?



各コントローラーには独自のドライバーがあります。
コントローラ1の場合:ds1u_s1.irx、ds2u_s1.irx、dgco_s1.irx、ds1o_s1.irx、ds2o_s1.irx。
コントローラー2の場合:ds1u_d.irx、ds2u_d.irx、dgco_d.irx、ds1o_d.irx、ds2o_d.irx。
2番目のコントローラーを使用することはお勧めできません。

モジュール手順



sceSifLoadModule()-sio2man.irx、sio2d.irx、dbcman.irxを同じシーケンスでロードするために使用されます。
sceDbcInit()およびscePad2Init()-libdbcおよびlibpad2を初期化するために使用
scePad2CreateSocket()-コントローラーを操作するためのソケットを作成するために使用されます。 最初のパラメーターはポート番号(または最初のコントローラーの場合はNULL)で、2番目はデータが送信される64バイトのプロファイルです。
scePad2ButtonProfile()-ソケットからデータを読み取り、バッファに渡します。 パラメータは、ソケットとバッファです。
scePad2Read()-ボタンデータを読み取ります。 パラメーターは同じです。
scePad2GetState()-コントローラーのステータスを確認します。 パラメーターは同じです。
scePad2DeleteSocket()-ソケットを削除します。 パラメータはソケット番号です。
scePad2End()およびsceDbcEnd()-libpad2およびlibdbcライブラリをそれぞれ終了します。

最も単純なプログラムコードは次のようになります。

<br>main(){<br> int socket_number;<br> unsigned char rdata[32];<br> unsigned char profile[10];<br> u_long128 pad_buff[SCE_PAD2_DMA_BUFFER_MAX]__attribute__((aligned(64)));<br> sceDbcInit();<br> scePad2Init();<br> socket_number = scePad2CreateSocket( NULL, pad_buff );<br> while (1) {<br> scePad2ButtonProfile( socket_number, profile );<br> scePad2Read( socket_number, rdata );<br> // <br> }<br> scePad2DeleteSocket( socket_number );<br> scePad2End();<br> sceDbcEnd();<br>}<br> <br> * This source code was highlighted with Source Code Highlighter .


コントローラープロファイル



プロファイルには、コントローラーの機能、つまり 接続されているコントローラーに関するすべての情報、存在するボタンと番号。

プロファイルの各ビットは、コントローラーの個々の機能を説明しています。 コントローラーに必要な機能がある場合、ビットは1と0に設定されます-サポートがないためです。

プロファイルは、Sonyが将来拡張したかった4バイトの情報です。

バイトビットボタン割り当てられたビット数
00選択してください1
1L3(左スティックをクリック)1
2R3(右スティックをクリック)1
3開始する1
4上矢印1
5右矢印1
6下矢印1
7左矢印1
18L21
9R21
10L11
11R11
12トライアングル1
13サークル1
14X1
15スクエア1
216アナログモード:
Xによって翻訳された右スティック
8
17アナログモード:
Yが翻訳した右スティック
8
18アナログモード:
Xに翻訳された左スティック
8
19アナログモード:
Yに翻訳された左スティック
8
20アナログモード:
右矢印
8
21アナログモード:
左矢印
8
22アナログモード:
上矢印
8
23アナログモード:
下矢印
8
324アナログモード:
トライアングル
8
25アナログモード:
サークル
8
26アナログモード:
十字架
8
27アナログモード:
スクエア
8
28アナログモード:
L1
8
29日アナログモード:
R1
8
30アナログモード:
L2
8
31アナログモード:
R2
8

アナログモードは感度を意味します。

デジタルコントローラーの場合、すべてのアナログ、R3およびL3はゼロになります。 したがって、彼のプロファイルは次のようになります。
バイトビットボタン割り当てられたビット数
00選択してください1
1開始する1
2上矢印1
3右矢印1
4下矢印1
5左矢印1
6L21
7R21
18L11
9R11
10トライアングル1
11サークル1
12X1
13スクエア1
14-ボイド-1
15-ボイド-1


事例



ユーザーがデジタルコントローラーをオフにし、アナログコントローラーを接続することがあります。
ドライバは自動的に切り替わります。 また、データを正しく処理できない場合があります。
コントローラーが無効になっている場合、scePad2GetState()関数はscePad2StateNoLinkを返します。 その後、コントローラーが再び接続されると、scePad2GetState()関数はscePad2StateStableを返します。 各フレームの前にscePad2GetState()関数を呼び出して、シャットダウンを確認することをお勧めします。

最後に。



コントローラボタンに関するこのタイプの情報は、両方のモードに適しています。
コントローラーを常に監視する必要があります。

これについては、振動ライブラリーのみがコントローラーについて残っていましたが、後で説明します。 最後に。

PS :今日はそれで十分だと思う。

Source: https://habr.com/ru/post/J135737/


All Articles