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

はじめに
皆さんこんにちは。y_masuyamaと申します。
最近、Reactを学び始めたばかりですが、何かアプリを作ってみたいという思いが強くなってきました。そこで、昔懐かし電撃イライラ棒系びっくりFlashゲームを再現してみました。
- 📱スマホでは遊べません(💻PCでお楽しみください)
- 🖥️ブラウザ全画面表示でのみ遊べます(推奨サイズ1920×1080, Canvas固定1280×720)
- 🎵音や驚き要素が含まれているのでご注意ください
- 📚筆者環境(Mac + Chrome)でのみ動作確認をしています
作成したもの
- ソースコード(StackBlitzで公開)
https://stackblitz.com/edit/maze-app-gf5ict?file=README.md
ゲーム内容
全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