Как исправить случайное вычитание здоровья игроков при столкновении? - PullRequest
1 голос
/ 06 июня 2019

Я играю в маленький космический корабль, в котором космический корабль должен двигаться, чтобы не попасть под метеорит.Когда метеор попадает в корабль, игрок, как предполагается, проигрывает по состоянию здоровья, но в моем примере игрок всегда теряет число, которое составляет около 12, и я не знаю, что вызывает это.

Я пытался добавитьначав здоровье вместо того, чтобы вычитать это здоровье, я бы добавил его, когда оно ударяет по метеору, но даже тогда здоровье было добавлено на 10, а не на одного, как я хотел.Я пытался использовать console.log, чтобы попытаться найти ошибку, но ничего не получалось

let x = 200;
let x1 = 258;
let score = 0;
let health = 5;
let meteors = [];
let ecllipseMeteors = [];
let meteor;
let ecllipseMeteor;
let spaceShipimg;
let meteorimg;

function Meteor() {
  this.x = random(0,600);
  this.y = random(-200,-190);
  this.speed = random(3,10);

  this.fall = function() {
    this.y = this.y + this.speed;
    if (this.y > height) {
      this.y = random(-200,-100);
      this.speed = random(3, 7);
    }
  };
  this.show = function() { image(meteorimg,this.x,this.y, 40, 40) };
}
function meteormodel() {
  this.x = random(0,600);
  this.y = random(-200,-190);
  this.speed = random(3,10);

  this.fall = function() {
    this.y = this.y + this.speed;
    if (this.y > height) {
      this.y = random(-200,-100);
      this.speed = random(3, 7);
    }
  };
  this.show = function() { ellipse(this.x,this.y, 20, 20) };
}

function setup() {
    // creates canvas
  createCanvas(600, 400);
  timer = createP('');
 meteor = new Meteor();
 ecllipseMeteor = new meteormodel();
 interval = setInterval(scoreCount, 500);
}

function gameOver() {
  textSize(20);
  text("GAME OVER YOUR SCORE: " + score, 200, 200);
  fill(255);
}
function preload() {
    //loads all teh necesarry material
    spaceShipimg = loadImage('assets/spaceShip.png');
  meteorimg = loadImage('assets/meteor.png');

}

function scoreCount() {
score++;
}
function draw() {
  background(11, 72, 170);


  hit = collideRectCircle(x1, 335, 20, 30, meteor.x, meteor.y, 40);
  if(hit == true) {
    health -= 1;
  //  console.log(health -= 1);
    if (health == 0) {
      gameOver();
      noLoop();

    }
  }

    if (keyIsDown(LEFT_ARROW) && x > -46) {
      x -= 5;
    }

    if (keyIsDown(RIGHT_ARROW) && x < 508) {
      x += 5;
    }
    if (keyIsDown(LEFT_ARROW) && x1 > 9) {
      x1 -= 5;
    }

    if (keyIsDown(RIGHT_ARROW) && x1 < 565) {
      x1 += 5;
    }
    rect(x1, 335, 20, 30)
    image(spaceShipimg,x,260,120,120)


        meteor.fall();
        meteor.show();




    textSize(20);
    text("Health: " + health, 10, 20);
    fill(255);
    textSize(20);
    text("Score: " + score, 10, 40);
    fill(255);
}

Ожидаемый результат состоит в том, что при попадании метеора в ракету здоровье игрока ухудшается на единицу.Проблема в том, что он проходит около 10.

Ответы [ 3 ]

1 голос
/ 06 июня 2019

Проблема в том, что метеорит попадает на корабль или руду не один раз.Один метеор непрерывно попадает на корабль на пути вниз от вершины корабля до дна.
Самый простой способ решить эту проблему - заставить игру вызвать новый метеор.В методе fall условием появления нового метеора является this.y > height.Если meteor.y - это height+1, метеор, поразивший корабль, исчезнет, ​​и в верхней части окна будет установлена ​​новая позиция:

function draw() {
    background(11, 72, 170);

    hit = collideRectCircle(x1, 335, 20, 30, meteor.x, meteor.y, 40);
    if(hit == true) {
        health -= 1;

        meteor.y = height+1; // <----------

        if (health == 0) {
            gameOver();
            noLoop();
        }
    }

    // [...]

}

0 голосов
/ 06 июня 2019

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

hit = collideRectCircle(x1, 335, 20, 30, meteor.x, meteor.y, 40);
if(hit == true) {
  // Your awsome code!
  meteor.y = random(-200,-100);
  meteor.speed = random(3, 7);

Надеюсь, это поможет! : -)

0 голосов
/ 06 июня 2019

По сути, рисовать циклы с «частотой тиков 60», так что это «правда» более одного раза, поэтому вам нужно установить глобальный флаг, который останавливает его после появления один раз.

hit = collideRectCircle(x1, 335, 20, 30, meteor.x, meteor.y, 40);
  if(hit == true) {
    health -= 1;

Решение:

var flag = true; //put this outside the draw scope

 if(hit == true && flag) {
    health -= 1;
    flag = false
}

if(!hit){
flag = true
}

Надеюсь, это поможет.

...