BCCでSDL 簡単なプログラミング入門



BCCSDLを使ったプログラムです。

最初は簡単なプログラムから作っていこうと思います。

かなり簡単な内容です。

ウィンドウをSDLで作って、10mm秒間隔で塗りつぶす色を変えるだけです。

初心者を対象に(自分も含め)プログラムを作って、少し進んだ課題形式で演習するのが上達の近道だと思います。

リファレンスはここhttp://www.libsdl.org/intro.jp/toc.html

まずリファレンスに軽く目を通してください。次に全部印刷して、何時でも読めるようにする事をオススメします!

リファレンスを読むのがめんどくさい人はここhttp://tokyo.cool.ne.jp/sdl/

私もここで結構勉強しましたが、ある程度使えるようになったら、何か自分の作りたいゲームを作る事をオススメします!

以下のソースコードコンパイルして、実行してみてください。
分からない事があればコメント欄にどうぞ。





SDL_defined.h




#ifndef _INCLUDE_DEFINED
#define _INCLUDE_DEFINED
#include <SDL/SDL.h>
#include <stdio.h>

#define WIDTH 600
#define HEIGHT 480
#define BPP 32
#define TITLE "SDL"

enum{//初期化スイッチ
    TIMER = 0,
    VIDEO,
    JOYSTICK,
    ALL
};
#endif//end windowdefine



test.cpp



#include "SDL_defined.h"
#include "CanvasSDL.h"

void EndProc(void);
bool GetEvent(void);
void MainLoop(void);

/*初期化を設定後メインループに遷移する*/
int main(int argc,char *argv[])
{
    if( InitializeSDL(VIDEO) == false){
        fprintf(stderr,"InitializeError! %s",SDL_GetError);
        return 1;
    }
    MainLoop();
    EndProc();
    return 0;
}

//各イベントの処理ループ
void MainLoop(void){
    Uint32 color;
    color = 0x00000000;
    while(true){
        PaintingOut(color);
        ScreenUpdate();
        if(GetEvent() == false)break;
        SDL_Delay(10);//1秒待機
        if(color < 0x000000ff){
            color += 0x00000001;
        }else if(color < 0x0000ffff){
            color += 0x00000100;
        }else if(color < 0x00ffffff){
            color += 0x00010000;
        }else{
            color = 0x0;
        }
    }
}

void EndProc(void){
    //モジュール内のメモリを解放する
    FreeCanvas();
    SDL_Quit();
}

bool GetEvent(){
    
    SDL_Event ev;
    
    //SDLKey *key;
    while(SDL_PollEvent(&ev)){
        switch(ev.type){
        case SDL_QUIT://終了
            return false;
            break;
        case SDL_KEYDOWN://終了
            return false;
            break;
        }
    }
    
    return true;//変化無しで継続
}



CanvasSDL.h



#ifndef _INCLUDE_SETUP
#define _INCLUDE_SETUP

#include "SDL_defined.h"

bool InitializeSDL(Uint8 initType);
bool SDLinit(int type);
void PaintingOut(Uint32 color);
void ScreenUpdate(void);
void FreeCanvas(void);

#endif



CanvasSDL.cpp



#include "CanvasSDL.h"

//フィールド変数
static SDL_Surface *screen;

bool InitializeSDL(Uint8 initType)
{
    //SDLの初期化
    if( SDLinit(initType) == false ){
        return false;
    }
    //キャプション設定(Videoモードを設定する前に先に設定する必要がある)
    SDL_WM_SetCaption(TITLE,NULL);
    //ビデオモード設定
    screen = NULL;
    screen = SDL_SetVideoMode(
        WIDTH,HEIGHT,BPP,
        SDL_HWSURFACE | SDL_DOUBLEBUF
    );
    
    return true;
}

bool SDLinit(int type){
    switch(type){
    case VIDEO:
        if( SDL_Init(SDL_INIT_VIDEO) < 0 ){
            return false;
        }break;
    case TIMER:
        if( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_TIMER) < 0 ){
            return false;
        }break;
    case JOYSTICK:
        if( SDL_Init(SDL_INIT_VIDEO | SDL_INIT_JOYSTICK) < 0 ){
            return false;
        }break;
    case ALL:
        if( SDL_Init(SDL_INIT_VIDEO | 
        SDL_INIT_JOYSTICK | 
        SDL_INIT_TIMER) < 0 ){
            return false;
        }break;
    }//end initVIdeo
    
    return true;
}

void PaintingOut(Uint32 color){
    if(screen != NULL){
        SDL_FillRect( screen, NULL, color);
    }
    return;
}

void ScreenUpdate(void){
    if(screen != NULL){
        SDL_Flip(screen);
    }
    return;
}

void FreeCanvas(void){
    if(screen != NULL){
        SDL_FreeSurface(screen);
        screen = NULL;//CleanUp
    }
    return;
}



演習1 : グラデーションする色、黒→青→水色→白であるが、
これを逆順にグラデーションするようにしてください。(白→水色→青→黒)

演習2 : ウィンドウのサイズを任意のサイズに変更してください。
BPPの値を8、16、24と変えてみてください。

何か質問があればコメント欄にどうぞ。