Fundamental framework for an SDL application
This commit is contained in:
commit
27c6f1e0b6
51
drawutils.cpp
Normal file
51
drawutils.cpp
Normal file
|
@ -0,0 +1,51 @@
|
|||
#include "drawutils.h"
|
||||
|
||||
SDL_Surface* DrawUtils::load(string file)
|
||||
{
|
||||
SDL_Surface* raw = NULL;
|
||||
SDL_Surface* cooked = NULL;
|
||||
|
||||
raw = SDL_LoadBMP(file.c_str());
|
||||
if (raw == NULL) return NULL;
|
||||
|
||||
cooked = SDL_DisplayFormat(raw);
|
||||
SDL_FreeSurface(raw); // don't consume raw surfaces
|
||||
|
||||
return cooked;
|
||||
}
|
||||
|
||||
|
||||
bool DrawUtils::draw(SDL_Surface* dest, SDL_Surface* drawable, int x, int y)
|
||||
{
|
||||
if (dest == NULL || drawable == NULL) return false;
|
||||
|
||||
SDL_Rect dest_r;
|
||||
|
||||
dest_r.x = x;
|
||||
dest_r.y = y;
|
||||
|
||||
SDL_BlitSurface(drawable, NULL, dest, &dest_r);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
bool DrawUtils::draw(SDL_Surface* dest, SDL_Surface* drawable, int x, int y,
|
||||
int x2, int y2, int w, int h)
|
||||
{
|
||||
SDL_Rect dest_r;
|
||||
|
||||
dest_r.x = x;
|
||||
dest_r.y = y;
|
||||
|
||||
SDL_Rect src_r;
|
||||
|
||||
src_r.x = x2;
|
||||
src_r.y = y2;
|
||||
src_r.w = w;
|
||||
src_r.h = h;
|
||||
|
||||
SDL_BlitSurface(drawable, &src_r, dest, &dest_r);
|
||||
|
||||
return true;
|
||||
}
|
21
drawutils.h
Normal file
21
drawutils.h
Normal file
|
@ -0,0 +1,21 @@
|
|||
/* A class with some handy surface handling statics */
|
||||
|
||||
#ifndef _DRAWUTILS_H_
|
||||
#define _DRAWUTILS_H_
|
||||
|
||||
#include <SDL/SDL.h>
|
||||
#include <string>
|
||||
|
||||
using std::string;
|
||||
|
||||
class DrawUtils
|
||||
{
|
||||
public:
|
||||
DrawUtils() {}
|
||||
static SDL_Surface* load(string file);
|
||||
static bool draw(SDL_Surface* dest, SDL_Surface* drawable, int x, int y);
|
||||
static bool draw(SDL_Surface* dest, SDL_Surface* drawable, int x, int y,
|
||||
int x2, int y2, int w, int h);
|
||||
};
|
||||
|
||||
#endif
|
73
gamecore.cpp
Normal file
73
gamecore.cpp
Normal file
|
@ -0,0 +1,73 @@
|
|||
#include "gamecore.h"
|
||||
#include "drawutils.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
#include <iostream>
|
||||
#endif
|
||||
|
||||
GameCore::GameCore()
|
||||
{
|
||||
display = NULL;
|
||||
is_running = true;
|
||||
}
|
||||
|
||||
int GameCore::execute()
|
||||
{
|
||||
if (!init()) return 1;
|
||||
|
||||
SDL_Event event;
|
||||
|
||||
while (is_running)
|
||||
{
|
||||
while(SDL_PollEvent(&event))
|
||||
handle_event(&event);
|
||||
iterate();
|
||||
render();
|
||||
}
|
||||
|
||||
cleanup();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
bool GameCore::init()
|
||||
{
|
||||
if (SDL_Init(SDL_INIT_EVERYTHING) < 0) return false;
|
||||
|
||||
display = SDL_SetVideoMode(800,600,32, SDL_HWSURFACE | SDL_DOUBLEBUF);
|
||||
if (display == NULL)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
std::cerr << "GameCore::init(): error: Couldn't create main surface\n";
|
||||
#endif
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
void GameCore::render()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
void GameCore::iterate()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
void GameCore::cleanup()
|
||||
{
|
||||
SDL_FreeSurface(display);
|
||||
SDL_Quit();
|
||||
}
|
||||
|
||||
|
||||
void GameCore::on_exit()
|
||||
{
|
||||
is_running = false;
|
||||
}
|
38
gamecore.h
Normal file
38
gamecore.h
Normal file
|
@ -0,0 +1,38 @@
|
|||
/* This is the heart of the application.
|
||||
This contains the basic game looping code, sets up event handlers, etc.
|
||||
|
||||
All the hard work will eventually get farmed out to other objects, for now,
|
||||
we're doing almost everything in here.
|
||||
*/
|
||||
|
||||
|
||||
#ifndef _GAME_CORE_H_
|
||||
#define _GAME_CORE_H_
|
||||
|
||||
#include <SDL/SDL.h>
|
||||
#include "mainevent.h"
|
||||
|
||||
class GameCore : public MainEvent
|
||||
{
|
||||
public:
|
||||
GameCore();
|
||||
int execute();
|
||||
|
||||
protected:
|
||||
// event handlers
|
||||
void on_exit();
|
||||
|
||||
|
||||
private:
|
||||
bool init();
|
||||
|
||||
void iterate(); // updates the game state
|
||||
void render();
|
||||
void cleanup();
|
||||
|
||||
bool is_running;
|
||||
|
||||
SDL_Surface* display;
|
||||
};
|
||||
|
||||
#endif
|
9
main.cpp
Normal file
9
main.cpp
Normal file
|
@ -0,0 +1,9 @@
|
|||
/* Do basic initialization, get the loop going */
|
||||
|
||||
#include "gamecore.h"
|
||||
|
||||
int main()
|
||||
{
|
||||
GameCore game_core;
|
||||
return game_core.execute();
|
||||
}
|
108
mainevent.cpp
Normal file
108
mainevent.cpp
Normal file
|
@ -0,0 +1,108 @@
|
|||
#include "mainevent.h"
|
||||
|
||||
void MainEvent::handle_event(SDL_Event* event)
|
||||
{
|
||||
switch(event->type)
|
||||
{
|
||||
// Interactions with the WM
|
||||
case SDL_ACTIVEEVENT:
|
||||
switch (event->active.state)
|
||||
{
|
||||
case SDL_APPMOUSEFOCUS:
|
||||
if (event->active.gain) on_mouse_focus();
|
||||
else on_mouse_blur();
|
||||
break;
|
||||
case SDL_APPINPUTFOCUS:
|
||||
if (event->active.gain) on_input_focus();
|
||||
else on_input_blur();
|
||||
break;
|
||||
case SDL_APPACTIVE:
|
||||
if (event->active.gain) on_restore();
|
||||
else on_minimize();
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
// keyboard keypresses
|
||||
case SDL_KEYDOWN:
|
||||
on_key_down(event->key.keysym.sym, event->key.keysym.mod,
|
||||
event->key.keysym.unicode);
|
||||
break;
|
||||
case SDL_KEYUP:
|
||||
on_key_up(event->key.keysym.sym, event->key.keysym.mod,
|
||||
event->key.keysym.unicode);
|
||||
break;
|
||||
|
||||
// mouse events
|
||||
case SDL_MOUSEMOTION:
|
||||
on_mouse_move(event->motion.x, event->motion.y, event->motion.xrel,
|
||||
event->motion.yrel,
|
||||
event->motion.state & SDL_BUTTON(SDL_BUTTON_LEFT),
|
||||
event->motion.state & SDL_BUTTON(SDL_BUTTON_RIGHT),
|
||||
event->motion.state & SDL_BUTTON(SDL_BUTTON_MIDDLE));
|
||||
break;
|
||||
case SDL_MOUSEBUTTONDOWN:
|
||||
switch(event->button.button)
|
||||
{
|
||||
case SDL_BUTTON_LEFT:
|
||||
on_lbutton_down(event->button.x, event->button.y);
|
||||
break;
|
||||
case SDL_BUTTON_RIGHT:
|
||||
on_rbutton_down(event->button.x, event->button.y);
|
||||
break;
|
||||
case SDL_BUTTON_MIDDLE:
|
||||
on_mbutton_down(event->button.x, event->button.y);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case SDL_MOUSEBUTTONUP:
|
||||
switch(event->button.button)
|
||||
{
|
||||
case SDL_BUTTON_LEFT:
|
||||
on_lbutton_up(event->button.x, event->button.y);
|
||||
break;
|
||||
case SDL_BUTTON_RIGHT:
|
||||
on_rbutton_up(event->button.x, event->button.y);
|
||||
break;
|
||||
case SDL_BUTTON_MIDDLE:
|
||||
on_mbutton_up(event->button.x, event->button.y);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
// joystick events
|
||||
case SDL_JOYAXISMOTION:
|
||||
on_joy_axis(event->jaxis.which, event->jaxis.axis, event->jaxis.value);
|
||||
break;
|
||||
case SDL_JOYBALLMOTION:
|
||||
on_joy_ball(event->jball.which, event->jball.ball, event->jball.xrel,
|
||||
event->jball.yrel);
|
||||
break;
|
||||
case SDL_JOYHATMOTION:
|
||||
on_joy_hat(event->jhat.which, event->jhat.hat, event->jhat.value);
|
||||
break;
|
||||
case SDL_JOYBUTTONDOWN:
|
||||
on_joy_button_down(event->jbutton.which, event->jbutton.button);
|
||||
break;
|
||||
case SDL_JOYBUTTONUP:
|
||||
on_joy_button_up(event->jbutton.which, event->jbutton.button);
|
||||
break;
|
||||
|
||||
// Other events
|
||||
case SDL_QUIT:
|
||||
on_exit();
|
||||
break;
|
||||
|
||||
case SDL_VIDEORESIZE:
|
||||
on_resize(event->resize.w, event->resize.h);
|
||||
break;
|
||||
|
||||
case SDL_VIDEOEXPOSE:
|
||||
on_expose();
|
||||
break;
|
||||
|
||||
default:
|
||||
on_user(event->user.type, event->user.code, event->user.data1,
|
||||
event->user.data2);
|
||||
}
|
||||
} // handle_event
|
59
mainevent.h
Normal file
59
mainevent.h
Normal file
|
@ -0,0 +1,59 @@
|
|||
/*
|
||||
The core class for event handling - sets up the logic for calling those
|
||||
handlers as needed via handle_event (which
|
||||
should be called by the class using us, which is likely a subclass).
|
||||
the actual handlers are all virtual - please define the ones you need
|
||||
|
||||
It is a mystery to me why this class doesn't already exist in SDL...
|
||||
*/
|
||||
|
||||
#ifndef _MAINEVENT_H_
|
||||
#define _MAINEVENT_H_
|
||||
|
||||
#include <SDL/SDL.h>
|
||||
|
||||
class MainEvent
|
||||
{
|
||||
public:
|
||||
MainEvent() {}
|
||||
virtual ~MainEvent() {}
|
||||
|
||||
protected:
|
||||
virtual void handle_event(SDL_Event* event);
|
||||
|
||||
virtual void on_input_focus() {}
|
||||
virtual void on_input_blur() {}
|
||||
|
||||
virtual void on_key_down(SDLKey sym, SDLMod mod, Uint16 unicode) {}
|
||||
virtual void on_key_up(SDLKey sym, SDLMod mod, Uint16 unicode) {}
|
||||
|
||||
virtual void on_mouse_focus() {}
|
||||
virtual void on_mouse_blur() {}
|
||||
virtual void on_mouse_move(int mX, int mY, int relX, int relY, bool left, bool right, bool middle) {}
|
||||
virtual void on_mouse_wheel(bool up, bool down) {}
|
||||
virtual void on_lbutton_down(int mX, int mY) {}
|
||||
virtual void on_lbutton_up(int mX, int mY) {}
|
||||
virtual void on_mbutton_down(int mX, int mY) {}
|
||||
virtual void on_mbutton_up(int mX, int mY) {}
|
||||
virtual void on_rbutton_down(int mX, int mY) {}
|
||||
virtual void on_rbutton_up(int mX, int mY) {}
|
||||
|
||||
virtual void on_joy_axis(Uint8 which, Uint8 axis, Sint16 value) {}
|
||||
virtual void on_joy_button_down(Uint8 which, Uint8 button) {}
|
||||
virtual void on_joy_button_up(Uint8 which, Uint8 button) {}
|
||||
virtual void on_joy_hat(Uint8 which, Uint8 hat, Uint8 value) {}
|
||||
virtual void on_joy_ball(Uint8 which, Uint8 ball, Sint16 xrel,
|
||||
Sint16 yrel) {}
|
||||
|
||||
virtual void on_minimize() {}
|
||||
virtual void on_restore() {}
|
||||
virtual void on_resize(int w,int h) {}
|
||||
|
||||
virtual void on_expose() {}
|
||||
|
||||
virtual void on_exit() {}
|
||||
|
||||
virtual void on_user(Uint8 type, int code, void* data1, void* data2) {}
|
||||
};
|
||||
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user