BCCでSDL 図形を描く


本日のプログラムは画面上に矩形を描きます。


先に前回からの変更点を掲載します。

前回のソースは下のほうに載せておきます。

CanvasSDL.cpp

//プロトタイプ宣言
void PaintRect30(Uint16 x,Uint16 y);
//インクルードファイル
#include <stdlib.h>

void PaintRect30(Uint16 x,Uint16 y){
    SDL_Rect dstrect = { x, y, 30, 30 };
    
    SDL_FillRect( screen, &dstrect, 
        (rand()%2==0) ? ~rand() | 0x00050505 : rand() | 0x00202020);
}


test.cpp

//インクルードファイル
#include <stdlib.h>
#include <time.h>

//各イベントの処理ループ
void MainLoop(void){
    while(true){
        if(GetEvent() == false){
            break;
        }
        PaintRect30( rand() % WIDTH, rand() % HEIGHT);
        ScreenUpdate();
        SDL_Delay(10);//0.1秒待機
    }
}


演習1 : 描画する矩形のサイズを変更せよ

演習2 : 塗り潰す矩形の色を均一にする

演習3 : 左上隅から右下隅まで順に矩形を並べて、画面を塗り潰せたら自動的に終了するように変更する。



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;
}