ブログ

Blog

昔懐かし電撃イライラ棒系びっくりFlashゲームをReactで作る

昔懐かし電撃イライラ棒系びっくりFlashゲームをReactで作る

はじめに

皆さんこんにちは。y_masuyamaと申します。

最近、Reactを学び始めたばかりですが、何かアプリを作ってみたいという思いが強くなってきました。そこで、昔懐かし電撃イライラ棒系びっくりFlashゲームを再現してみました。

  • 📱スマホでは遊べません(💻PCでお楽しみください)
  • 🖥️ブラウザ全画面表示でのみ遊べます(推奨サイズ1920×1080, Canvas固定1280×720)
  • 🎵音や驚き要素が含まれているのでご注意ください
  • 📚筆者環境(Mac + Chrome)でのみ動作確認をしています

作成したもの

ゲーム内容

全3面の「電撃イライラ棒」系ゲームです。3面それぞれ細い迷路をクリアすると驚きの画像と音が表示されます。

使用技術

使用技術 説明
StackBlitz Reactの動作環境として使用(Viteベース)
HTML, CSS canvasタグで迷路を実装
React UIライブラリ
TypeScript JavaScriptのスーパーセット言語
howler.js 音声出力ライブラリ

*バージョンは package.json を参照

コードの解説

ここでは主要部分のみ解説します。詳細はソースコードをご覧ください。

ゲーム画面の遷移

ReactのuseStateフックで実装。

state


const [scene, setScene] = useState('title');

stateのset関数


const gameStart = () => setScene('game');
const gameOver  = () => setScene('title');
const viewEnding = () => setScene('ending');

タイトル画面

PlayボタンでgameStartを呼び出します。


export const Title = ({ handleClick }: Props) => (
  
);

迷路ゲーム画面

以下のコンポーネント構成:

  • Mazeコンポーネント(レベル切り替え)
  • Level1, Level2, Level3コンポーネント(各ステージ)

迷路の切り替え

同様にuseStateで実装。


const [level, setLevel] = useState(1);

迷路の描画

canvas要素をuseRefで取得し、useEffect内で描画。

Canvas取得


const canvasRef = useRef(null);

useEffect(() => {
  const ctx = canvasRef.current?.getContext('2d');
  if (!ctx) return;
  // 描画処理...
}, []);

矩形描画(迷路・背景・ゴール)


// 背景
ctx.fillStyle = 'black';
ctx.fillRect(0, 0, width, height);

// 迷路
ctx.fillStyle = 'aqua';
ctx.fillRect(x, y, w, h);

// ゴール
ctx.fillStyle = 'red';
ctx.fillRect(x, y, w, h);

文字描画


ctx.font = 'bold 24px verdana, sans-serif';
ctx.fillStyle = 'white';
ctx.fillText('Level1', 1050, 130);

ゲームオーバー・クリア判定

マウスポインタ位置をpointermoveで取得し、getImageDataで色を調べます。

マウスポインタ取得


 {
  const x = e.nativeEvent.offsetX;
  const y = e.nativeEvent.offsetY;
  // 色取得...
}} />

pointermoveは高頻度イベントのため、重い処理はスロットリング等で制御を。

色取得・判定


const [r,g,b] = ctx.getImageData(x, y, 1, 1).data;
if (r===0 && g===0 && b===0) gameOver();
if (r===255 && g===0 && b===0) goNextLevel();

見えないゴール(最終面)

Canvas上に重ねた透明な

要素でonMouseEnterを利用。

</> </code>

エンディング画面

howler.jsで音声再生。


const sound = new Howl({ src:['./sound.wav'] });
sound.play();
Howler.volume(1);

終わりに

Reactとcanvasで昔懐かしのFlashゲームを再現しました。基本を学ぶのに良いアプリです。ありがとうございました!

おまけ:作成したゲームの元ネタ

元ネタ動画(驚き要素あり):
https://youtu.be/uBIIVz_xp8I?si=dGirpjBgIc4wRZyl

体験男性の動画:
https://www.nicovideo.jp/watch/sm14261501

株式会社BTMではエンジニアの採用をしております。ご興味がある方はぜひコチラをご覧ください。

  • SNS
  • 投稿日
  • カテゴリー

    BTM Useful