4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

圧倒的なスピード感。加速がブーストする宇宙体感ゲーム。スペースキーを押すとさらに加速。

Posted at

スクリーンショット 2024-10-25 212459.png

スクリーンショット 2024-10-25 212553.png

コードをメモ帳などのテキストエディタに貼り付け、ファイル名を「index.html」として保存します。その後、保存したファイルをブラウザで開けば、コードが実行されます。

宇宙空間での加速体験ゲームです。

圧倒的なスピード感。加速がブーストする宇宙体感ゲームです。(スペースキーを押すとさらに3秒間加速します。)

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>宇宙空間での加速体験</title>
    <style>
        /* ページ全体のスタイル設定 */
        body {
            margin: 0;
            overflow: hidden; /* スクロールバーを非表示 */
            background: black; /* 背景を黒に設定 */
            display: flex;
            flex-direction: column;
            align-items: center; /* 中央揃え */
        }
        #canvas {
            display: block;
        }
        /* スライダーのスタイル設定 */
        #boosterSliderContainer {
            position: absolute;
            bottom: 20px;
            width: 300px;
            text-align: center;
            color: white; /* テキストの色を白に設定 */
        }
        #boosterSlider {
            width: 100%; /* スライダーの幅をコンテナに合わせる */
        }
    </style>
</head>
<body>
    <!-- ゲーム描画用のキャンバス -->
    <canvas id="canvas"></canvas>

    <!-- ブースタースライダーのコンテナ -->
    <div id="boosterSliderContainer">
        <label for="boosterSlider">Booster Speed</label>
        <input id="boosterSlider" type="range" min="-5" max="500" value="0" step="0.1">
    </div>

    <script>
        // キャンバスとコンテキストの取得
        const canvas = document.getElementById('canvas');
        const ctx = canvas.getContext('2d');
        canvas.width = window.innerWidth; // キャンバスの幅をウィンドウ幅に設定
        canvas.height = window.innerHeight; // キャンバスの高さをウィンドウ高さに設定

        const particles = []; // パーティクル(星)を格納する配列
        let speed = 0; // 加速度の初期値
        let boostActive = false; // ブースト状態のフラグ

        // スライダーの値が変化したときの処理
        document.getElementById('boosterSlider').addEventListener('input', function() {
            speed = parseFloat(this.value); // スライダーの値を速度に反映
        });

        // 新しいパーティクル(星)を生成する関数
        function createParticle() {
            return {
                x: (Math.random() - 0.5) * canvas.width, // キャンバス中央を基準にランダムなx座標
                y: (Math.random() - 0.5) * canvas.height, // キャンバス中央を基準にランダムなy座標
                z: Math.random() * canvas.width, // パーティクルのz位置をランダムに設定
                size: Math.random() * 2 + 1, // パーティクルのサイズ
                color: `hsl(${Math.random() * 360}, 100%, 50%)` // ランダムな色を設定
            };
        }

        // 初期パーティクルを1000個生成
        for (let i = 0; i < 1000; i++) {
            particles.push(createParticle());
        }

        // パーティクルの位置を更新する関数
        function updateParticles() {
            particles.forEach(particle => {
                particle.z -= speed + (boostActive ? 10 : 0); // ブースト時は速度を加算
                if (particle.z < 1) { // パーティクルが手前に来た場合
                    particle.z = canvas.width; // パーティクルを奥に戻す
                    particle.x = (Math.random() - 0.5) * canvas.width; // ランダムなx座標に再設定
                    particle.y = (Math.random() - 0.5) * canvas.height; // ランダムなy座標に再設定
                }
            });
        }

        // パーティクルを描画する関数
        function renderParticles() {
            ctx.clearRect(0, 0, canvas.width, canvas.height); // 前フレームをクリア
            particles.forEach(particle => {
                const perspective = canvas.width / (canvas.width + particle.z); // 遠近効果を計算
                const x = (particle.x * perspective) + canvas.width / 2; // 中央を基準にx座標を設定
                const y = (particle.y * perspective) + canvas.height / 2; // 中央を基準にy座標を設定
                const size = particle.size * perspective; // パーティクルのサイズを遠近に応じて縮小

                ctx.beginPath();
                ctx.arc(x, y, size, 0, Math.PI * 2); // パーティクルを円で描画
                ctx.fillStyle = particle.color; // パーティクルの色を設定
                ctx.fill();
            });
        }

        // メインループ関数
        function gameLoop() {
            updateParticles(); // パーティクルの位置を更新
            renderParticles(); // パーティクルを描画
            requestAnimationFrame(gameLoop); // 次のフレームをリクエスト
        }

        // キーが押されたときの処理
        document.addEventListener('keydown', event => {
            if (event.code === 'Space' && !boostActive) { // スペースキーが押されたら
                boostActive = true; // ブーストを有効化
                setTimeout(() => {
                    boostActive = false; // 3秒後にブーストを解除
                }, 3000);
            }
        });

        gameLoop(); // ゲームループを開始
    </script>
</body>
</html>

4
5
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
4
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?