Hello,
I've been battling this issue since the past day and i do not know what to do.
I am new to arduino and c++. I'm working on an arduino airsoft target shooting game where every target contains 2 colors and a piezo sensor (to register hits and it worked perfectly). This game will have multiple game modes based on an enum selected.
This is the main arduino code:
#include "Target.h"
#include "GameHandler.h"
const int LED_PIN_1 = 7;
const int LED_PIN_2 = 6;
const uint8_t PIEZO_PIN_1 = A5;
const int LED_PIN_1a = 4;
const int LED_PIN_2a = 5;
const uint8_t PIEZO_PIN_2 = A0;
int counter = 0;
int targetSensitivity = 1000;
const int NUM_TARGETS = 2;
Target targets[NUM_TARGETS] = { Target(PIEZO_PIN_1, LED_PIN_1, LED_PIN_2),
Target(PIEZO_PIN_2, LED_PIN_1a, LED_PIN_2a) };
GameHandler gameHandler(targets, NUM_TARGETS);
void setup() {
gameHandler.init();
Serial.begin(9600);
gameHandler.selectGamemode(SOLO_TIME_CHALLENGE);
}
void loop() {
gameHandler.gameLoop();
}
This is my header target file
#ifndef TARGET_H
#define TARGET_H
#include <stdlib.h>
#include <Arduino.h>
#include "GameHandler.h"
enum TargetState { LED_NON,
LED_ONE,
LED_TWO,
LED_ALL };
class Target {
private:
uint8_t _piezoPin;
int _ledPin1;
int _ledPin2;
int _sensorValue;
TargetState _state;
unsigned long _timeSinceLedTwo;
unsigned long _timeSinceLedOne;
unsigned long _timeSinceLedNon;
unsigned long _timeSinceLedAll;
public:
int _ledOneThreshold;
int _ledTwoThreshold;
int _ledAllThreshold;
int _ledNonThreshold;
Target(uint8_t piezoPin, int ledPin1, int ledPin2);
void init();
int getSensorValue();
TargetState getState();
void setState(TargetState state);
void prepareTarget(Gamemode gamemode);
bool hasBeenShot();
};
#endif
this is my target cpp file
#include <stdlib.h>
#include <Arduino.h>
#include "Target.h"
#include "GameHandler.h"
Target::Target(uint8_t piezoPin, int ledPin1, int ledPin2) {
_piezoPin = piezoPin;
_ledPin1 = ledPin1;
_ledPin2 = ledPin2;
_timeSinceLedAll = 0;
_timeSinceLedOne = 0;
_timeSinceLedTwo = 0;
_timeSinceLedNon = 0;
_ledOneThreshold = 3000;
_ledTwoThreshold = 3000;
_ledAllThreshold = 3000;
_ledNonThreshold = 1500;
init();
}
void Target::init() {
pinMode(_ledPin1, OUTPUT);
pinMode(_ledPin2, OUTPUT);
setState(LED_NON);
}
int Target::getSensorValue() {
return _sensorValue;
}
TargetState Target::getState() {
return _state;
}
// ONE = HIT
// TWO = READY
// NON = INACTIVE
void Target::setState(TargetState state) {
_state = state;
switch (state) {
case LED_NON:
digitalWrite(_ledPin1, LOW);
digitalWrite(_ledPin2, LOW);
_timeSinceLedNon = millis();
break;
case LED_TWO:
digitalWrite(_ledPin1, LOW);
digitalWrite(_ledPin2, HIGH);
_timeSinceLedTwo = millis();
break;
case LED_ONE:
digitalWrite(_ledPin1, HIGH);
digitalWrite(_ledPin2, LOW);
_timeSinceLedOne = millis();
break;
case LED_ALL:
digitalWrite(_ledPin1, HIGH);
digitalWrite(_ledPin2, HIGH);
_timeSinceLedAll = millis();
break;
}
}
void Target::prepareTarget(Gamemode gamemode) {
switch (gamemode) {
case SOLO_TIME_CHALLENGE:
switch (_state) {
case LED_NON:
if (millis() - _timeSinceLedNon >= _ledNonThreshold) {
setState(LED_TWO);
}
break;
case LED_TWO:
if (millis() - _timeSinceLedTwo >= _ledTwoThreshold) {
// DEACTIVATE TARGET AFTER SOME TIME
setState(LED_NON);
}
break;
case LED_ONE:
if (millis() - _timeSinceLedOne >= 5000, true) {
setState(LED_NON);
}
break;
case LED_ALL:
break;
}
break;
default:
break;
}
}
bool Target::hasBeenShot() {
_sensorValue = analogRead(_piezoPin);
// if (_state != LED_TWO) { return false; }
if (_sensorValue > 900) {
return true;
}
return false;
}
These are my game handler cpp and header file. They manage the game loop. They are incomplete but im unable to continue due to the error im getting.
#ifndef GAMEHANDLER_H
#define GAMEHANDLER_H
#include <stdlib.h>
#include <Arduino.h>
#include "Target.h"
enum Gamemode { SOLO_TIME_CHALLENGE };
class GameHandler {
private:
bool _isPaused;
int _score;
unsigned long _gameTimer;
Gamemode _gamemode;
int _numTargets;
Target* _targets;
unsigned long _gameDuration;
public:
GameHandler(Target targets[], int numTargets);
void init();
void selectGamemode(Gamemode mode);
void gameLoop();
void handleSoloTimeChallenge();
void targetOnhit1(Target target);
};
#endif
header file
#include "GameHandler.h"
#include "Target.h"
#include <stdlib.h>
#include <Arduino.h>
GameHandler::GameHandler(Target targets[], int numTargets) {
_targets = targets;
_numTargets = numTargets;
_isPaused = true;
_score = 0;
_gameTimer = 0;
_gameDuration = 10000000;
}
void GameHandler::init() {
for (int i = 0; i < _numTargets; i++) {
_targets[i].init();
}
}
void GameHandler::selectGamemode(Gamemode mode) {
_gamemode = mode;
_isPaused = false;
_gameTimer = millis();
}
void GameHandler::gameLoop() {
if (_isPaused) {
return;
}
switch (_gamemode) {
case SOLO_TIME_CHALLENGE:
handleSoloTimeChallenge();
break;
default:
break;
}
}
void GameHandler::handleSoloTimeChallenge() {
for (int i = 0; i < _numTargets; i++) {
_targets[i].prepareTarget(SOLO_TIME_CHALLENGE);
if (_targets[i].hasBeenShot()) {
targetOnhit1(_targets[i]);
}
}
if (millis() - _gameTimer >= _gameDuration) {
_isPaused = true;
// end game logic
}
}
void GameHandler::targetOnhit1(Target target) {
switch (target.getState()) {
case LED_NON:
// do nothing
break;
case LED_TWO:
_score++;
target.setState(LED_ONE);
break;
case LED_ONE:
break;
case LED_ALL:
break;
}
}
I keep getting this error eveyrtime i validate.
In file included from C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:5:0,
from C:\Users\PC\Desktop\sketch_jan18a\GameHandler.cpp:1:
C:\Users\PC\Desktop\sketch_jan18a\Target.h:48:22: error: 'Gamemode' has not been declared
void prepareTarget(Gamemode gamemode);
^~~~~~~~
In file included from C:\Users\PC\Desktop\sketch_jan18a\Target.h:5:0,
from C:\Users\PC\Desktop\sketch_jan18a\sketch_jan18a.ino:1:
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:17:3: error: 'Target' does not name a type
Target* _targets;
^~~~~~
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:21:22: error: expected ')' before 'targets'
GameHandler(Target targets[], int numTargets);
^~~~~~~
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:26:21: error: 'Target' has not been declared
void targetOnhit1(Target target);
^~~~~~
C:\Users\PC\Desktop\sketch_jan18a\sketch_jan18a.ino:23:45: error: no matching function for call to 'GameHandler::GameHandler(Target [2], const int&)'
GameHandler gameHandler(targets, NUM_TARGETS);
^
In file included from C:\Users\PC\Desktop\sketch_jan18a\Target.h:5:0,
from C:\Users\PC\Desktop\sketch_jan18a\sketch_jan18a.ino:1:
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:10:7: note: candidate: GameHandler::GameHandler()
class GameHandler {
^~~~~~~~~~~
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:10:7: note: candidate expects 0 arguments, 2 provided
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:10:7: note: candidate: constexpr GameHandler::GameHandler(const GameHandler&)
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:10:7: note: candidate expects 1 argument, 2 provided
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:10:7: note: candidate: constexpr GameHandler::GameHandler(GameHandler&&)
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:10:7: note: candidate expects 1 argument, 2 provided
In file included from C:\Users\PC\Desktop\sketch_jan18a\Target.h:5:0,
from C:\Users\PC\Desktop\sketch_jan18a\Target.cpp:3:
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:17:3: error: 'Target' does not name a type
Target* _targets;
^~~~~~
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:21:22: error: expected ')' before 'targets'
GameHandler(Target targets[], int numTargets);
^~~~~~~
C:\Users\PC\Desktop\sketch_jan18a\GameHandler.h:26:21: error: 'Target' has not been declared
void targetOnhit1(Target target);
^~~~~~
exit status 1
Compilation error: 'Gamemode' has not been declared