46
10

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 5

GitHubが落ちたら仕事にならん→そのときだけ遊べるゲームを作りました!

Last updated at Posted at 2022-12-04

クソアプリアドベントカレンダー2022 5日目担当の@nabettuです!

今日は表題の通り「GitHubが落ちときだけ遊べるゲームを作ってきました!」

みなさんこの崖から落ちていく悲しきOctoCatをみたことはありますか?
CleanShot 2022-12-03 at 19.28.54@2x.png

この画面が出たらエンジニアはもう仕事になりませんよね。。。

ということでそんなときのために!GitHubが500画面になると自動的にゲームが挿入されるChrome拡張を作ってきました。プレイ画面はこんな感じです。

崖の下で襲ってくるバグから逃げつづけるOctoCatをイメージしたゲームになります。
CleanShot 2022-12-03 at 19.28.26.gif

このChrome拡張さえいれておけば、いつGitHubが落ちても安心ですね!

利用方法

一応GoogleWebストアの審査には出しましたが、多分審査で落ちてしまうのでw、こちらからダウンロードしていただいて、
「Chrome設定画面→拡張機能→右上のデベロッパーモードをON→パッケージ化されていない拡張機能を読み込む」から、Zipを指定してインストールしてください。

そして遊ぶためにはGitHubに落ちてもらわなきゃならないのですが、実は500画面は /500 にアクセスすると500画面が表示できるので、ぜひこちらで遊んでみてください。

※こちらの画面で動くように作ってありますので、もしかしたら怒ったピンクのユニコーンの画面だと動かないかもしれませんw

作り方

ブラウザで動くゲームとして、今回はアドベントカレンダー1日目のDE-TEIUさんの構成を参考にさせていただきました。

こちらのゲームもPhaser(フェイザー)を使って作ってみました。

さて、ゲーム単体で動くページであればこちらの記事にそって作っていただくだけでよいのですが、

これを

  1. 既存の画面に差し込む形で
  2. ChromeExtensionにゲームを入れて動くようにする

方法をそれぞれ解説していきます。

既存の画面にゲームを差し込む

今回のChromeExtionsionは動作する画面はマニフェストファイルに記述することで、github.comのみとしています。
そして500画面にあるerror_500というIDのdomがあったら動作するようにしています。

そのうえでPhaserのConfigでも同じdomを指定してそのdom内にゲームを配置しつつ、画面の真ん中に置かれるようにcssを追記しています。

const errorDom = document.querySelector("#error_500");
if (errorDom) {
  errorDom.setAttribute(
    "style",
    "position: fixed;top: 0;left: 50%;transform: translateX(-50%);z-index: 100;"
  );
  startGame();
}
const config: Phaser.Types.Core.GameConfig = {
  parent: "error_500",
...省略
};
export const startGame = path => {
  new Phaser.Game(config);
};

ChromeExtensionにゲームを入れて動くようにする

上記のように設定したうえで、ビルドしたjsをconsoleで実行するとそのまま動くのですが、一点問題があります。Webサイトと違ってjsと一緒に配置されていないため画像の読込ができなくなってしまいます。

そこで、マニフェストファイルに web_accessible_resources で画像を追加しつつ、

こちらの記事を参考にしてファイルパスを取得→ゲームの実行時に拡張機能内の画像パスを読み込んでゲーム内に展開する。という方法で実現しました。

//ゲーム読込前のパス取得
const imagePath = {
    octocat: chrome.runtime.getURL("images/octocat.png"),
    bug: chrome.runtime.getURL("images/bug.png"),
    bg: chrome.runtime.getURL("images/bg.png"),
  };

//ゲーム内での読込
this.load.image("octocat", imagePath.octocat);

以上がChromeExtionsionで動くゲームを既存のサイトに挿入する方法でした!

ソースコードはこちら

明日は@Gonsunaさんよろしくお願いします!

46
10
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
46
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?