Rumah > hujung hadapan web > tutorial js > Perjalanan Mencipta Skrip Dino Lompat Auto

Perjalanan Mencipta Skrip Dino Lompat Auto

Susan Sarandon
Lepaskan: 2024-11-04 17:42:02
asal
741 orang telah melayarinya

The Journey of Creating an Auto-Jump Dino Script

Saya tidak boleh tidur. Mungkin ia adalah tiga cawan kopi yang saya telah minum sebelum ini, atau mungkin fikiran saya berlumba-lumba dengan idea. Walau apa pun, saya mendapati diri saya resah dan tidak dapat hanyut. Daripada melawan insomnia, saya memutuskan untuk membuat kod. Dan apakah cara yang lebih baik untuk menghabiskan tenaga itu daripada mencipta skrip yang akan menjadikan Dino dalam permainan luar talian Chrome melompat dengan sendirinya?

Ini ialah cerita tentang bagaimana cetusan idea kecil membawa kepada pengubahsuaian berjam-jam, ujian dan akhirnya, sistem autolompat berfungsi sepenuhnya untuk T-Rex.

Permulaan: Idea Mudah

Pada mulanya, saya bermula dengan konsep yang paling asas. Saya mahu Dino melompat secara automatik setiap kali halangan berada dalam jarak. Cabaran itu kelihatan mudah pada masa itu. Selepas sedikit berfikir, saya menyiapkan skrip mudah:

// 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();
Salin selepas log masuk

Versi pertama ini berjaya. Dino akan mengesan halangan dan melompat secara automatik apabila ia menghampiri satu halangan. Walau bagaimanapun, masih banyak yang perlu diperbaiki. Rasanya robotik dan terhad—ia boleh melompat, tetapi tidak ada yang membongkok atau mengambil kira bagaimana kelajuan permainan mempengaruhi reaksi Dino. Saya mahukan sesuatu yang lebih adaptif dan dinamik.

Evolusi: Lompat Auto Suai dan Membongkok

Saya menghabiskan beberapa jam seterusnya untuk menapis kod, menambahkan lebih banyak ciri seperti lompatan adaptif berdasarkan kelajuan permainan dan menyepadukan mekanik bongkok ketika Pterodactyls terbang. Hasilnya ialah skrip yang terasa lebih selaras dengan permainan sebenar. Versi terakhir membenarkan Dino bertindak balas bukan sahaja berdasarkan jarak tetap, tetapi dengan menyesuaikan diri dengan kelajuan permainan itu sendiri.

Ini yang saya dapat:

// 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
  }
}
Salin selepas log masuk

Refleksi Perjalanan Pengekodan

Perjalanan daripada malam tanpa tidur ini kepada skrip autolompat yang berfungsi sepenuhnya adalah menyeronokkan dan mencabar. Apa yang bermula sebagai idea mudah berkembang menjadi sesuatu yang lebih kompleks, memerlukan perhatian terhadap perincian, kebolehsuaian dan kesediaan untuk mencuba. Setiap lelaran membawa skrip lebih dekat kepada perasaan seperti bahagian bersepadu permainan dan bukannya alat tambah mudah.

Inilah keindahan pengekodan: anda bermula dengan idea, dan melalui kegigihan dan kreativiti, anda akan memperoleh sesuatu yang melebihi penglihatan asal anda. Dan kadangkala, semuanya bermula dengan beberapa terlalu banyak cawan kopi!

Atas ialah kandungan terperinci Perjalanan Mencipta Skrip Dino Lompat Auto. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan