And now the not-any-more-working-Code after making abstract and putting together.. till Side 67 :-)
main.cpp
Code:
#include <Windows.h>
#include <iostream>
#include "Game.h"
// Globale Variablen
Game* g_game = 0; // Zeiger für ein zu erzeugendes Spielfeld-Objekt (mit 0 initialisiert)
// --> Seite 64 Die komplette main wird ersetzt
int main(int argc, char* argv[])
{
std::cout << "game init attempt...\n";
if (TheGame::Instance()->init("Chapter 1", 100, 100, 640, 480,
false))
{
std::cout << "game init success!\n";
while (TheGame::Instance()->running())
{
TheGame::Instance()->handleEvents();
TheGame::Instance()->update();
TheGame::Instance()->render();
SDL_Delay(10);
}
}
else
{
std::cout << "game init failure - " << SDL_GetError() << "\n";
return -1;
}
std::cout << "game closing...\n";
TheGame::Instance()->clean();
return 0;
}
Game.h
Code:
#include <Windows.h>
#include <iostream>
#include "Game.h"
// Globale Variablen
Game* g_game = 0; // Zeiger für ein zu erzeugendes Spielfeld-Objekt (mit 0 initialisiert)
// --> Seite 64 Die komplette main wird ersetzt
int main(int argc, char* argv[])
{
std::cout << "game init attempt...\n";
if (TheGame::Instance()->init("Chapter 1", 100, 100, 640, 480,
false))
{
std::cout << "game init success!\n";
while (TheGame::Instance()->running())
{
TheGame::Instance()->handleEvents();
TheGame::Instance()->update();
TheGame::Instance()->render();
SDL_Delay(10);
}
}
else
{
std::cout << "game init failure - " << SDL_GetError() << "\n";
return -1;
}
std::cout << "game closing...\n";
TheGame::Instance()->clean();
return 0;
}
Game.cpp
Code:
#include "Game.h"
#include <iostream>
using namespace std;
Game* Game::s_pInstance = 0; // --> Seite 64 (Es wird ein Zeiger auf die Singletoninstanz von Game initialisiert)
bool Game::init(const char* title, int xpos, int ypos, int width,
int height, bool fullscreen)
{
// SDL soll initialisiert werden
if (SDL_Init(SDL_INIT_EVERYTHING) == 0)
{
cout << "SDL wurde erfolgreich initialisiert" << endl;
// Zur unterscheidung zwischen Fullscreen oder Fenstermodus
int flags = 0;
if (fullscreen)
{
flags = SDL_WINDOW_FULLSCREEN;
}
// Fenster wird initialisiert
cout << "Fenster wird initialisiert" << endl;
m_pWindow = SDL_CreateWindow(title, xpos, ypos,
width, height, flags);
if (m_pWindow != 0) // Wenn Fensterinitialisierung erfolgreich wird der Renderer initialisiert
{
cout << "Fenster wurde erfolgreich initialisiert" << endl;
cout << "Renderer wird initialisiert" << endl;
m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, 0);
if (m_pRenderer != 0) // Wenn die Rendererinitialisierung erfolgreich war
{
cout << "Renderer wurde erfolgreich initialisiert" << endl;
SDL_SetRenderDrawColor(m_pRenderer, // Hintergrundfarbe wird gesetzt (RGB/A)
255, 0, 0, 255);
if ((IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG) != IMG_INIT_PNG)
{
SDL_Quit();
return 1;
}
else
{
cout << "IMG_Init wurde erfolgreich mit PNG - Format initialisiert" << endl;
}
}
else
{
return false; // Rendererinitialisierung fehlgeschlagen
}
}
else
{
return false; // Fensterinitialisierung fehlgeschlagen
}
}
else
{
return false; // SDLinitialisierung fehlgeschlagen
}
cout << "Alles initialisiert" << endl;
if (!TheTextureManager::Instance()->load("Data/animate-alpha.png",
"animate", m_pRenderer))
{
return false;
cout << "Fehler beim Datei Laden" << endl;
}
m_gameObjects.push_back(new Player(new LoaderParams(100, 100, 128, 82, "animate")));
m_gameObjects.push_back(new Enemy(new LoaderParams(300, 300, 128, 82, "animate")));
// m_go = new GameObject(); // --> Seite 58
// m_player = new Player(); // --> Seite 56 und 58 (wurde vom Autor versehentlich zweimal beschrieben)
// m_enemy = new Enemy(); // --> wird erst auf Seite 59 hinzugefügt
// m_enemy1 = new Enemy(); // --> Seite 56 (Zuvor muss aber erst eine Enemy.h erstellt werden, in Game.h
// m_enemy2 = new Enemy(); // includet und eine Klasse Enemy erstellt werden, die von GameObject erbt
// m_enemy3 = new Enemy(); // (nicht im Buch)). Diese ist erstmal exakt aufgebaut, wie die Klasse Player
// --> Seite 58 --> Objekte Laden
// m_go->load(100, 100, 128, 82, "animate");
// m_player->load(300, 300, 128, 82, "animate");
// m_enemy->load(0, 0, 128, 82, "animate"); // --> wird erst auf Seite 59 hinzugefügt
// --> Die verschiedenen Gameobjekte werden in das Vektorarray geschoben
// m_gameObjects.push_back(m_go); // --> Seite 58
// m_gameObjects.push_back(m_player); // --> Seite 56 und 58 (wurde vom Autor versehentlich zweimal beschrieben)
// m_gameObjects.push_back(m_enemy); // --> wird erst auf Seite 59 hinzugefügt
// m_gameObjects.push_back(m_enemy1); // --> Seite 56
// m_gameObjects.push_back(m_enemy2); // --> Seite 56
// m_gameObjects.push_back(m_enemy3); // --> Seite 56
m_bRunning = true; // Initialisierungen waren alle erfolgreich
//Loop-Bool wird auf true gesetzt für die Spielschleife
return true;
} // Ende der Initialisierung
// --> Seite 56 --> neue eingeführte Funktion (es werden alle Objekte des Arrays
// durchlaufen und gemalt. Wichtig ist nur, das sie von Gameobject abstammen (Polymorphismus)
void Game::draw()
{
for (std::vector<GameObject*>::size_type i = 0; i !=
m_gameObjects.size(); i++)
{
m_gameObjects[i]->draw(); //SDL-Renderer-Parameter wurde auf Seite 63 herausgenommen
}
}
void Game::update()
{
// loop durch die Objekte und diese malen
for (std::vector<GameObject*>::size_type i = 0; i !=
m_gameObjects.size(); i++)
{
m_gameObjects[i]->update();
}
m_currentFrame = int(((SDL_GetTicks() / 100) % 6)); // --> Seite 45
// m_go.update(); --> wurde rausgenommen beim Kapitel Polymorphism(wurde allerdings auch wieder nicht im Buch erwähnt
// m_player.update(); --> kann aufgrund des gleichen Namens wie des eingeführten Zeigers auf Seite 56 so nicht mehr verwendet werden
}
void Game::render()
{
SDL_RenderClear(m_pRenderer); // lösche zur Hintergrundfarbe
// m_go.draw(m_pRenderer); // --> Seite 54 --> wurde rausgenommen beim Kapitel Polymorphism (wurde allerdings auch wieder nicht im Buch erwähnt
// m_player.draw(m_pRenderer); // --> Seite 54 --> kann aufgrund des gleichen Namens wie des eingeführten Zeigers auf Seite 56 so nicht mehr verwendet werden
// loop durch die Objekte und diese malen
for (std::vector<GameObject*>::size_type i = 0; i !=
m_gameObjects.size(); i++)
{
m_gameObjects[i]->draw(); // wird auf Seite 63 entfernt
}
SDL_RenderPresent(m_pRenderer);
}
// Dieser Handler ist im moment nur dazu da, damit man aus dem Programm aussteigen kann.
// Wenn man auf das X oben rechts im Fenster drückt.
void Game::handleEvents()
{
SDL_Event event;
if (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
m_bRunning = false;
break;
default:
break;
}
}
}
// Diese Funktion räumt unser Programm auf und schließt alle SDL-Initialisierungen.
void Game::clean()
{
IMG_Quit();
SDL_DestroyWindow(m_pWindow);
SDL_DestroyRenderer(m_pRenderer);
SDL_Quit();
}
GameObject.h
Code:
#include "Game.h"
#include <iostream>
using namespace std;
Game* Game::s_pInstance = 0; // --> Seite 64 (Es wird ein Zeiger auf die Singletoninstanz von Game initialisiert)
bool Game::init(const char* title, int xpos, int ypos, int width,
int height, bool fullscreen)
{
// SDL soll initialisiert werden
if (SDL_Init(SDL_INIT_EVERYTHING) == 0)
{
cout << "SDL wurde erfolgreich initialisiert" << endl;
// Zur unterscheidung zwischen Fullscreen oder Fenstermodus
int flags = 0;
if (fullscreen)
{
flags = SDL_WINDOW_FULLSCREEN;
}
// Fenster wird initialisiert
cout << "Fenster wird initialisiert" << endl;
m_pWindow = SDL_CreateWindow(title, xpos, ypos,
width, height, flags);
if (m_pWindow != 0) // Wenn Fensterinitialisierung erfolgreich wird der Renderer initialisiert
{
cout << "Fenster wurde erfolgreich initialisiert" << endl;
cout << "Renderer wird initialisiert" << endl;
m_pRenderer = SDL_CreateRenderer(m_pWindow, -1, 0);
if (m_pRenderer != 0) // Wenn die Rendererinitialisierung erfolgreich war
{
cout << "Renderer wurde erfolgreich initialisiert" << endl;
SDL_SetRenderDrawColor(m_pRenderer, // Hintergrundfarbe wird gesetzt (RGB/A)
255, 0, 0, 255);
if ((IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG) != IMG_INIT_PNG)
{
SDL_Quit();
return 1;
}
else
{
cout << "IMG_Init wurde erfolgreich mit PNG - Format initialisiert" << endl;
}
}
else
{
return false; // Rendererinitialisierung fehlgeschlagen
}
}
else
{
return false; // Fensterinitialisierung fehlgeschlagen
}
}
else
{
return false; // SDLinitialisierung fehlgeschlagen
}
cout << "Alles initialisiert" << endl;
if (!TheTextureManager::Instance()->load("Data/animate-alpha.png",
"animate", m_pRenderer))
{
return false;
cout << "Fehler beim Datei Laden" << endl;
}
m_gameObjects.push_back(new Player(new LoaderParams(100, 100, 128, 82, "animate")));
m_gameObjects.push_back(new Enemy(new LoaderParams(300, 300, 128, 82, "animate")));
// m_go = new GameObject(); // --> Seite 58
// m_player = new Player(); // --> Seite 56 und 58 (wurde vom Autor versehentlich zweimal beschrieben)
// m_enemy = new Enemy(); // --> wird erst auf Seite 59 hinzugefügt
// m_enemy1 = new Enemy(); // --> Seite 56 (Zuvor muss aber erst eine Enemy.h erstellt werden, in Game.h
// m_enemy2 = new Enemy(); // includet und eine Klasse Enemy erstellt werden, die von GameObject erbt
// m_enemy3 = new Enemy(); // (nicht im Buch)). Diese ist erstmal exakt aufgebaut, wie die Klasse Player
// --> Seite 58 --> Objekte Laden
// m_go->load(100, 100, 128, 82, "animate");
// m_player->load(300, 300, 128, 82, "animate");
// m_enemy->load(0, 0, 128, 82, "animate"); // --> wird erst auf Seite 59 hinzugefügt
// --> Die verschiedenen Gameobjekte werden in das Vektorarray geschoben
// m_gameObjects.push_back(m_go); // --> Seite 58
// m_gameObjects.push_back(m_player); // --> Seite 56 und 58 (wurde vom Autor versehentlich zweimal beschrieben)
// m_gameObjects.push_back(m_enemy); // --> wird erst auf Seite 59 hinzugefügt
// m_gameObjects.push_back(m_enemy1); // --> Seite 56
// m_gameObjects.push_back(m_enemy2); // --> Seite 56
// m_gameObjects.push_back(m_enemy3); // --> Seite 56
m_bRunning = true; // Initialisierungen waren alle erfolgreich
//Loop-Bool wird auf true gesetzt für die Spielschleife
return true;
} // Ende der Initialisierung
// --> Seite 56 --> neue eingeführte Funktion (es werden alle Objekte des Arrays
// durchlaufen und gemalt. Wichtig ist nur, das sie von Gameobject abstammen (Polymorphismus)
void Game::draw()
{
for (std::vector<GameObject*>::size_type i = 0; i !=
m_gameObjects.size(); i++)
{
m_gameObjects[i]->draw(); //SDL-Renderer-Parameter wurde auf Seite 63 herausgenommen
}
}
void Game::update()
{
// loop durch die Objekte und diese malen
for (std::vector<GameObject*>::size_type i = 0; i !=
m_gameObjects.size(); i++)
{
m_gameObjects[i]->update();
}
m_currentFrame = int(((SDL_GetTicks() / 100) % 6)); // --> Seite 45
// m_go.update(); --> wurde rausgenommen beim Kapitel Polymorphism(wurde allerdings auch wieder nicht im Buch erwähnt
// m_player.update(); --> kann aufgrund des gleichen Namens wie des eingeführten Zeigers auf Seite 56 so nicht mehr verwendet werden
}
void Game::render()
{
SDL_RenderClear(m_pRenderer); // lösche zur Hintergrundfarbe
// m_go.draw(m_pRenderer); // --> Seite 54 --> wurde rausgenommen beim Kapitel Polymorphism (wurde allerdings auch wieder nicht im Buch erwähnt
// m_player.draw(m_pRenderer); // --> Seite 54 --> kann aufgrund des gleichen Namens wie des eingeführten Zeigers auf Seite 56 so nicht mehr verwendet werden
// loop durch die Objekte und diese malen
for (std::vector<GameObject*>::size_type i = 0; i !=
m_gameObjects.size(); i++)
{
m_gameObjects[i]->draw(); // wird auf Seite 63 entfernt
}
SDL_RenderPresent(m_pRenderer);
}
// Dieser Handler ist im moment nur dazu da, damit man aus dem Programm aussteigen kann.
// Wenn man auf das X oben rechts im Fenster drückt.
void Game::handleEvents()
{
SDL_Event event;
if (SDL_PollEvent(&event))
{
switch (event.type)
{
case SDL_QUIT:
m_bRunning = false;
break;
default:
break;
}
}
}
// Diese Funktion räumt unser Programm auf und schließt alle SDL-Initialisierungen.
void Game::clean()
{
IMG_Quit();
SDL_DestroyWindow(m_pWindow);
SDL_DestroyRenderer(m_pRenderer);
SDL_Quit();
}
GameObject.cpp
Code:
//#include "GameObject.h"
//
//void GameObject::load(int x, int y, int width, int height, std::string
// textureID)
//{
// m_x = x;
// m_y = y;
// m_width = width;
// m_height = height;
// m_textureID = textureID;
// m_currentRow = 1;
// m_currentFrame = 1;
//}
//
//void GameObject::draw(SDL_Renderer* pRenderer)
//{
// TextureManager::Instance()->drawFrame(
// m_textureID,
// m_x,
// m_y,
// m_width,
// m_height,
// m_currentRow,
// m_currentFrame,
// pRenderer);
//}
//
//void GameObject::update()
//{
// m_x += 1;
// m_currentFrame = int(((SDL_GetTicks() / 100) % 6)); // --> Seite 45 wurde dies bei Game::update eingefügt. Aber später vergessen
// // in die Klasse GameObject mit zu übernehmen. Somit fand keine Animation
// // von "GameObject m_go" statt. Im Gegensatz wird die Animation von
// // "Player m_player" in Player::Update realisiert, da es ein Objekt der
// // Kindklasse "Player" ist und nicht direkt von GameObjekt instanziiert
// // wurde. Leider wurde dies im Buch völlig vergessen, so dass keine
// // Animation zu sehen war.
//}
//
SDLGameObject.h
Code:
//SDLGameObject.h --> wird auf Seite 65 erzeugt
// erbt von GameObject
#include "GameObject.h" // --> im Buch nicht erwähnt
#include "LoaderParams.h" // --> im Buch nicht erwähnt
class SDLGameObject : public GameObject
{
public:
SDLGameObject(){}
SDLGameObject(const LoaderParams* pParams);
virtual void draw();
virtual void update();
virtual void clean();
protected:
int m_x;
int m_y;
int m_width;
int m_height;
int m_currentRow;
int m_currentFrame;
std::string m_textureID;
};
SDLGameObject.cpp
Code:
#include "SDLGameObject.h"
#include "LoaderParams.h"
#include "Game.h"
SDLGameObject::SDLGameObject(const LoaderParams* pParams) :
GameObject(pParams)
{
m_x = pParams->getX();
m_y = pParams->getY();
m_width = pParams->getWidth();
m_height = pParams->getHeight();
m_textureID = pParams->getTextureID();
m_currentRow = 1;
m_currentFrame = 1;
}
void SDLGameObject::draw()
{
TextureManager::Instance()->drawFrame(m_textureID, m_x, m_y,
m_width, m_height, m_currentRow, m_currentFrame,
TheGame::Instance()->getRenderer());
}
TextureManager.h
Code:
#ifndef __TextureManager__
#define __TextureManager__
#include <iostream> // --> im Buch nicht erwähnt
#include <string> // --> im Buch nicht erwähnt
#include <map> // --> im Buch nicht erwähnt
#include "SDL.h" // --> im Buch nicht erwähnt
class TextureManager
{
public:
// --> eingeführt --> Seite 42
bool load( // Funktion zum Laden der Grafikdatei
std::string fileName, //Filename
std::string id, //ID- der zu Rendernden Texture
SDL_Renderer* pRenderer); //verwendeter Renderer
// draw --> eingeführt --> Seite 42
void draw( // Funktion zum Malen eines feststehenden Frames auf den virtuellen Bildschirm
std::string id, //ID- der zu Rendernden Texture
int x, // Destination-X
int y, // Destination-Y
int width, // Die Breite des zu benutzenden Frames
int height, // Die Höhe des zu benutzenden Frames
SDL_Renderer* pRenderer, // Der zu benutzende Renderer
SDL_RendererFlip flip = SDL_FLIP_NONE); // Flag zur Angabe, ob das Frame gespiegelt werden soll
// drawframe --> eingeführt --> Seite 42
void drawFrame(std::string id, int x, int y, int width, int
height, int currentRow, int currentFrame, SDL_Renderer*
pRenderer, SDL_RendererFlip flip = SDL_FLIP_NONE);
// Funktion zur erzeugung der Singelton-Klasse des Texturemanagers --> Seite 46
// Nur wenn noch keine Instanz des Texturemanagers exisitiert, wird eine erzeugt. Ansonsten
// wird die bereits erzeugte zurück gegeben.
static TextureManager* Instance()
{
if (s_pInstance == 0)
{
s_pInstance = new TextureManager();
return s_pInstance;
}
return s_pInstance;
}
private:
TextureManager() {} // --> Um den Texturemanager zu einem Singelton zu machen wird zuerst der Konstruktor
// von public zu privat verschoben, somit kann er nur über die Instancefunction
// aufgerufen werden --> Seite 46
~TextureManager() {} // --> im Buch nicht erwähnt
static TextureManager* s_pInstance; // --> im Buch nicht erwähnt, aber notwendig S.46
// --> eingeführt --> Seite 42
std::map<std::string, SDL_Texture*> m_textureMap; // Ein container der unsere zu Rendernden Objekte enthält.
// gespeichert wird immer ein Wertepaar. Die Objektreferenz
// und ein eindeutiger Schlüssel (ID)
// Speicherart ist üblicherweise ein Red-Black-Tree,
// ein selbstregulierender binärer Suchbaum.
};
typedef TextureManager TheTextureManager; // --> Seite 46 --> Hier wird ein Aliasname vergeben und überall,
// wo man Texturemanager schreiben müsste, kann man
// jetzt genauso TheTextureManager schreiben --> neu zu Texturemanager goes Singelton
#endif
TextureManager.cpp
Code:
#include "TextureManager.h"
#include "SDL_image.h"
#include "SDL.h"
TextureManager* TextureManager::s_pInstance = 0; // --> eingeführt S.46
// --> eingeführt --> Seite 43
bool TextureManager::load( //Funktion zum Laden der Grafikdatei und zum zuordnen einer ID in unserem red-black-tree-container (map)
std::string fileName, // Filename
std::string id, // zugeordnete FileID im red-black-tree
SDL_Renderer* pRenderer) // zu verwendender Renderer
{
SDL_Surface* pTempSurface = IMG_Load(fileName.c_str()); // File wird geladen und ist unter dem Zeiger pTempSurface zu erreichen
if (pTempSurface == 0) // Wenn nicht ladbar
{
std::cout << IMG_GetError(); // Gebe Fehler aus
return false;
}
SDL_Texture* pTexture = // erstelle Zeiger auf ein Texture-Objekt
SDL_CreateTextureFromSurface(pRenderer, pTempSurface); // erstelle das Texture-Objekt, das dem Zeiger pTexture zugeordnet wird
SDL_FreeSurface(pTempSurface);
// Datei wurde Ordnungsgemäß geladen und wird nachfolgend unserem red-black-tree-container hinzugefügt
if (pTexture != 0)
{
m_textureMap[id] = pTexture;
return true;
}
// Wenn nicht geladen werden konnte
return false;
}
// --> eingeführt --> Seite 43
void TextureManager::draw( // Funktion zum Malen eines feststehenden Frames auf den virtuellen Bildschirm
std::string id, //ID- der zu Rendernden Texture
int x, // Destination-X
int y, // Destination-Y
int width, // Die Breite des zu benutzenden Frames
int height, // Die Höhe des zu benutzenden Frames
SDL_Renderer* pRenderer, // Der zu benutzende Renderer
SDL_RendererFlip flip) // Flag zur Angabe, ob das Frame gespiegelt werden soll
{
SDL_Rect srcRect; // Quell-Viereck wird erstellt
SDL_Rect destRect; // Ziel-Viereck wird erstellt
srcRect.x = 0; // x-Position des oberen linken Ecks des Quellrechtecks
srcRect.y = 0; // y-Position des oberen linken Ecks des Quellrechtecks
srcRect.w = destRect.w = width; // Breite des Quell- und Ziel-Rechtecks
srcRect.h = destRect.h = height; // Höhe des Quell- und Ziel-Rechtecks
destRect.x = x; // x-Position des oberen linken Ecks des Zielrechtecks auf dem virtuellen Bildschirm
destRect.y = y; // x-Position des oberen linken Ecks des Zielrechtecks auf dem virtuellen Bildschirm
SDL_RenderCopyEx( // Zu verwendender Renderer
pRenderer,
m_textureMap[id], // ID des Grafikobjekts
&srcRect, // Zeiger auf Quell-Rechteck
&destRect, // Zeiger auf Ziel-Rechteck
0,
0,
flip);
}
// --> eingeführt --> Seite 44
void TextureManager::drawFrame(
std::string id, //ID- der zu Rendernden Texture
int x, // Destination-X
int y, // Destination-Y
int width, // Die Breite des zu benutzenden Frames
int height, // Die Höhe des zu benutzenden Frames
int currentRow, // Reihe des zu Rendernden Frames in Source-Grafik-Datei --> Unterschied zum feststehenden Frame
int currentFrame, // Spalte (das wievielte Frame in der Reihe) des zu Rendernden Frames in Source-Grafik-Datei --> Unterschied zum feststehenden Frame
SDL_Renderer *pRenderer,
SDL_RendererFlip flip)
{
SDL_Rect srcRect; // Quell-Viereck wird erstellt
SDL_Rect destRect; // Ziel-Viereck wird erstellt
srcRect.x = width * currentFrame; // x-Position des oberen linken Ecks des Quellrechtecks --> Unterschied zum feststehenden Frame
srcRect.y = height * (currentRow - 1); // y-Position des oberen linken Ecks des Quellrechtecks --> Unterschied zum feststehenden Frame
srcRect.w = destRect.w = width; // Breite des Quell- und Ziel-Rechtecks
srcRect.h = destRect.h = height; // Höhe des Quell- und Ziel-Rechtecks
destRect.x = x; // x-Position des oberen linken Ecks des Zielrechtecks auf dem virtuellen Bildschirm
destRect.y = y; // x-Position des oberen linken Ecks des Zielrechtecks auf dem virtuellen Bildschirm
SDL_RenderCopyEx( // Zu verwendender Renderer
pRenderer,
m_textureMap[id], // ID des Grafikobjekts
&srcRect, // Zeiger auf Quell-Rechteck
&destRect, // Zeiger auf Ziel-Rechteck
0,
0,
flip);
}
Player.h
Code:
#ifndef __Player__
#define __Player__
// Player.h
// abgeleitet (derived) von GameObject
#include <iostream> // im Buch nicht erwähnt, aber nötig wegen cout
#include "SDLGameObject.h" // im Buch nicht erwähnt aber notwendig, da sonst nicht von GameObject geerbt werden kann
class Player : public SDLGameObject // inherit from GameObject
{
public:
Player(){}
~Player(){}
Player(const LoaderParams* pParams); // --> Seite 66
void load(int x, int y, int width, int height, std::string
textureID);
virtual void draw(); // --> Seite 66
virtual void update(); // --> Seite 66
virtual void clean(); // --> Seite 66
};
#endif /* defined(Player) */
Player.cpp
Code:
#include "Player.h"
// --> Wird auf Seite 66/67 komplett ersetzt
Player::Player(const LoaderParams* pParams) :
SDLGameObject(pParams)
{
}
void Player::draw()
{
SDLGameObject::draw(); // nun wird das SDL GameObject genutzt
}
void Player::update()
{
m_x -= 1;
m_currentFrame = int(((SDL_GetTicks() / 100) % 6));
}
void Player::clean()
{
}
Enemy.h
Code:
#ifndef __Enemy__
#define __Enemy__
// Enemy.h
// abgeleitet (derived) von GameObject
#include <iostream> // im Buch nicht erwähnt, aber nötig wegen cout
#include "SDLGameObject.h" // im Buch nicht erwähnt aber notwendig, da sonst nicht von GameObject geerbt werden kann
class Enemy : public SDLGameObject // inherit from GameObject
{
public:
Enemy(){}
~Enemy(){}
Enemy(const LoaderParams* pParams); // --> Seite 66
void load(int x, int y, int width, int height, std::string
textureID);
virtual void draw(); // --> Seite 66
virtual void update(); // --> Seite 66
virtual void clean(); // --> Seite 66
};
#endif /* defined(__Enemy__) */
Enemy.cpp
Code:
#include "Enemy.h"
// --> Wird auf Seite 66/67 komplett ersetzt
Enemy::Enemy(const LoaderParams* pParams) :
SDLGameObject(pParams)
{
}
void Enemy::draw()
{
SDLGameObject::draw(); // nun wird das SDL GameObject genutzt
}
void Enemy::update()
{
m_x -= 1;
m_currentFrame = int(((SDL_GetTicks() / 100) % 6));
}
void Enemy::clean()
{
}
LoaderParams.h
Code:
#ifndef __LoaderParams__
#define __LoaderParams__
//LoaderParamsd.h
#include <iostream>
using namespace std;
class LoaderParams
{
public:
// LoaderParams(){}
~LoaderParams(){}
// Konstruktor
LoaderParams(int x, int y, int width, int height, std::string textureID) :
// Werte die an den Konstruktor übergeben werden da von doppelpunkt gefolgt. s.o.
m_x(x), m_y(y), m_width(width), m_height(height), m_textureID(textureID)
{
}
int getX() const { return m_x; }
int getY() const { return m_y; }
int getWidth() const { return m_width; }
int getHeight() const { return m_height; }
string getTextureID() const { return m_textureID; }
private:
int m_x;
int m_y;
int m_width;
int m_height;
std::string m_textureID;
};
#endif
So.. Thats all.. And I´m really confused about my own Code *lol.. like I said.. I am a newbee and so please forgive me stupid mistakes you will find :-)..
Best Regards
Thomas Klaes