C++ (Arduino обертка) Вопрос: Я пишу Shoot Em Up игра на Arduino, который имеет ЖК-дисплей, подключенный -C++ двойной доступ член указатель
У меня есть базовый класс (Sprite
), и от этого другого классы - Alien
, Missile
и Player
. Конструктор класса Alien также имеет закрытый член pMissile
(указатель на класс Missile
) - «объект внутри объекта» был бы способом описать это, я думаю. [когда Alien
запускает ракету, она проходит свой собственный (х, у) координаты ракеты, а ракета имеет свой собственный метод перемещения, начиная с Alien
«с координатами]
Мой вопрос: Как я могу получить доступ к координатам ракеты через объект Alien
? Оптимизированный код ниже, и я также подготовил представление классов:
// Bass class - has a form/shape, x and y position
class Sprite
{
public:
Sprite(unsigned char * const spacePtrIn, unsigned int xInit, unsigned int yInit);
virtual void Move() = 0;
void Render() { display.drawBitmap(x,y, spacePtr, 5, 6, BLACK); }
unsigned int getX() const { return x; }
unsigned int getY() const { return y; }
protected:
unsigned char *spacePtr;
unsigned int x, y;
};
// Derived class "Missile", also a sprite and has a specific form/shape, and specific (x,y) derived from input sprite
class Missile : public Sprite
{
public:
Missile(): Sprite(&spaceMissile[0], 0, 0) {}
virtual void Move(); // its own method of moving
};
// Derived class "Alien" - has a specific form/shape, and specific (x,y) position
class Alien : public Sprite
{
public:
Alien();
virtual void Move(); // its own method of moving
private:
Missile *pMissile;
};
Alien::Alien(): Sprite(&spaceAlien[0], random(5, 75), random(4, 10))
{
Missile MissileArray[MaxAmmoSize];
pMissile = &MissileArray[0];
}
void Alien::Move()
{
if(random(10) % 2 == 0)
x += 1;
if(random(10) % 3 == 0)
y += 1;
if((pMissile != NULL) && (random(10) == 1))
{
pMissile->setCoord(x, y);
pMissile->Move(); // move the missile
pMissile++; // move onto the next missile in the array
}
Render();
}
/*****************************************************************************************/
Alien MONSTER;
Player HERO;
Alien *pMONSTER = &MONSTER;
void loop()
{
display.clearDisplay();
MONSTER.Move();
HERO.Move();
pMONSTER->getX(); // this is x location of MONSTER
**// how does pMONSTER access pMissile(x,y) within MONSTER.**
delay(100);
display.display();
}
Embedded C++ Class interaction
Короткий ответ: «Это не так». Вам необходимо предоставить интерфейс в Alien, который позволяет вам получить копию pMissile или интерфейс, который отправляет ему запросы. Или, возьмите pMissile из Alien и просто относитесь к нему на равных с другими вашими сущностями. –
Сторона примечания: инопланетянин и т. Д. Подклассы спрайта звучат не очень хорошо. Alien и т. Д. * Имеют * спрайт (возможно, несколько), связанный с ними, но это игровые объекты. Похоже, композиция была бы лучше, чем наследование. Тогда было бы легче также выяснить, как делать то, что вы просите. – hyde