// Geom. Objekte: Statische Member: drawAll (einfache Version mit List)
// Implementierung der abstrakten Basisklasse "GraObj"
//
// Klaus Kusche, 2020

#include "graobj.h"

#include "sdlinterf.h"

// Speicher für das statische Member anlegen
// eine Liste wird automatisch auf "leer" initialisiert
list<GraObj *> GraObj::sObjects;

void GraObj::setPos(int x, int y)
{
  undraw();
  mX = x;
  mY = y;
  draw();
}

void GraObj::move(int dx, int dy)
{
  undraw();
  mX += dx;
  mY += dy;
  draw();
}

void GraObj::setSize(int w, int h)
{
  undraw();
  mW = w;
  mH = h;
  draw();
}

void GraObj::scale(int percentX, int percentY)
{
  undraw();
  mW = (mW * percentX) / 100;
  mH = (mH * percentY) / 100;
  draw();
}
  
bool GraObj::fly(bool bounce)
{
  bool ret = true;
  if (((mSX > 0) && (mX >= SDL_X_SIZE - mSX - mW)) ||
      ((mSX < 0) && (mX < -mSX + mW))) {
    if (bounce) {
      mSX = -mSX;
      ret = false;
    }
    else {
      return false;
    }
  }
  if (((mSY > 0) && (mY >= SDL_Y_SIZE - mSY - mH)) ||
      ((mSY < 0) && (mY < -mSY + mH))) {
    if (bounce) {
      mSY = -mSY;
      ret = false;
    }
    else {
      return false;
    }
  }

  move(mSX, mSY);
  return ret;
}

// Zeichne alle Objekte neu
void GraObj::drawAll()
{
  // Seit C++ 11: Die for-:-Schleife belegt die Variable vor dem :
  // der Reihe nach mit allen Elementen im Container nach dem :
  for (GraObj *p : sObjects) {
    p->draw();
  }
  // Alte Varianten mit Iterator:
  // Vor C++11: i ist vom Typ "Iterator über unsere Liste"
  //for (list<GraObj *>::iterator i = sObjects.begin(); i != sObjects.end(); ++i) {
  // Seit C++11: auto..."gib der Variable den Typ, den der Init-Wert hat"
  //for (auto i = sObjects.begin(); i != sObjects.end(); ++i) {
    // i verhält sich wie ein Pointer auf das aktuelle Element in der Liste
    // *i ist daher das aktuelle Element in der Liste, nämlich ein GraObj-Pointer
    // (*i)->draw() ruft für das GraObj, auf den dieser Pointer zeigt, draw auf
    //(*i)->draw();
  //} 
}
