Decrement is influenced by millis()

Hi,

I made a simple game where you have to avoid the asteroids. When you are hit by one, you lose a life. At 0 lives, u lose.

void playGame(){
  if (gameJustStarted){
    lcd.clear();

    lcd.setCursor(5, 0);
    lcd.print("Ready?");
    delay(2000);
    
    lcd.clear();

    lcd.setCursor(5, 0);
    lcd.print("Start!");
    delay(500);
    
    gameSetup(startingLevelValue, matrixBrightnessValue);
    gameJustStarted = 0;
  }
  
  if (gameOver){
    if (gameOverScreenNo == 0){
      if (currentScore > player1.pScore){
        for (int i = 0; i < nameSize; i++){
          player3.pName[i] = player2.pName[i];
        }
        
        player3.pScore = player2.pScore;
        for (int i = 0; i < nameSize; i++){
          player2.pName[i] = player1.pName[i];
        }
        
        player2.pScore = player1.pScore;
        for (int i = 0; i < nameSize; i++){
          player1.pName[i] = currentPlayer[i];
        }
        
        player1.pScore = currentScore;
        gameOverScreenNo = 1;
        
        writePlayer(1, player1);
        writePlayer(2, player2);
        writePlayer(3, player3);
      }
      else 
        if (currentScore > player2.pScore){
          for (int i = 0; i < nameSize; i++){
            player3.pName[i] = player2.pName[i];
          }
          
          player3.pScore = player2.pScore;
          for (int i = 0; i < nameSize; i++){
            player2.pName[i] = currentPlayer[i];
          }
          
          player2.pScore = currentScore;
          gameOverScreenNo = 2;
          
          writePlayer(2, player2);
          writePlayer(3, player3);
        }
        else 
          if (currentScore > player3.pScore){
            for (int i = 0; i < nameSize; i++){
              player3.pName[i] = currentPlayer[i];
            }
            
            player3.pScore = currentScore;
            gameOverScreenNo = 3;
            
            writePlayer(3, player3);
          }
          else {
            gameOverScreenNo = 4;
          }
          
      gameOverScreenChanged = 1;
    }
    
    if (gameOverScreenNo == 1){
      if (gameOverScreenChanged){
        lcd.clear();
        
        lcd.print("Congrats ");
        lcd.print(currentPlayer);
        lcd.setCursor(0, 1);
        lcd.print("New highscore!");
        
        gameOverScreenChanged = 0;
      }
    }
    else 
      if (gameOverScreenNo == 2){
        if (gameOverScreenChanged){
          lcd.clear();
          
          lcd.print("You are");
          lcd.setCursor(0, 1);
          lcd.print("in second place.");
          
          gameOverScreenChanged = 0;
        }
      }
      else 
        if (gameOverScreenNo == 3){
          if (gameOverScreenChanged){
            lcd.clear();
            
            lcd.print("Good!");
            lcd.setCursor(0, 1);
            lcd.print("You're 3rd place");
            
            gameOverScreenChanged = 0;
          }
        }
        else 
          if (gameOverScreenNo == 4){
            if (gameOverScreenChanged){
              lcd.clear();
              
              lcd.print("Try more! Better");
              lcd.setCursor(0, 1);
              lcd.print("luck next time.");
              
              gameOverScreenChanged = 0;
            }
          }
    
    if (gameOverScreenNo >= 1 && gameOverScreenNo <= 4){
      if (readJoyStickButton()){
        gameOverScreenNo = 5;
        gameOverScreenChanged = 1;
      }
    }
    else 
      if (gameOverScreenNo == 5){
        if (gameOverScreenChanged){
          lcd.clear();
          
          lcd.print(currentPlayer);
          lcd.print(": ");
          lcd.print(currentScore);
          
          lcd.setCursor(0, 1);
          if (gameOverSelection == 0){
            lcd.print(">");
          }
          else {
            lcd.print(" ");
          }
          
          lcd.print("Again? ");
          if (gameOverSelection == 1){
            lcd.print(">");
          }
          else {
            lcd.print(" ");
          }
          
          lcd.print("Back");
          
          gameOverScreenChanged = 0;
        }
        
        if (readJoyStickX()){
          gameOverSelection = !gameOverSelection;
          gameOverScreenChanged = 1;
        }
        
        if (readJoyStickButton()){
          gameOver = 0;
          gameJustStarted = 1;
          gameOverScreenNo = 0;
         
          if (gameOverSelection == 1){
            menuWasClicked = 0;
          }
          
          gameOverSelection = 0;
        }
      }

    displayPlayer();
    
    return;
  }

  iterateGame();
  displayGameStatus(currentLives, baseLevel, currentScore);
}

int matrixSize = 8;

int asteroids[] = {0,0,0,0,0,0,0,0};

int playerPos;

bool playerIsDead;
bool dontMoveLevel;

int customLevelMillis;

int randPos;

float gameSpeed;
int delayAsteroids;
unsigned long now;

int totalAsteroids;

const int scoreMultiplier = 3;
const float gameSpeedMultiplier = 1.05;

bool gameStarted;

void displayPlayer() {
  lc.setLed(0, matrixSize - 1, playerPos, true);  
}

