ホームページ  >  記事  >  ウェブフロントエンド  >  自動ジャンプ Dino スクリプト作成の旅

自動ジャンプ Dino スクリプト作成の旅

Susan Sarandon
Susan Sarandonオリジナル
2024-11-04 17:42:02675ブラウズ

The Journey of Creating an Auto-Jump Dino Script

眠れませんでした。もしかしたら、先ほどコーヒーを3杯飲んだせいかもしれないし、それとも私の頭がアイデアを巡らせていたのかもしれない。とにかく、私は落ち着かず、そこから離れることができないことに気づきました。私は不眠症と戦う代わりに、コーディングをすることにしました。そのエネルギーを費やすのに、Chrome オフライン ゲームの恐竜を自動的にジャンプさせるスクリプトを作成することよりも良い方法はあるでしょうか?

これは、小さなアイデアのひらめきが、何時間もの調整とテストを経て、最終的に完全に機能するティラノサウルスの自動ジャンプ システムにどのようにつながったのかについての物語です。

始まり: シンプルなアイデア

最初は、最も基本的なコンセプトから始めました。障害物が範囲内にあるときはいつでも、Dino が自動的にジャンプするようにしたいと考えていました。当時、この挑戦​​は簡単そうに見えました。少し考えた後、簡単なスクリプトを作成しました。

// Auto jump function
function autoJump() {
  const checkObstacle = setInterval(() => {
    const tRex = Runner.instance_.tRex;

    // Check if an obstacle is near
    const obstacles = Runner.instance_.horizon.obstacles;

    if (obstacles.length > 0) {
      const obstacle = obstacles[0];

      // If the obstacle is close and within jumpable range, make the Dino jump
      if (obstacle.xPos < 70 && obstacle.xPos > 20 && !tRex.jumping) {
        tRex.startJump();
      }
    }
  }, 10); // Check every 10ms
}

// Start auto jump
autoJump();

この最初のバージョンはその役割を果たしました。 Dino は障害物を検出し、障害物に近づくと自動的にジャンプします。ただし、改善すべき点はまだたくさんありました。それはロボット的で制限されているように感じられました。ジャンプすることはできましたが、しゃがむことや、ゲームのスピードが恐竜の反応にどのような影響を与えるかを考慮することはありませんでした。もっと適応的でダイナミックなものが欲しかったです。

進化: 適応型自動ジャンプとしゃがみ

私はその後数時間を費やしてコードを改良し、ゲームの速度に基づいた適応ジャンプなどの機能を追加し、テロダクティルが飛んできたときのしゃがむメカニズムを統合しました。その結果、実際のゲームとより調和したスクリプトが完成しました。最終バージョンでは、ディノは固定距離に基づいて反応するだけでなく、ゲーム自体の速度に合わせて反応できるようになりました。

私が思いついたのは次のとおりです:

// Create the button to toggle auto-jump
const toggleButton = createToggleButton();
document.body.appendChild(toggleButton);

let autoJumpActive = false; // Auto-jump initially inactive
let autoJumpInterval = null; // Store interval ID
let jumpCount = 0; // Count the number of jumps
let obstacleCount = 0; // Count the number of obstacles encountered
let isCrouching = false; // Track crouch state

// Function to create the toggle button
function createToggleButton() {
  const button = document.createElement('button');
  button.innerText = 'Activate Auto-Jump';
  styleToggleButton(button);
  button.addEventListener('click', toggleAutoJump);
  return button;
}

// Function to style the toggle button
function styleToggleButton(button) {
  button.style.position = 'fixed';
  button.style.top = '10px';
  button.style.left = '10px';
  button.style.padding = '10px';
  button.style.zIndex = '1000';
  button.style.backgroundColor = '#4CAF50';
  button.style.color = '#fff';
  button.style.border = 'none';
  button.style.cursor = 'pointer';
}

// Function to simulate a key press
function simulateKeyPress(keyCode, key) {
  const event = new KeyboardEvent('keydown', {
    keyCode: keyCode,
    code: key,
    key: key,
    bubbles: true,
    cancelable: true,
  });
  document.dispatchEvent(event);
}

// Function to simulate a key release
function simulateKeyRelease(keyCode, key) {
  const event = new KeyboardEvent('keyup', {
    keyCode: keyCode,
    code: key,
    key: key,
    bubbles: true,
    cancelable: true,
  });
  document.dispatchEvent(event);
}

