2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

完走賞ゲットのため小ネタを毎日投稿しようとチャレンジするAdvent Calendar 2022

Day 11

【完走賞ゲット-11】gamecontroller.js を p5.js Web Editor上で使ってみる(DualShock 4 との組み合わせ)

Last updated at Posted at 2022-12-11

はじめに

こちらは、完走賞ゲットのため小ネタを毎日投稿しようとチャレンジする Advent Calendar 2022 の 11日目の記事です。

完走賞ゲットのため小ネタを毎日投稿しようとチャレンジする Advent Calendar 202210日目の記事でも扱っていた「gamecontroller.js」の話です。

●【完走賞ゲット-10】gamecontroller.js を使って DualShock 4 を JavaScript で扱う - Qiita
 https://qiita.com/youtoy/items/87c1c37b51ae9ef4ab4d

この記事では、p5.js との組み合わせを試します。

gamecontroller.js について

gamecontroller.js については、完走賞ゲットのため小ネタを毎日投稿しようとチャレンジする Advent Calendar 2022 の 10日目の記事をご覧ください。

gamecontroller.js を p5.js Web Editor上で動かす

DualShock 4 を PC につなぐ

今回利用する DualShock 4 を PC に接続します(今回は USB接続にて)。

簡単なお試し

まずは、gamecontroller.js が p5.js Web Editor上で動くことを確認します。

↓こんな感じのお試しをしてみて、コンソールに想定通りの出力が得られるのを確認できました。

HTML と JavaScript の内容は、それぞれ以下の通りです。

index.html
<!DOCTYPE html>
<html lang="en">
  <head>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.5.0/p5.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/gamecontroller.js@1.5.0/dist/gamecontroller.min.js"></script>
    <link rel="stylesheet" type="text/css" href="style.css">
    <meta charset="utf-8" />
  </head>
  <body>
    <main>
    </main>
    <script src="sketch.js"></script>
  </body>
</html>
sketch.js
function setup() {
  createCanvas(400, 400);
  
  gameControl.on('connect', gamepad => {
  console.log('A new gamepad was connected!');
});
}

function draw() {
  background(220);
}

ゲームコントローラーの操作を受けとる:ボタン押下

ゲームコントローラーとの接続が行えることは確認できたので、次はボタンを操作した時のイベントを発生させてみます。やってみたらできた、というのが以下のツイートです。

公式のページの情報をもとに、以下のような簡単なプログラムを作って試しました。

sketch.js
function setup() {
  createCanvas(400, 400);

  gameControl.on("connect", (gamepad) => {
    console.log("A new gamepad was connected!");

    gamepad
      .on("button0", () => {
        console.log("Button 0 still pressed...");
      })
      .before("button0", () => {
        console.log("Button 0 pressed...");
      })
      .after("button0", () => {
        console.log("Button 0 was released");
      });
  });
}

function draw() {
  background(220);
}

ゲームコントローラーの操作を受けとる:ジョイスティックの操作1(1方向のみ使う)

次に、DualShock 4 の左側にあるジョイスティックの操作を取得してみます。
以下のプログラムで、ジョイスティックを上方向に倒した時の操作を取得できました。

sketch.js
function setup() {
  createCanvas(400, 400);

  gameControl.on("connect", (gamepad) => {
    console.log("A new gamepad was connected!");

    gamepad
      .on("up0", () => {
        console.log("Button 0 still pressed...");
      })
      .before("up0", () => {
        console.log("Button 0 pressed...");
      })
      .after("up0", () => {
        console.log("Button 0 was released");
      });
  });
}

function draw() {
  background(220);
}

ここまで試した内容を見ると、ボタン押下やスティックを倒したというイベントは、以下の 3状態のイベントがとれるようです。

  • 操作をしている状態(操作をし続けている間は、連続してイベントが発生)
  • 操作が行われた最初のタイミング
  • 操作を終えたタイミング

ジョイスティックの操作からとれる情報について

ここで、ジョイスティックの操作からとれる情報について、少し補足します。
以下の Gamepad API関連の処理がテストできるサイトを使うと、ジョイスティックは倒したかどうかの二値だけでなく、どれくらいの傾きで倒したかというのもとれそうでした。

また、ジョイスティック関連の話ではない余談ですが、コントローラーを振動させるという動作も Gamepad API を使って行えるようでした。

ゲームコントローラーの操作を受けとる + p5.js のキャンバス上で何か描画する

最後に、DualShock 4 の操作が行われた時に、p5.js での描画を何らか行うようにしてみます。
とりあえず、「背景の色を変える」・「図形を描画する」というのをやってみようと思います。

プログラムは以下の通りです。

sketch.js
let bgColor = "#aaaaaa";

function setup() {
  createCanvas(500, 400);
  background(bgColor);

  gameControl.on("connect", (gamepad) => {
    console.log("A new gamepad was connected!");

    gamepad
      .on("button12", () => {
        console.log("Button 12 still pressed...");
        background("#0077ff");
      })
      .before("button12", () => {
        console.log("Button 12 pressed...");
      })
      .after("button12", () => {
        console.log("Button 12 was released");
        background(bgColor);
      });

    gamepad
      .on("button14", () => {
        console.log("Button 12 still pressed...");
        circle(width / 2, height / 2, 100);
      })
      .before("button14", () => {
        console.log("Button 14 pressed...");
      })
      .after("button14", () => {
        console.log("Button 14 was released");
        background(bgColor);
      });
  });
}

function draw() {}

なお、上記のプログラムを実行すると、このようになりました。

おわりに

完走賞ゲットのため小ネタを毎日投稿しようとチャレンジする Advent Calendar 2022 の10日目の記事で軽く試してみた gamecontroller.js を、今回は p5.js Web Editor上で扱うことができました。

2
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?