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?