// Function to calculate adaptive distances for jumping and crouching based on speed
function calculateAdaptiveDistance(baseDistance) {
  const speed = Runner.instance_.currentSpeed;
  return baseDistance + speed * 3; // Adjust the multiplier as needed for more precision
}

// Function to start auto-jumping and crouching
function startAutoJump() {
  autoJumpInterval = setInterval(() => {
    const tRex = Runner.instance_.tRex;
    const obstacles = Runner.instance_.horizon.obstacles;
    const speed = Runner.instance_.currentSpeed; // Get the current speed of the game

    if (obstacles.length > 0) {
      const obstacle = obstacles[0];
      const distanceToObstacle = obstacle.xPos - tRex.xPos; // Distance from Dino to the obstacle

      // Dynamically calculate the adaptive jump and crouch distances based on game speed
      const jumpDistance = calculateAdaptiveDistance(100); // Base distance is 100, adjusted by speed
      const crouchDistance = calculateAdaptiveDistance(50); // Base crouch distance is 50
      const safeDistance = 40; // Minimum safe distance to avoid jumping too early

      // Check if the Dino needs to jump or crouch
      if (distanceToObstacle < jumpDistance && distanceToObstacle > safeDistance) {
        if (!tRex.jumping && !isCrouching) { // Ensure Dino is not crouching or jumping
          jumpCount++; // Increment jump count
          simulateKeyPress(32, ' '); // Simulate jump (spacebar)
        }
      } else if (distanceToObstacle <= crouchDistance && distanceToObstacle > safeDistance && !tRex.jumping) {
        // Only crouch if the Dino is not jumping
        simulateKeyPress(40, 'ArrowDown'); // Simulate crouch (down arrow)
        isCrouching = true; // Set crouch state to true
      } else if (obstacle.typeConfig.type === 'PTERODACTYL' && obstacle.yPos < 70) {
        // Crouch if the obstacle is a Pterodactyl flying high
        simulateKeyPress(40, 'ArrowDown'); // Simulate crouch (down arrow)
        isCrouching = true; // Set crouch state to true
      }

      // Release crouch when the obstacle is passed (Dino's xPos is greater than obstacle's xPos)
      if (tRex.xPos > obstacle.xPos && isCrouching) {
        simulateKeyRelease(40, 'ArrowDown'); // Release crouch (down arrow)
        isCrouching = false; // Reset crouch state
      }
    }

    // Update obstacle count
    obstacleCount = Runner.instance_.horizon.obstacles.length;

  }, 50); // Reduced interval time to 50ms for more frequent checks
}

// Function to stop auto-jumping
function stopAutoJump() {
  clearInterval(autoJumpInterval);
  autoJumpActive = false; // Reset auto-jump state
  toggleButton.innerText = 'Activate Auto-Jump';
  toggleButton.style.backgroundColor = '#4CAF50';
}

// Function to toggle auto-jump
function toggleAutoJump() {
  if (autoJumpActive) {
    stopAutoJump();
  } else {
    startAutoJump();
    toggleButton.innerText = 'Deactivate Auto-Jump';
    toggleButton.style.backgroundColor = '#f44336';
  }
  autoJumpActive = !autoJumpActive; // Toggle the state
}

// Detecting game over
const originalGameOver = Runner.prototype.gameOver;
Runner.prototype.gameOver = function() {
  stopAutoJump(); // Stop auto-jumping on game over
  originalGameOver.apply(this, arguments); // Call the original game over function
}

// Detecting when the game restarts
const originalStartGame = Runner.prototype.startGame;
Runner.prototype.startGame = function() {
  originalStartGame.apply(this, arguments);
  if (autoJumpActive) {
    startAutoJump(); // Restart auto-jump on game restart
  }
}

コーディングの旅を振り返る

眠れない夜から完全に機能する自動ジャンプ スクリプトに至るまでのこの旅は、楽しくもあり、やりがいのあるものでした。単純なアイデアとして始まったものは、細部への注意、適応性、実験意欲を必要とするより複雑なものに進化しました。反復を繰り返すたびに、スクリプトは単純なアドオンではなく、ゲームの統合された一部のように感じられるようになりました。

これがコーディングの美しさです。アイデアから始まり、粘り強く創造性を発揮することで、最終的には当初のビジョンを超えるものが完成します。そして時には、コーヒーの飲みすぎからすべてが始まることもあります!

以上が自動ジャンプ Dino スクリプト作成の旅の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。