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