Application Crashing when trying to render player object

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 ?

You should allocate a new renderRect in the PlayerObject constructor (and delete it in the destructor). That’s likely the cause of the crash. A debugger would point that out too.

1 Like

Yup, im not good at using debugging tools,it was showing memory access violation so i did some google search which also indicated pointers to be causing issue but i managed to ultimately make it work by changing everything into an object rather than a pointer to object, still this answer helped me alot to narrow down topics i need to master over :slight_smile: Thanks for reply