Okay, im new to SDL, and was trying to understand workflow, I want to render a rectangle on the screen and for that purpose i started by dividing my project into header files and implementation files, overall following src files exists
- Game.cpp
- PlayerObject.cpp
- main.cpp
and Following Header Files (implementations) - Game.h
- PlayerObject.h
The code in main.cpp looks like this :
#include<SDL2/SDL.h>
#include<Game.h>
using namespace std;
int SDL_main(int argc, char* argv[])
{
Game *game=new Game;
game->init("LOL");
while( game->isRunning )
{
game->handleEvent();
game->update();
game->render();
SDL_Delay(1);
}
game->clean();
delete game;
return 0;
}
The code in Game.h (header file) looks like this :
#ifndef GAME_H
#define GAME_H
#include "PlayerObject.h"
#include<SDL2/SDL.h>
class Game
{
public:
bool isRunning;
int init(char*);
void handleEvent();
void render();
void update();
void clean();
Game();
protected:
private:
PlayerObject *player;
int red,green,blue;
SDL_Window *window;
SDL_Renderer *renderer;
SDL_Rect *background_color;
};
#endif // GAME_H
The Code in PlayerObject.h looks like this
#ifndef PLAYEROBJECT_H
#define PLAYEROBJECT_H
#include<SDL2/SDL.h>
class PlayerObject
{
public:
PlayerObject();
PlayerObject(int,int);
void render(SDL_Renderer*);
void update(int,int);
private:
int xpos;
int ypos;
SDL_Rect *renderRect;
};
#endif // PLAYEROBJECT_H
and now, for implementation of these,
Code inside PlayerObject.cpp is as follow
#include "PlayerObject.h"
#include<iostream>
PlayerObject::PlayerObject()
{
xpos=0;
ypos=0;
renderRect->x=xpos;
renderRect->y=ypos;
renderRect->w=10;
renderRect->h=10;
}
PlayerObject::PlayerObject(int X,int Y)
{
renderRect->w=10;
renderRect->h=10;
renderRect->x=xpos=X;
renderRect->y=ypos=Y;
}
void PlayerObject::update(int X,int Y)
{
renderRect->x=xpos=X;
renderRect->y=ypos=Y;
}
void PlayerObject::render(SDL_Renderer *renderer)
{
SDL_RenderFillRect(renderer,renderRect);
}
and finally, code inside Game.cpp is
#include "Game.h"
#include<iostream>
#include<SDL2/SDL.h>
#include "PlayerObject.h"
using namespace std;
Game::Game()
{
player=nullptr;
isRunning=false;
red=green=blue=0;
}
int Game::init(char*title)
{
window = SDL_CreateWindow(title,100,100,500,500,SDL_WINDOW_RESIZABLE);
if(window==NULL)
{
cout<<"Failed to Initialize Window in Game object\n"<<SDL_GetError();
return 0;
}
renderer = SDL_CreateRenderer(window,-1,SDL_RENDERER_ACCELERATED);//hardware accelerated
if(renderer==NULL)
{
cout<<"Unable to Create Renderer for window in Game Object \n"<<SDL_GetError();
return 0;
}
cout<<"Initialize Successful\n";
isRunning=true;
player=new PlayerObject;
return 1;//init completed without errors
}
void Game::handleEvent()
{
cout<<"HandleEvent Called\n";
SDL_Event evt;
if(SDL_PollEvent(&evt))
{
switch(evt.type)
{
case SDL_QUIT:
isRunning=false;
cout<<" QUIT EVENT \n";
break;
default:
break;
}
}
}
void Game::render()
{
SDL_RenderClear(renderer);
SDL_RenderFillRect(renderer,background_color);
SDL_SetRenderDrawColor(renderer,255,0,0,4);
player->render(renderer);
SDL_RenderPresent(renderer); //presenting result onto the Display
}
void Game::update()
{
//mod 1000 to make sure values remain in range of int
player->update(20,20);
cout<<"UPDATING\n";
}
void Game::clean()
{
delete player;
player=nullptr;
}
okay, now my objective is to have a seperate class “PlayerObject” that i can use to create player objects, so if i create object say, “player”, i should be able to render a rectangular player by just calling render() method of PlayerObject class from my Game object’s render() method,
note that player object is constructed inside Game class, when i run my program , i notice that everything is initialized properly, but once message “Initialize Successful” is printed, the application pauses and afterwards, it crashes (using Windows 7 32bit, and codeblocks as ide),
saying “SDLPRACTICE.exe has stopped working” (the very common application crash error)
why this error occurs only when i try to seperate Rendering of rectangles into PlayerObject class’s methods ?