Overview
Examples
Screenshots
Comparisons
Applications
Download
Documentation
Tutorials
Bazaar
Status & Roadmap
FAQ
Authors & License
Forums
Funding Ultimate++
Search on this site













SourceForge.net Logo

SDLExample

 

SDL demo example

Description

The example shows the usage of SDL library inside TheIDE.

More information about SDL can be found on the library official site.

Result

 

 

 

main.cpp

 

#include <Core/Core.h>

 

using namespace Upp;

 

#ifdef COMPILER_MSC

#include <SDL.h>

#endif

#ifdef COMPILER_GCC

#include <SDL/SDL.h>

#endif

 

const int maxpoint  = 1000;

const int maxscroll = 7;

const int width  = 640;

const int height = 480;

const int bpp    = 8;

 

struct ScreenPoint

{

    int x, y;

    int sx, sy;

    int col;

};

 

struct ScreenFont

{

int x0, y0;

int x1, y1;

};

 

double sintab[width];

 

SDL_Surface *fntbmp;

 

const char * scroll[]=

{

    "ULTIMATE++",

    "WHEN PROGRAMMING",

    "IS FUN",

    "THIS IS A SIMPLE",

    "SDL DEMO",

    "CODED BY UNO",

    "ENJOY THE SCROLL"

};

 

const ScreenFont fntdef[] =

{

    { 0,0,32,51 }, { 35,0,65,51 }, { 71,0,101,52 }, { 107,0,137,51 }, { 143,0,167,51 }, { 171,0,192,51, },

    { 197,0,227,52 }, { 233,0,264,51 }, { 270,0,283,51 }, { 288,0,305,51 }, { 311,0,343,51, },

    { 346,0,367,51 }, { 371,0,412,51 }, { 0,58,30,109 }, { 36,58,66,110 }, { 72,58,100,109, },

    { 105,58,135,115 }, { 141,58,170,109 }, { 175,58,205,110 }, { 208,58,237,109, },

    { 241,58,271,110 }, { 274,58,308,109 }, { 310,58,361,109 }, { 362,58,393,109, },

    { 394,58,424,109 }, { 426,58,449,109, },

    { /* 0 */ },

    { 0,120,29,172 }, { 33,120,54,171 }, { 60,120,86,171 }, { 93,120,122,172, },

    { 126,120,157,171 }, { 162,120,190,172 }, { 196,120,226,172 }, { 230,120,254,171, },

    { 258,120,287,172 }, { 293,120,323,172, },

    { /* ! */ },

    { 0,177,15,231 }, { 18,177,66,233 }, { 69,177,107,231 }, { 111,177,140,236, },

    { 146,177,188,232 }, { 191,177,220,205 }, { 223,177,259,232 }, { 261,177,277,194, },

    { 281,177,297,231 }, { 301,177,317,231 }, { 322,177,339,215 }, { 343,177,373,221, },

    { 378,177,392,231 }, { 396,177,410,231 },

};

 

const int fntascii[96] =

{

    0,0,0,0,0,0,0,0,0,0,

    0,0,0,0,0,0,0,0,0,0,

    0,0,0,0,0,0,0,0,0,0,

    0,0,0,

    36,0,38,39,40,42,0,44,45,43,47,0,46,0,0,

    26,27,28,29,30,31,32,33,34,35,

    0,0,0,0,0,0,37,

    0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,

    17,18,19,20,21,22,23,24,25,

    48,0,49,41

};

 

void PutLetter(SDL_Surface * screen, int x, int y, int n, int col, double ampl)

