見出し画像

JavaScriptで簡単なルーレットを作る方法

はじめに

今回は、JavaScriptを使ってウェブブラウザ上で動作するシンプルなルーレットを作成する方法をご紹介します。ルーレットはゲームや抽選などでよく使われる要素ですが、基本的なHTMLとJavaScriptを使うことで、簡単に作成することができます。

準備

ルーレットを作成するためには、まずHTML、CSS、JavaScriptを使います。Canvasを使って円形のルーレットを描き、ボタンをクリックするとルーレットが回転してランダムな結果を表示するシステムを構築します。

HTML部分の構成

HTMLでは、以下の要素を配置しています。

• ルーレット表示用の<canvas>タグ
• スピンボタン
• 結果表示用の<p>タグ

また、スタイルとしてルーレットの円形やスピンボタンのデザインを簡単に設定しています。

JavaScriptの動作

JavaScriptは以下のような機能を提供しています。

1. ルーレットの描画
Canvasを使用して、ルーレットのセクターごとに異なる色とテキストを描画します。
2. スピンのアニメーション
スピンボタンをクリックすると、ランダムな回転が発生し、数秒後にルーレットが止まります。結果はランダムで、どのセクターに止まるかが決定されます。
3. 結果の表示
スピンが終わると、どのセクターに止まったかが画面に表示されます。

実装のポイント

1. ランダムな回転
Math.random()を使ってランダムな角度を生成し、ルーレットが回転するようにしています。
2. アニメーション
requestAnimationFrame()を使い、スムーズな回転アニメーションを実現しています。

おわりに

今回紹介したコードは、シンプルなルーレットの基本的な仕組みです。これをベースに、セクターの数やデザイン、機能を追加して、より高度なルーレットを作ることも可能です。例えば、抽選システムやゲーム内のガチャ機能などに応用することができます。

ぜひ、JavaScriptのルーレットを活用して、自分だけのカスタムルーレットを作ってみてください!

以下がサンプルコードです!コピーして使ってカスタマイズしてみてはいかがでしょうか?

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JavaScriptでルーレットを作る方法</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            text-align: center;
        }
        #roulette {
            margin: 50px auto;
            position: relative;
        }
        #pointer {
            width: 0;
            height: 0;
            border-left: 20px solid transparent;
            border-right: 20px solid transparent;
            border-top: 40px solid red; /* 矢印を下向きに変更 */
            position: absolute;
            top: -40px; /* キャンバスの上に表示 */
            left: calc(50% - 20px); /* 中央に配置 */
        }
        #spin {
            margin-top: 20px;
            padding: 10px 20px;
            background-color: #28a745;
            color: white;
            border: none;
            font-size: 16px;
            cursor: pointer;
        }
    </style>
</head>
<body>

    <h1>JavaScriptでルーレットを作る方法</h1>

    <div id="roulette">
        <div id="pointer"></div>
        <canvas id="canvas"></canvas>
    </div>

    <button id="spin">スピンする</button>

    <p id="result"></p>

    <script>
        const canvas = document.getElementById('canvas');
        const ctx = canvas.getContext('2d');
        const pointer = document.getElementById('pointer');
        const sectors = ["赤", "青", "緑", "黄色", "ピンク", "紫"];
        const colors = ["#FF0000", "#0000FF", "#00FF00", "#FFFF00", "#FFC0CB", "#800080"];
        let angle = 0;
        let canvasSize = Math.min(window.innerWidth, window.innerHeight) * 0.8; // キャンバスのサイズを端末に合わせる
        canvas.width = canvasSize;
        canvas.height = canvasSize;
        const sectorAngle = 2 * Math.PI / sectors.length;

        // キャンバスサイズに合わせてポインタの位置を調整
        pointer.style.top = `${-canvasSize * 0.1}px`; // キャンバスの上に表示
        pointer.style.left = `calc(50% - ${canvasSize * 0.05}px)`; // 中央に配置

        // ルーレットを描画
        function drawRoulette() {
            ctx.clearRect(0, 0, canvas.width, canvas.height); // 前の描画をクリア
            ctx.save(); // 現在の状態を保存
            ctx.translate(canvasSize / 2, canvasSize / 2); // キャンバスの中心に移動
            ctx.rotate(angle); // キャンバス全体を回転

            sectors.forEach((sector, index) => {
                ctx.beginPath();
                ctx.moveTo(0, 0);
                ctx.arc(0, 0, canvasSize / 2, index * sectorAngle, (index + 1) * sectorAngle);
                ctx.fillStyle = colors[index];
                ctx.fill();
                ctx.closePath();

                // テキストを描く
                ctx.save();
                ctx.rotate((index + 0.5) * sectorAngle);
                ctx.textAlign = "right";
                ctx.font = `${canvasSize * 0.05}px Arial`; // サイズに応じてフォントサイズ変更
                ctx.fillStyle = "#FFFFFF";
                ctx.fillText(sector, canvasSize * 0.45, 0); // テキストをキャンバスサイズに合わせて配置
                ctx.restore();
            });

            ctx.restore(); // 状態を元に戻す
        }

        // スピンのアニメーション
        function spinRoulette() {
            const spinButton = document.getElementById('spin');
            spinButton.disabled = true;
            const targetAngle = Math.random() * 2 * Math.PI + 10 * Math.PI; // ランダムな回転
            const spinDuration = 3000; // 3秒でスピン
            const startTime = performance.now();

            function animate(time) {
                const elapsed = time - startTime;
                if (elapsed < spinDuration) {
                    angle = (targetAngle * (elapsed / spinDuration)) % (2 * Math.PI);
                    drawRoulette();
                    requestAnimationFrame(animate);
                } else {
                    angle = targetAngle % (2 * Math.PI);

                    // ルーレットの停止位置に基づいて結果を計算
                    const correctedAngle = (angle + Math.PI / 2) % (2 * Math.PI); // 矢印は上にあるため、90度補正
                    const sectorIndex = Math.floor(correctedAngle / sectorAngle) % sectors.length;
                    document.getElementById('result').textContent = `結果: ${sectors[sectors.length - 1 - sectorIndex]}`;
                    spinButton.disabled = false;
                }
            }

            requestAnimationFrame(animate);
        }

        // 画面サイズ変更時にキャンバスのサイズを再調整
        window.addEventListener('resize', () => {
            canvasSize = Math.min(window.innerWidth, window.innerHeight) * 0.8;
            canvas.width = canvasSize;
            canvas.height = canvasSize;
            pointer.style.top = `${-canvasSize * 0.1}px`; // キャンバスの上に表示
            pointer.style.left = `calc(50% - ${canvasSize * 0.05}px)`; // 中央に配置
            drawRoulette(); // 再描画
        });

        document.getElementById('spin').addEventListener('click', spinRoulette);

        drawRoulette();
    </script>

</body>
</html>

いいなと思ったら応援しよう!