void displayGameStatus(int currentLives, int levelValue, int currentScore) {
  if (millis() - lastDisplayMillis > displayDelay) {
    lcd.clear();

    lcd.setCursor(0, 0);
    lcd.print("Lives:");
    lcd.print(currentLives);

    lcd.print(" Level:");
    lcd.print(levelValue);

    lcd.setCursor(0, 1);
    lcd.print("Score:");
    lcd.print(currentScore);

    lastDisplayMillis = millis();
  }
}

void spawnAsteroids() {
  if(millis() - now > gameSpeed){
    
    now = millis();
    
    currentScore += scoreMultiplier * baseLevel;
    
    if (gameStarted) {
      gameSpeed /= pow(gameSpeedMultiplier, baseLevel);
      gameStarted = false;
    }
    
    if(delayAsteroids == 1){
      totalAsteroids++;
      
      if (totalAsteroids == 9) {
        baseLevel++;
        totalAsteroids = 0;
        gameSpeed /= gameSpeedMultiplier;
      }
     
      randPos = random(0, matrixSize);
        
        if(asteroids[randPos] == 0){  
          asteroids[randPos] = 1;
      }
    }

    if(delayAsteroids != 3) {
      delayAsteroids++;
    }
     else {
      delayAsteroids = 1;
     }

    for(int i = 0; i < matrixSize; i++){
      if(asteroids[i] == 10)
        asteroids[i] = 0;
        
      if(asteroids[i] != 0)
        asteroids[i]++;
    }

    lc.clearDisplay(0);
  }
}

void updateDirection() {
  int xAxis = readJoyStickX();  

  if (xAxis == 1) {
    playerPos++;

    if (playerPos > matrixSize - 1) {
      playerPos = 0;

    lc.clearDisplay(0);
    }
  }
  else
    if (xAxis == -1) {
      playerPos--;

      if (playerPos < 0) {
        playerPos = matrixSize - 1;
      }

      lc.clearDisplay(0);
    }
    else {
      lc.clearDisplay(0);
    }
}

void moveAsteroids() {
  for(int i = 0; i < matrixSize; i++){
    if(asteroids[i] > 0)
      lc.setLed(0, asteroids[i] - 2, i, true);
      lc.setLed(0, asteroids[i] - 3, i, true);
  }
}

void detectImpact() {
  if (asteroids[playerPos] == 9){
    currentLives--;
    explosionAnimation();
    
    if (currentLives < -100) {
      gameOver = true;
      
      lc.clearDisplay(0);
      sadAnimation();
    }
  }
}

void gameSetup(int startingLevelValue, int matrixBrightnessValue){
  lc.clearDisplay(0);
  baseLevel = startingLevelValue;
  currentScore = 0;
  currentLives = startingLives;
  playerIsDead = 0;
  customLevelMillis = 0;
  gameSpeed = 300;
  now = millis();
  delayAsteroids = 1;
  gameOver = false;
  playerPos = 3;
  gameStarted = true;
  totalAsteroids = 0;
}

void iterateGame(){
  displayPlayer();
  updateDirection();
  spawnAsteroids();
  moveAsteroids();
  detectImpact();
}

void smileAnimation(){
  const byte smileByte[8] = {
    B00000000,
    B01100110,
    B01100110,
    B00000000,
    B10000001,
    B01000010,
    B00111100,
    B00000000
  };

  for (int i = 0; i < matrixSize; i++) {
    lc.setRow(0, i, smileByte[i]);
  }
}

void sadAnimation() {
  const byte sadByte[8] = {
    B00000000,
    B01100110,
    B01100110,
    B00000000,
    B00000000,
    B00111100,
    B01000010,
    B10000001
  };

  for (int i = 0; i < matrixSize; i++) {
    lc.setRow(0, i, sadByte[i]);
  }
}

void explosionAnimation() {
  for(int i = 0; i < 4; i++) {
      lc.setLed(0, 7, playerPos + i, true);
      lc.setLed(0, 7, playerPos - i, true);
      lc.setLed(0, 7 - i, playerPos + i, true);
      lc.setLed(0, 7 - i, playerPos - i, true);
      lc.setLed(0, 7 - 1.5 * i, playerPos, true);
    }
}

void setup() {
  pinMode(joystickButtonPin, INPUT_PULLUP);
  
  lcd.begin(16, 2);
  
  lc.shutdown(0, false);
  lc.clearDisplay(0);

  player1 = getPlayer(1);
  player2 = getPlayer(2);
  player3 = getPlayer(3);
        
  lcd.print("    Welcome!");
  delay(3000);
  
  smileAnimation();
}

void loop() {
  lc.setIntensity(0, matrixBrightnessValue);
  if (!menuWasClicked){
    if (readJoyStickButton()){
      menuWasClicked = 1;
      menuJustStarted = 1;
    }
    else {
      menuSelect();
    }
  }
  else {
    if (menuSelected == 1){
      playGame();    
    }
    else 
      if (menuSelected == 2){
        changeSettings();
      }
      else 
        if (menuSelected == 3){
          navigateHighScores();
        }
        else 
          if (menuSelected == 4){
            displayInfo();
          }
  }
}

When i make curentLives-- its not decrementing with 1, but with a value influenced by gameSpeed, 30, 20, 5 for example. What should I do?

How many currentLives variables do you have in your sketch and what is their scope ?

Please post a complete sketch so that your problem can be seen in context

don't you need to remove that asteroid when you detected a hit?

Thank you!