Heim >Web-Frontend >js-Tutorial >Der Weg zur Erstellung eines Auto-Jump-Dino-Skripts

Der Weg zur Erstellung eines Auto-Jump-Dino-Skripts

Susan Sarandon
Susan SarandonOriginal
2024-11-04 17:42:02728Durchsuche

The Journey of Creating an Auto-Jump Dino Script

Ich konnte nicht schlafen. Vielleicht lag es an den drei Tassen Kaffee, die ich zuvor getrunken hatte, oder vielleicht waren es auch meine Gedanken, die vor lauter Ideen rasten. Trotzdem fühlte ich mich unruhig und konnte nicht einschlafen. Anstatt gegen die Schlaflosigkeit anzukämpfen, beschloss ich, zu programmieren. Und wie könnte man diese Energie besser einsetzen, als ein Skript zu erstellen, das den Dino im Chrome-Offline-Spiel von selbst springen lässt?

Dies ist eine Geschichte darüber, wie ein kleiner Funke einer Idee zu stundenlangem Optimieren, Testen und letztendlich zu einem voll funktionsfähigen automatischen Sprungsystem für den T-Rex führte.

Der Anfang: Eine einfache Idee

Zuerst begann ich mit dem grundlegendsten Konzept. Ich wollte, dass der Dino automatisch springt, wenn ein Hindernis in Reichweite ist. Die Herausforderung schien damals einfach. Nach einigem Nachdenken habe ich ein einfaches Skript erstellt:

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

Diese erste Version hat den Zweck erfüllt. Der Dino würde Hindernisse erkennen und automatisch springen, wenn er sich einem näherte. Allerdings gab es noch einiges zu verbessern. Es fühlte sich roboterhaft und begrenzt an – es konnte springen, aber es gab kein Hocken oder Nachdenken darüber, wie sich die Geschwindigkeit des Spiels auf die Reaktionen des Dinos auswirkte. Ich wollte etwas adaptiveres und dynamischeres.

Die Evolution: Adaptives automatisches Springen und Hocken

Ich habe die nächsten Stunden damit verbracht, den Code zu verfeinern, weitere Funktionen wie adaptives Springen basierend auf der Spielgeschwindigkeit hinzuzufügen und eine Hockmechanik zu integrieren, wenn die Pterodaktylen vorbeifliegen. Das Ergebnis war ein Drehbuch, das viel besser zum eigentlichen Spiel passte. Die endgültige Version ermöglichte es dem Dino, nicht nur auf der Grundlage fester Entfernungen zu reagieren, sondern sich auch an die Geschwindigkeit des Spiels selbst anzupassen.

Hier ist, was ich mir ausgedacht habe:

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

Überlegungen zur Coding Journey

Diese Reise von einer schlaflosen Nacht zu einem voll funktionsfähigen Auto-Jump-Skript war sowohl unterhaltsam als auch herausfordernd. Was als einfache Idee begann, entwickelte sich zu etwas viel Komplexerem, das Liebe zum Detail, Anpassungsfähigkeit und die Bereitschaft zum Experimentieren erforderte. Mit jeder Iteration wirkte das Skript eher wie ein integrierter Teil des Spiels und nicht wie ein einfaches Add-on.

Das ist das Schöne am Codieren: Sie beginnen mit einer Idee und durch Beharrlichkeit und Kreativität erhalten Sie am Ende etwas, das Ihre ursprüngliche Vision übertrifft. Und manchmal beginnt alles mit ein paar Tassen Kaffee zu viel!

Das obige ist der detaillierte Inhalt vonDer Weg zur Erstellung eines Auto-Jump-Dino-Skripts. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn