ユーザ用ツール

サイト用ツール


実験場

文書の過去の版を表示しています。


<!DOCTYPE html> <html lang=“ja”>

<head>

  <meta charset="UTF-8">
  <title>ノベルゲーム形式デモ</title>
  <style>
      body,
      html {
          margin: 0;
          padding: 0;
          height: 100%;
          overflow: hidden;
      }
      .game-container {
          height: 100%;
          background-color: #000;
          position: relative;
          background-size: cover;
          background-position: center center;
          /* 中央に配置 */
          background-repeat: no-repeat;
          /* 画像の繰り返し無し */
      }
      .dialogue-box {
          position: absolute;
          bottom: 0;
          width: 100%;
          background: rgba(0, 0, 0, 0.8);
          padding: 20px;
          box-sizing: border-box;
          color: white;
          font-family: Arial, sans-serif;
          font-size: 2em;
      }
      #displayText {
          white-space: pre-wrap;
          overflow: hidden;
          min-height: 80px;
      }
      #commandPanel {
          display: none;
          position: absolute;
          right: 20px;
          top: 20px;
          background-color: #444;
          padding: 10px;
          box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);
          display: flex;
          flex-direction: column;
      }
      /* position: absolute を削除し、パネル内のボタンのスタイルを調整 */
      #backButton,
      #autoModeButton,
      #increaseFontSizeButton,
      #decreaseFontSizeButton,
      #resetButton,
      #closePanelButton {
          padding: 5px 10px;
          font-size: 0.7em;
          color: white;
          background-color: #444;
          border: none;
          cursor: pointer;
          margin: 2px 0;
          /* ボタン間の間隔 */
      }
      #increaseFontSizeButton,
      #decreaseFontSizeButton {
          font-size: 1em;
          /* フォントサイズの調整が必要な場合はここで設定 */
      }
      #commandButton {
          position: absolute;
          right: 20px;
          top: 20px;
          padding: 10px 20px;
          font-size: 0.7em;
          color: white;
          background-color: #444;
          border: none;
          cursor: pointer;
      }
  </style>

</head>

