Я продолжаю игру для встроенного микроконтроллера (Arduino), и у меня есть вопрос о взаимодействии классов — этот вопрос продолжается с моего предыдущего вопроса Вот и я основал свой код на предложении sheddenizen (см. ответ на данную ссылку в ‘здесь’):
У меня есть три класса, которые наследуют от базового класса
(я) класс Sprite — (класс баса) имеет растровую форму и (x, y) позицию на ЖК-дисплее
(II) Класс ракетный: общедоступный спрайт — имеет определенную форму, (х, у), а также принимает объект
(III) класс Alien: публичный спрайт — имеет определенную форму и (х, у)
(IV) Класс игрока: публичный спрайт — «»
Все они имеют разные (виртуальные) методы перемещения и отображаются на ЖК-дисплее:
Мой упрощенный код приведен ниже — в частности, я хочу, чтобы ракета запускалась только при определенных условиях: когда ракета создается, она принимает значение объектов (x, y), как я могу получить доступ к значению переданных объектов в унаследованном классе?
// Bass class - has a form/shape, x and y position
// also has a method of moving, though its not defined what this is
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 X() const { return x; }
unsigned int Y() const { return y; }
protected:
unsigned char *spacePtr;
unsigned int x, y;
};
// Sprite constructor
Sprite::Sprite(unsigned char * const spacePtrIn, unsigned int xInit, unsigned int yInit)
{
x = xInit;
y = yInit;
spacePtr = spacePtrIn;
}
/*****************************************************************************************/
// Derived class "Missile", also a sprite and has a specific form/shape, and specific (x,y) derived from input sprite
// also has a simple way of moving
class Missile : public Sprite
{
public:
Missile(Sprite const &launchPoint): Sprite(&spaceMissile[0], launchPoint.X(), launchPoint.Y()) {}
virtual void Move();
};
void Missile::Move()
{
// Here - how to access launchPoint.X() and launchPoint.Y() to check for
// "fire conditions"y++;
Render();
}// create objects
Player HERO;
Alien MONSTER;
Missile FIRE(MONSTER);
// moving objects
HERO.Move();
MONSTER.Move();
FIRE.Move();
поскольку Missile
это подкласс Sprite
вы можете получить доступ Sprite::x
а также Sprite::y
как будто они были членами Ракеты. Это просто писать x
(или же this->x
если вы настаиваете).
launchpoint
ссылка на то, что вы получили в конструкторе, к настоящему времени исчезла, поэтому ваш Missile::Move
memfunction больше не может получить к нему доступ.
Если в то же время члены x
а также y
изменилось, но вы хотите оригинал значение, вы можете сохранить ссылку на launchpoint
(что может быть опасно, оно уничтожено) или вам нужно сохранить копию исходных координат.
Других решений пока нет …