Я не знаю, как ограничить время между вызовами моей функции

  
//let screenWidth = window.screen.width;
//let screenHeight = window.screen.height;
let screenWidth = 800;
let screenHeight = 600;
let assets = {};
let frames = 60;

let score = 0;
let lives = 3;
let player;
// let enemie;
//let enemies;
let bullet;
//let bullets;
let powerup = 0;
let gameOver = true;

function drawScoreBoard() {
  textSize(20);
  fill('white');
  text(`Score: ${score} / Lives: ${lives}`, 20, 40);
}

function preload() {
  assets.player = loadImage('assets/Player.png');
  assets.enemie = loadImage('assets/Enemie.png');
  assets.bulletRight = loadImage('assets/Bullet_Right.png');
  assets.bulletLeft = loadImage('assets/Bullet_Left.png');
  assets.bulletUp = loadImage('assets/Bullet_Up.png');
  assets.bulletDown = loadImage('assets/Bullet_Down.png');
}

function setup() {
  bullets = createGroup();
  enemies = createGroup();
  assets.player.resize(30, 30);
  assets.enemie.resize(30, 30);
  assets.bulletRight.resize(30, 30);
  assets.bulletLeft.resize(30, 30);
  assets.bulletUp.resize(30, 30);
  assets.bulletDown.resize(30, 30);
  createCanvas(screenWidth, screenHeight);
}

function createBullet(){
    let numList = [0, 90, 180, 270, 360];
    let bulletDirection = [assets.bulletLeft, assets.bulletUp, assets.bulletRight, assets.bulletDown];
    let randomdirection = numList[Math.floor(Math.random() * numList.length)];
    let bullet = createSprite(bulletDirection[(Math.round(player.getDirection()/90))]);
    
    enemie.centerX = random(0, screenWidth);
    enemie.setSpeed(random(1,10));
    enemie.setDirection(randomdirection);
    enemie.setCollider("circle");

    bullets.add(bullet);
}

function createPlayer(){
  player = createSprite(assets.player);
  player.bottom = screenHeight - 20;
  player.centerX = screenWidth / 2;
}


function shoot(amountofbulletstobeshot) {
  let bulletDirection = [assets.bulletLeft, assets.bulletUp, assets.bulletRight, assets.bulletDown];
  let bullet = createSprite(bulletDirection[Math.abs(((Math.round(player.getDirection()/90))))]);
  bullets.add(bullet);
//  bullet.direction = player.direction;
  bullet.centerX = player.centerX;
  bullet.centerY = player.centerY;
  bullet.setVelocity(11, player.getDirection());

//  console.log('The players current direction right now is:  ' + player.getDirection());

}
function shooting() {
  if (keyIsDown(KEY.SPACE)) {
    if (powerup === 1) {
      shoot(3);
    }
    else {
      shoot(1);
    }
  }
    if (bullet) {
      if (bullet.centerX[1] === screenWidth) {
        bullets.remove(bullet);
    }
  }
}

function updateplayer() {
  //movement
  if (keyIsDown) {
    if (keyIsDown(KEY.RIGHT_ARROW)) {
      player.setVelocity(6, 0);
    }
    if (keyIsDown(KEY.LEFT_ARROW)) {
      player.setVelocity(6, 180);
    }
    if (keyIsDown(KEY.UP_ARROW)) {
      player.setVelocity(6, 270);
    }
    if (keyIsDown(KEY.DOWN_ARROW)) {
      player.setVelocity(6, 90);
    }
  }

  //dont go offscreen
  if (player.left < 0) {
    player.left = 0;
  }
  if (player.right > screenWidth) {
    player.right = screenWidth;
  }
  if (player.top < 0) {
    player.top = 0;
  }
  if (player.bottom > screenHeight) {
    player.bottom = screenHeight;
  }
  enemies.overlap(player, HandlePlayerEnemieCollision);
  //end up updateplayer
}
function updateEnemie() {
if (frameCount % 1 === 0) {
    let directions = ["LEFT", "RIGHT", "UP", "DOWN"];
    let direction = random(directions);
    if (direction === "LEFT" && enemie.left > 0) {
      enemie.centerX -= 5;
    }
    if (direction === "RIGHT" && enemie.right < screenWidth) {
      enemie.centerX += 5;
    }
    if (direction === "UP" && enemie.top > 0) {
      enemie.centerY -= 5;
    }
    if (direction === "DOWN" && enemie.bottom < screenHeight) {
      enemie.centerY += 5;
    }

}
}