{

    int dx = fntdef[n].x1 - fntdef[n].x0;

    int dy = fntdef[n].y1 - fntdef[n].y0;

 

    int sx = fntdef[n].x0;

    int sy = fntdef[n].y0;

 

    int w = screen->w;

    int h = screen->h;

 

    if(x + dx < 0 || y + dy < 0 ||  x > w || y > h)

        return;

 

    if(x < 0)

    {

        sx -= x;

        dx += x;

        x = 0;

    }

    if(y < 0)

    {

        sy -= y;

        dy += y;

        y = 0;

    }

 

    if(x + dx > w)

    dx = w - x;

    if(y + dy > h)

    dy = h - y;

 

    Uint8 * b = (Uint8 *) screen->pixels;

    Uint8 * f = (Uint8 *) fntbmp->pixels;

 

    for(int j = 0; j < dx; j++)

    {

        int ads = (y + (int) (sintab[x + j] * ampl)) * screen->w + x;

        int adf = sy * fntbmp->w + sx;

        for(int i = 0; i < dy; i++)

        {

            char c = f[adf + j];

            if(c == 1)

                b[ads + j] = col;

            else if(c == 3)

                b[ads + j] = 0;

            ads += screen->w;

            adf += fntbmp->w;

        }

    }

}

 

void WriteStr(SDL_Surface * screen, int x, int y, const char *str, int col, double ampl)

{

    while(*str)

    {

        int n = fntascii[(byte)*str];

        if(*str != 32)

        {

            PutLetter(screen, x, y, n, col, ampl);

            x += fntdef[n].x1 - fntdef[n].x0 + 2;

        }

        else

            x += 20;

        str++;

    }

}

 

int LengthStr(const char *str)

{

    int l = 0, n;

 

    while(*str)

    {

        n = fntascii[(byte)*str];

        if(*str != 32)

            l += fntdef[n].x1 - fntdef[n].x0 + 2;

        else

            l += 20;

 

        str++;

    }

    return l;

}

 

void DrawPoints(SDL_Surface *screen, ScreenPoint *p)

{

    Uint8 * b = (Uint8 *) screen->pixels;

 

    for(int i = 0; i < maxpoint; i++)

        b[p[i].y * screen->w + p[i].x] = 255;

}

 

 

void MovePoints(ScreenPoint *p)

{

    int w = width - 1;

    int h = height - 1;

 

    for(int i = 0; i < maxpoint; i++)

    {

        p[i].x += p[i].sx;

        p[i].y += p[i].sy;

 

        if(p[i].x > w)

        {

            p[i].sx = -p[i].sx;

            p[i].x = w;

        }

        if(p[i].x < 0)

        {

            p[i].sx = -p[i].sx;

            p[i].x = 0;

        }

        if(p[i].y > h)

        {

            p[i].sy = -p[i].sy;

            p[i].y = h;

        }

        if(p[i].y < 0)

        {

            p[i].sy = -p[i].sy;

            p[i].y = 0;

        }

    }

}

 

void Blur(SDL_Surface *screen)

{

    Uint8 * b = (Uint8 *) screen->pixels;

 

    int i = 0;

    for(; i < width * (height - 1); i++)

        b[i] = (b[i] + b[i + 1] + b[i + width - 1] + b[i + width + 2]) >> 2;

 

    for(; i < width * height; i++)

        b[i] = 0;

 

}

 

SDL_Surface *CreateScreen(int w, int h, int bpp, int flags)

{

    SDL_Surface * screen = SDL_SetVideoMode(w, h, bpp, flags);

    if(!screen)

    {

        Cout() << Format("Couldn't set display mode: %s\n", SDL_GetError());

        return NULL;

    }

    Cout() << Format("Screen is in %s mode\n", (screen->flags & SDL_FULLSCREEN) ? "fullscreen" : "windowed");

    return screen;

}

 

void SetupPalette(SDL_Surface * screen)

{

    SDL_Color pal[256];

 

    double d = 20;

    double dx = 63.0 / 256.0;

 

    for(int i = 0; i < 254; i++)

    {

        pal[i].r = (Uint8) d;

        pal[i].g = (Uint8) d;

        pal[i].b = 0;

 

        d += dx;

    }

    pal[254].r = 0;

    pal[254].g = 150;

    pal[254].b = 255;

 

    pal[255].r = 255;

    pal[255].g = 255;

    pal[255].b = 0;

 

    SDL_SetColors(screen, pal, 0, 256);

    SDL_Flip(screen);

    SDL_SetColors(screen, pal, 0, 256);

}

 

