Maison  >  Article  >  interface Web  >  Le parcours de création d'un script Dino à saut automatique

Le parcours de création d'un script Dino à saut automatique

Susan Sarandon
Susan Sarandonoriginal
2024-11-04 17:42:02675parcourir

The Journey of Creating an Auto-Jump Dino Script

Je n'arrivais pas à dormir. Peut-être que c'était les trois tasses de café que j'avais bu plus tôt, ou peut-être que mon esprit bouillonnait d'idées. Quoi qu’il en soit, je me suis retrouvé agité et incapable de m’endormir. Au lieu de lutter contre l’insomnie, j’ai décidé de coder. Et quelle meilleure façon de dépenser cette énergie que de créer un script qui ferait sauter tout seul le Dino dans le jeu hors ligne Chrome ?

C'est l'histoire de la façon dont une petite étincelle d'idée a conduit à des heures de peaufinage, de tests et, finalement, à un système de saut automatique pleinement fonctionnel pour le T-Rex.

Le début : une idée simple

Au début, j'ai commencé avec le concept le plus basique. Je voulais que le Dino saute automatiquement chaque fois qu'un obstacle était à portée. Le défi semblait simple à l’époque. Après un peu de réflexion, j'ai concocté un script simple :

// 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();

Cette première version a fait le travail. Le Dino détecterait les obstacles et sauterait automatiquement à chaque fois qu'il s'en approchait. Cependant, il restait encore beaucoup à améliorer. Cela semblait robotique et limité – il pouvait sauter, mais il n’était pas nécessaire de s’accroupir ni de prendre en compte la façon dont la vitesse du jeu affectait les réactions du Dino. Je voulais quelque chose de plus adaptatif et dynamique.

L'évolution : saut automatique adaptatif et accroupissement

J'ai passé les heures suivantes à affiner le code, en ajoutant plus de fonctionnalités comme le saut adaptatif basé sur la vitesse du jeu et en intégrant un mécanisme d'accroupissement pour le survol des ptérodactyles. Le résultat était un script beaucoup plus en phase avec le jeu lui-même. La version finale a permis au Dino de réagir non seulement en fonction de distances fixes, mais en s'adaptant à la vitesse du jeu lui-même.

Voici ce que j'ai trouvé :

// 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
  }
}

Réflexions sur le parcours de codage

Ce voyage d'une nuit blanche à un script de saut automatique entièrement fonctionnel était à la fois amusant et stimulant. Ce qui a commencé comme une simple idée a évolué vers quelque chose de beaucoup plus complexe, exigeant une attention aux détails, de l'adaptabilité et une volonté d'expérimenter. Chaque itération a rapproché le script de l'impression qu'il faisait partie intégrante du jeu plutôt que d'être un simple module complémentaire.

C'est la beauté du codage : vous commencez avec une idée, et grâce à la persévérance et à la créativité, vous obtenez quelque chose qui dépasse votre vision originale. Et parfois, tout commence par quelques tasses de café de trop !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn