Maison > Article > interface Web > Le parcours de création d'un script Dino à saut automatique
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.
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.
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 } }
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!