<body>

  <div class="game-container" id="gameContainer">
      <div class="dialogue-box" id="dialogueBox">
          <span id="displayText"></span>
      </div>
      <!-- コマンドボタン -->
      <button id="commandButton">≡</button>
      <!-- コマンドパネル -->
      <div id="commandPanel" style="display:none;">
          <button id="resetButton">最初から</button>
          <button id="increaseFontSizeButton">+</button>
          <button id="decreaseFontSizeButton">ー</button>
          <button id="autoModeButton">自動</button>
          <button id="backButton">戻る</button>
          <button id="closePanelButton">閉じる</button>
      </div>
  </div>
  <script>
      (function () {
          var scenes = [
              // シナリオテキストをここに挿入
              "&bgimage https://mooncat-cabin.net/wp-content/uploads/2023/12/elfadv1.jpg",
              "&bgimagemovey 0",
              "1こんにちは1あをによし奈良の都は咲く花の薫ふがごとく今盛りなり。ひさかたの光のどけき春の日に静心なく花の散るらむ。あをによし奈良の都は咲く花の薫ふがごとく今盛りなり。ひさかたの光のどけき春の日に静心なく花の散るらむ。",
              "&bgimagemovey 0",
              "&bgimage https://mooncat-cabin.net/wp-content/uploads/2023/12/elfadv2.jpg",
              "2こんにちは2あをによし奈良の都は咲く花の薫ふがごとく今盛りなり。ひさかたの光のどけき春の日に静心なく花の散るらむ。あをによし奈良の都は咲く花の薫ふがごとく今盛りなり。ひさかたの光のどけき春の日に静心なく花の散るらむ。",
              "&bgimage https://mooncat-cabin.net/wp-content/uploads/2023/12/elfadv3.jpg",
              "こんにちは3あをによし奈良の都は咲く花の薫ふがごとく今盛りなり。ひさかたの光のどけき春の日に静心なく花の散るらむ。あをによし奈良の都は咲く花の薫ふがごとく今盛りなり。ひさかたの光のどけき春の日に静心なく花の散るらむ。",
              "&bgimage https://mooncat-cabin.net/wp-content/uploads/2023/12/elfadv4.jpg",
              "こんにちは4あをによし奈良の都は咲く花の薫ふがごとく今盛りなり。ひさかたの光のどけき春の日に静心なく花の散るらむ。あをによし奈良の都は咲く花の薫ふがごとく今盛りなり。ひさかたの光のどけき春の日に静心なく花の散るらむ。",
              "テスト終了"
          ];
          var currentScene = 0;
          var typingSpeed = 50;
          var displayText = document.getElementById('displayText');
          var gameContainer = document.getElementById('gameContainer');
          var timeoutId;
          var backButton = document.getElementById('backButton');
          var yOffset = 0; // 背景画像のY軸オフセットの初期値を0に設定
          function updateBackgroundImage(imageName) {
              gameContainer.style.backgroundImage = "url('" + imageName + "')";
              // 背景画像の位置を更新
              gameContainer.style.backgroundPosition = "center " + yOffset + "px";
          }
          function updateScene(text, isBackward) {
              if (text.startsWith("&bgimage ")) {
                  // &bgimage コマンド処理
                  var imageName = text.split(" ")[1];
                  updateBackgroundImage(imageName);
                  if (isBackward) prevScene();
                  else nextScene();
              } else if (text.startsWith("&bgimagemovey ")) {
                  // &bgimagemovey コマンド処理
                  var value = parseInt(text.split(" ")[1], 10);
                  if (!isNaN(value)) { // 値が数値であることを確認
                      yOffset = value;
                      gameContainer.style.backgroundPosition = "center " + yOffset + "px";
                  }
                  if (isBackward) prevScene();
                  else nextScene();
              } else {
                  // テキスト表示
                  displayText.innerHTML = "";
                  typeWriter(text);
              }
          }
          function typeWriter(text) {
              var index = 0;
              function addCharacter() {
                  if (index < text.length) {
                      displayText.innerHTML += text.charAt(index);
                      index++;
                      clearTimeout(timeoutId);
                      timeoutId = setTimeout(addCharacter, typingSpeed);
                  }
              }
              addCharacter();
          }
          function nextScene() {
              currentScene++;
              if (currentScene < scenes.length) {
                  updateScene(scenes[currentScene]);
              }
          }
          function prevScene() {
              // 最初のシーンでは戻れない
              if (currentScene > 0) {
                  clearTimeout(timeoutId); // 現在のタイピングアニメーションをキャンセル
                  currentScene--;
                  updateScene(scenes[currentScene], true);
              }
          }
          document.addEventListener('click', function () {
              clearTimeout(timeoutId); // 現在進行中のタイピングアニメーションをキャンセル
              if (displayText.innerHTML !== scenes[currentScene] && !scenes[currentScene].startsWith("&")) {
                  // タイピング中にクリックされた場合、全文を表示
                  displayText.innerHTML = scenes[currentScene];
              } else {
                  nextScene();
              }
          });
          backButton.addEventListener('click', function (event) {
              event.stopPropagation(); // 親要素へのイベント伝播を停止
              prevScene();
          });
          var yOffset = 0; // 背景画像のY軸オフセットの初期値
          function updateBackgroundImage(imageName) {
              gameContainer.style.backgroundImage = "url('images/" + imageName + "')";
              // 背景画像の位置を更新
              gameContainer.style.backgroundPosition = "center " + yOffset + "px";
          }
          var autoMode = false; // オートモードの状態
          var autoModeIntervalId = null; // オートモードのインターバルID
          function toggleAutoMode() {
              autoMode = !autoMode;
              autoModeButton.textContent = autoMode ? "停止" : "自動";
              if (autoMode) {
                  clearTimeout(timeoutId); // 現在進行中のアニメーションをキャンセル
                  autoModeNextScene();
              } else {
                  clearTimeout(autoModeIntervalId);
              }
          }
          function autoModeNextScene() {
              if (!autoMode) return; // オートモードが停止していたら終了
              nextScene(); // 次のシーンへ進む
              var delay = 4000; // デフォルトの遅延時間
              // 現在のシーンがテキストの場合、その長さに基づいて遅延時間を調整
              if (!scenes[currentScene].startsWith("&")) {
                  delay += scenes[currentScene].length * typingSpeed;
              }
              autoModeIntervalId = setTimeout(autoModeNextScene, delay);
          }
          document.getElementById('autoModeButton').addEventListener('click', function (event) {
              event.stopPropagation(); // イベント伝播を停止
              toggleAutoMode();
          });
          // 既存の nextScene 関数内...
          function nextScene() {
              currentScene++;
              if (currentScene < scenes.length) {
                  updateScene(scenes[currentScene]);
                  if (autoMode) {
                      clearTimeout(autoModeIntervalId); // 次のシーンへ進む前に前のタイマーをクリア
                      autoModeIntervalId = setTimeout(autoModeNextScene, 3000 + scenes[currentScene].length * typingSpeed); // メッセージ表示時間を考慮
                  }
              } else if (autoMode) {
                  toggleAutoMode(); // シナリオの最後に達したらオートモードを停止
              }
          }
          var dialogueBox = document.getElementById('dialogueBox');
          var fontSize = 1.2; // 初期フォントサイズ(em)
          function updateFontSize() {
              dialogueBox.style.fontSize = fontSize + 'em';
          }
          document.getElementById('increaseFontSizeButton').addEventListener('click', function (event) {
              event.stopPropagation(); // イベント伝播を停止
              fontSize += 0.5;
              updateFontSize();
          });
          document.getElementById('decreaseFontSizeButton').addEventListener('click', function (event) {
              event.stopPropagation(); // イベント伝播を停止
              fontSize = Math.max(fontSize - 0.5, 0.5); // フォントサイズが0.5em未満にならないようにする
              updateFontSize();
          });
          document.addEventListener('DOMContentLoaded', function () {
              var commandButton = document.getElementById('commandButton');
              var commandPanel = document.getElementById('commandPanel');
              var closePanelButton = document.getElementById('closePanelButton');
              var resetButton = document.getElementById('resetButton');
              // コマンドボタンをクリックした時のイベント
              commandButton.addEventListener('click', function () {
                  event.stopPropagation(); // イベント伝播を停止
                  commandPanel.style.display = 'block'; // パネルを表示
                  commandButton.style.display = 'none'; // コマンドボタンを非表示
              });
              // 閉じるボタンをクリックした時のイベント
              closePanelButton.addEventListener('click', function () {
                  event.stopPropagation(); // イベント伝播を停止
                  commandPanel.style.display = 'none'; // パネルを非表示
                  commandButton.style.display = 'block'; // コマンドボタンを表示
              });
              // ページをリロードする
              resetButton.addEventListener('click', function () {
                  window.location.reload();
              });
              // 既存のボタンイベント(戻る、オートモード、フォントサイズ変更)はそのまま
          });
          // 初期シーンをロード
          updateScene(scenes[currentScene]);
      })();
  </script>

</body>

</html>

実験場.1710104090.txt.gz · 最終更新: 2024/03/11 05:54 by tytinfo