CONSOLE_APP_MAIN

{

    if(SDL_Init(SDL_INIT_VIDEO) < 0)

    {

        Cout() << Format("Couldn't initialize SDL: %s\n", SDL_GetError());

        return;

    }

 

    ScreenPoint points[maxpoint];

 

    for(int i = 0; i < width; i++)

        sintab[i] = sin(i * M_PI / 180.0);

 

    for(int i = 0; i < maxpoint; i++)

    {

        points[i].x   = rand() % (width - 1);

        points[i].y   = rand() % (height - 1);

        points[i].sx  = (rand() & 1) + 1;

        points[i].sy  = (rand() & 1) + 1;

        points[i].col = (rand() % 255);

    }

 

    fntbmp = SDL_LoadBMP(GetDataFile("font.bmp"));

    if(!fntbmp)

    {

        Cout() << Format("Error loading font.bmp : %s\n", SDL_GetError());

        return;

    }

 

    int videoflags = SDL_HWSURFACE | SDL_HWACCEL | SDL_DOUBLEBUF | SDL_FULLSCREEN;

 

    SDL_Surface * screen = CreateScreen(width, height, bpp, videoflags);

    if(!screen)

        return;

 

    SDL_Surface * surface = SDL_CreateRGBSurface(SDL_SWSURFACE, width, height, bpp, 0, 0, 0, 0);

    if(!surface)

        return;

 

    SetupPalette(surface);

    SetupPalette(screen);

 

    int j = 0;

    int k = 0;

    int len0 = LengthStr(scroll[j]);

    int len1 = len0;

    int xmax = (width - len1) / 2;

    int x0 = width;

    int x1 = -len0;

 

    SDL_Event event;

    bool done = false;

 

    while(!done)

    {

        if(SDL_PollEvent(&event))

            switch (event.type)

            {

                case SDL_KEYDOWN:

                    if(event.key.keysym.sym == SDLK_LALT || event.key.keysym.sym == SDLK_TAB)

                        break;

 

                    if(event.key.keysym.sym == SDLK_LALT && event.key.keysym.sym == SDLK_RETURN)

                    {

                        videoflags ^= SDL_FULLSCREEN;

                        screen = CreateScreen(screen->w, screen->h, screen->format->BitsPerPixel, videoflags);

                        if(!screen)

                        {

                            Cout() << "Couldn't toggle fullscreen mode\n";

                            done = true;

                        }

                        SetupPalette(surface);

                        SetupPalette(screen);

                        break;

                    }

                case SDL_QUIT:

                    done = true;

                    break;

                default:

                    break;

            }

            else

            {

                SDL_LockSurface(surface);

 

                DrawPoints(surface, points);

                Blur(surface);

                MovePoints(points);

 

                if(x0 > -len0)

                    WriteStr(surface, x0 + 5, height - 195, scroll[k], 254, 50);

 

                if(x1 <= xmax)

                    WriteStr(surface, x1, height - 260, scroll[j], 255, 50);

 

                x0 -= 1;

                x1 += 1;

 

                if(x0 < -len0)

                {

                    if(++k > maxscroll - 1) k = 0;

                    len0 = LengthStr(scroll[k]);

                    x0 = width;

                }

 

                if(x1 > xmax)

                {

                    if(++j > maxscroll - 1) j = 0;

                    len1 = LengthStr(scroll[j]);

                    xmax = (width - len1) / 2;

                    x1 = -len1;

                }

 

                SDL_UnlockSurface(surface);

                SDL_BlitSurface(surface, NULL, screen, NULL);

                SDL_Flip(screen);

            }

    }

    SDL_FreeSurface(surface);

    SDL_FreeSurface(screen);

    SDL_FreeSurface(fntbmp);

    SDL_Quit();

}

 

 

 

 

Do you want to contribute?