function createEnemie() {
  let directions = [270, 180, 0, 90];
  direction = directions[(Math.floor(Math.random() * 5))];
  enemies.overlap(bullets, HandleEnemieBulletCollision);
  if (frameCount % 60 === 0) {
  enemie = createSprite(assets.enemie);
    enemie.centerX = Math.floor(Math.random() * 300) + 100;
    enemie.centerY = Math.floor(Math.random() * 300) + 100;
    enemie.setVelocity(Math.floor(Math.random() * 5) + 1, direction);
    enemies.add(enemie);
  }
}

function HandleEnemieEdgeCollision(enemie, edge) {
  if (enemie.centerY === screenWidth) {
    enemie.remove();
  }
}

function HandleEnemieBulletCollision(enemie, bullet) {
   enemie.remove();
   bullet.remove();
   score++;
}

function HandlePlayerEnemieCollision(player, enemie) {
  enemie.remove();
  player.remove();
  lives--;
  if (lives === 0) {
        gameOver = true;
    }
  createPlayer();
}

/*
function updateEnemie() {
  player.setVelocity(7, player.direction);
}
*/

function cheat() {
  score = (score + 1000000);
  lives = (lives + 1000000);
  cheats = 'on';
  if (cheats === 'on') {
    textSize(50);
    fill('yellow');
    text('CHEATS ACTIVATED', 400, 300);
  }
}

/*
function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds) {
      break;
    }
  }
}
*/


function drawGameOverScreen() {
    background("black");
    textAlign(CENTER);
    fill("white");
    textSize(40);
    text("WELCOME", screenWidth/2, screenHeight/2);
    textSize(20);
    text("Press SPACE to play!", screenWidth/2, screenHeight/2 + 100);

    if (keyWentDown(KEY.SPACE)){
        resetGame();
        gameOver = false;
    }
}

function resetGame(){
    score = 0; 
    lives = 3;

    createPlayer();
}

function drawGame() {
   background('lightgreen');
  drawScoreBoard();
  updateplayer();
  drawSprites();
  shooting();
//  updateEnemie();
  createEnemie();  
}

function draw() {
  
  if (gameOver === true) {
        drawGameOverScreen();
    } else {
        drawGame();
    }
}

Вот мой код, я хочу добавить ограничение по времени, сколько секунд должно пройти, прежде чем вы снова сможете стрелять, прямо сейчас вы можете просто спамить и заставить все пули лететь по прямой мне нужно подождать, прежде чем я позволю игроку снимай еще раз спасибо! Это поможет выделить, и мне нужно это как можно меньше минут.

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
0
0
21
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Используйте флаг, чтобы узнать, когда съемка включена и выключена. После каждого выстрела отключайте возможность стрелять. Затем используйте setTimeout, чтобы включить съемку через определенное время.

let shootingEnabled = true;

function tempDisableShooting(duration) {
  shootingEnabled = false;

  setTimeout(() => {
    shootingEnabled = true;
  }, duration);
}

function shooting() {
  if (shootingEnabled && keyIsDown(KEY.SPACE)) {
    if (powerup === 1) {
      shoot(3);
    } else {
      shoot(1);
    }

    tempDisableShooting(1000); // Disable shooting for 1 second.
  }

  if (bullet) {
    if (bullet.centerX[1] === screenWidth) {
      bullets.remove(bullet);
    }
  }
}

Добавьте свойство для отслеживания отключенного состояния съемки и константу для времени задержки в миллисекундах.

let shootDisabled = false;
const shootDelayMS = 300;

Обновите функцию стрельбы, чтобы стрелять только в том случае, если shootDisabled == false, обновите shootDisabled на true после каждого выстрела и запустите setTimeout, который ждет shootDelayMS миллисекунд, прежде чем снова установить shootDisabled на false.

function shoot(amountofbulletstobeshot) {
  if (shootDisabled == false) {
    let bulletDirection = [assets.bulletLeft, assets.bulletUp, assets.bulletRight, assets.bulletDown];
    let bullet = createSprite(bulletDirection[Math.abs(((Math.round(player.getDirection()/90))))]);
    bullets.add(bullet);
    bullet.centerX = player.centerX;
    bullet.centerY = player.centerY;
    bullet.setVelocity(11, player.getDirection());

    shootDisabled = true;
    setTimeout(() => shootDisabled = false, shootDelayMS );
  }
}

один из способов — хранить данные в двух переменных: is_shooting, shot_reset.

if(is_shooting){
    if(shot_reset>=x){ //x is frame count till able to shoot again)
        shot_reset==0;
        is_shooting=false;
    }else{
        shot_reset++
    }

}

Другие вопросы по теме