
過去ログ 3
過去ログは下にいくほど新しい記事となっております。
※注意:このサイトにあるプログラムのソースコードや、その他の情報はすべて無保証です。やばいと思ったら実行しないでください。コンパイル、実行などによって生じた損害に対する責任は負いませんので、ご了承ください。
OracleがSunを買収
21-4-2009
Oracle Buys Sun
ORACLE TO BUY SUN
と、いうことだそうです。
Oracleにはあまりお世話になっていませんがSunはOpenOffice.org、JDK、NetBeans、MySQLといろいろお世話になっているので、今後どうなるか興味のあるところです。
それに関係して
というわけでもないですが、Open Solarisをインストールしてみました。
Virtual Boxをインストールし、外付けハードディスクに30GBの領域を確保してOpen Solarisをインストールしました。

「Linux上でSolaris動かすってどうなの?」というのは置いておいて、普通に動きます(Windows上でも動くことも確認しました)。
USB接続の外付けハードディスク上で動いているせいか、起動や終了に時間がかかっているかなという印象はありますが。
SDL 昨日の続き
今回は文字を表示します。

用意するものは以下のとおりです。
- SDL_ttfライブラリ
- ttfフォント
フォントは各自用意してください。
以下のソースコードを元に処理を追加します。
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
int main(){
SDL_Surface *image;
SDL_Surface *screen;
SDL_Rect rect_scr = {0,0,300,300};
SDL_Rect rect_img = {0,0,200,200};
SDL_Event event;
int endflag = 0;
SDL_Init(SDL_INIT_EVERYTHING); /* SDL起動 */
SDL_WM_SetCaption("ペンギン", "ぺんぎん");
SDL_SetVideoMode(300, 300, 32, SDL_HWSURFACE);
image = IMG_Load("penguin.png");
screen = SDL_GetVideoSurface();
SDL_BlitSurface(image, &rect_img, screen, &rect_scr);
SDL_Flip(screen);
while(!endflag){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
case SDL_KEYDOWN:
endflag = 1;
break;
default:
break;
}
}
SDL_Delay(1);
}
SDL_FreeSurface(image);
SDL_Quit(); /* SDL終了 */
return 0;
}
ttfの初期化と終了
ttfの開始にはTTF_Init()、終了にはTTF_Quit()を使用します。
int TTF_Init(); void TTF_Quit();
TTF_Init()は成功したら0が、失敗したら-1が返ります。
TTF_Init()とTTF_Quit()は最初と最後につけます。
フォントの読み込み
TTF_OpenFong()を使用します。
TTF_Font *TTF_OpenFont(const char *file, int ptsize);
*fileはttfフォント名、ptsizeはフォントサイズを指定します。
フォントが不要になったら、TTF_CloseFont()で削除します。
void TTF_CloseFont(TTF_Font *font);
文字列の出力
フォントの読み込みが終了したら、いよいよ、文字列の出力です。
エンコードはASCII、UTF-8、UNICODEの、3種類から選べます。
また、出力タイプから、Solid、Shared、Blendedの3種類が選択できます。
SDL_Surface *TTF_RenderText_Solid(TTF_Font *font, const char *text, SDL_Color fg); SDL_Surface *TTF_RenderUTF8_Solid(TTF_Font *font, const char *text, SDL_Color fg); SDL_Surface *TTF_RenderUNICODE_Solid(TTF_Font *font, const Uint16 *text, SDL_Color fg); SDL_Surface *TTF_RenderText_Shaded(TTF_Font *font, const char *text, SDL_Color fg, SDL_Color bg); SDL_Surface *TTF_RenderUTF8_Shaded(TTF_Font *font, const char *text, SDL_Color fg, SDL_Color bg); SDL_Surface *TTF_RenderUNICODE_Shaded(TTF_Font *font, const Uint16 *text, SDL_Color fg, SDL_Color bg); SDL_Surface *TTF_RenderText_Blended(TTF_Font *font, const char *text, SDL_Color fg); SDL_Surface *TTF_RenderUTF8_Blended(TTF_Font *font, const char *text, SDL_Color fg); SDL_Surface *TTF_RenderUNICODE_Blended(TTF_Font *font, const Uint16 *text, SDL_Color fg);
上から順にSolid、Shared、Blendedです。

Solidを指定すると、粗い文字になり、Shaded、Blendedは滑らかになります。またShadedは背景色を指定する必要があります。Solid、Blendedは背景なし(透明)です。
以下にサンプルのプログラムを示します。フォントはIPAモナーフォントを使っています。
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_ttf.h>
int main(){
SDL_Surface *image;
SDL_Surface *screen;
SDL_Surface *ttf_surface;
SDL_Rect rect_scr = {0,0,300,300};
SDL_Rect rect_img = {0,0,200,200};
SDL_Color color = {255, 255, 255};
SDL_Color colorbg = {0, 0, 255};
SDL_Event event;
int endflag = 0;
TTF_Font *font;
SDL_Init(SDL_INIT_EVERYTHING); /* SDL起動 */
TTF_Init();
SDL_WM_SetCaption("ペンギン", "ぺんぎん");
SDL_SetVideoMode(300, 300, 32, SDL_HWSURFACE);
image = IMG_Load("penguin.png");
font = TTF_OpenFont("ipag-mona.ttf", 36);
screen = SDL_GetVideoSurface();
SDL_BlitSurface(image, &rect_img, screen, &rect_scr);
rect_scr.y = 130;
ttf_surface = TTF_RenderUTF8_Solid(font, "ペンギン", color);
rect_img.w = ttf_surface->w;
rect_img.h = ttf_surface->h;
SDL_BlitSurface(ttf_surface, &rect_img, screen, &rect_scr);
SDL_FreeSurface(ttf_surface);
rect_scr.y += 40;
ttf_surface = TTF_RenderUTF8_Shaded(font, "ペンギン", color, colorbg);
rect_img.w = ttf_surface->w;
rect_img.h = ttf_surface->h;
SDL_BlitSurface(ttf_surface, &rect_img, screen, &rect_scr);
SDL_FreeSurface(ttf_surface);
rect_scr.y += 40;
ttf_surface = TTF_RenderUTF8_Blended(font, "ペンギン", color);
rect_img.w = ttf_surface->w;
rect_img.h = ttf_surface->h;
SDL_BlitSurface(ttf_surface, &rect_img, screen, &rect_scr);
SDL_FreeSurface(ttf_surface);
SDL_Flip(screen);
while(!endflag){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
case SDL_KEYDOWN:
endflag = 1;
break;
default:
break;
}
}
SDL_Delay(1);
}
SDL_FreeSurface(image);
TTF_Quit();
SDL_Quit(); /* SDL終了 */
return 0;
}
なお、コンパイル時には「-lSDL_ttf」が必要になります。
$ gcc test.c -lSDL -lSDL_image -lSDL_ttf
※コメント、トラックバックはできません。(ブログじゃないから)
詐欺にご用心
22-4-2009
メールアドレスが一時期オープンになっていたこともあって、迷惑メールが毎日けっこうな量届くのですが、今日は某有名銀行グループを名乗るメールが届きました。もちろん無視しましたが、出会い系・エロメールが大半のうちの迷惑メールには珍しい内容で、ちょっと新鮮味を感じてました。
ここに来る皆さん・・・は多分引っかからないと思いますが、変なメールに騙されないように注意してくださいね。
今日は
昨日入れたvirtualboxを使って、「Fedora on Fedora」をやろうと思ったのですが、途中で止まってしまったようです。残念。
今日のSDL
Fedoraのダウンロード、起動に時間を使ってしまい、今日は特にネタがないですが・・・
IMG_Load()は透過png使用可能です。
今までの、ペンギンが

白背景ペンギンだったので、白のバックが見えていましたが、背景なしペンギン

だと、白のバックは見えなくなります。

輪郭の色が暗い色なので、白のバックがあった方が見やすいですね。
※コメント、トラックバックはできません。(ブログじゃないから)
草彅剛って一発変換できない
23-4-2009
ニュース記事がすべて「草なぎ剛」になっているので、「あれ、“なぎ”ってどんな字だったかな」と思って変換してみると、
草なぎ剛
となりました。ちなみに、「くさなぎのつるぎ」は
草薙剣
と変換されました。そんなもんでしょう。
今日のSDL
画像の拡大・縮小についてです。
画像の拡大、縮小には、SDL_gfxライブラリが必要となります。
いままで、画像の表示は、
- IMG_Load() で画像読み込み
- SDL_BlitSurface() でバッファにコピー
- SDL_Flip() で画面に表示
の手順で行っていました(↓参照)。
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
int main(){
SDL_Surface *image;
SDL_Surface *screen;
SDL_Rect rect_scr = {0,0,300,300};
SDL_Rect rect_img = {0,0,200,200};
SDL_Event event;
int endflag = 0;
SDL_Init(SDL_INIT_EVERYTHING); /* SDL起動 */
SDL_WM_SetCaption("ペンギン", "ぺんぎん");
SDL_SetVideoMode(300, 300, 32, SDL_HWSURFACE);
screen = SDL_GetVideoSurface();
image = IMG_Load("penguin.png");
SDL_BlitSurface(image, &rect_img, screen, &rect_scr);
SDL_Flip(screen);
while(!endflag){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
case SDL_KEYDOWN:
endflag = 1;
break;
default:
break;
}
}
SDL_Delay(1);
}
SDL_FreeSurface(image);
SDL_Quit(); /* SDL終了 */
return 0;
}
画像の拡大縮小を行う場合は、SDL_gfxのzoomSurface()を使用します。
SDL_Surface *zoomSurface(SDL_Surface * src, double zoomx, double zoomy, int smooth);
*srcは拡大縮小する画像、zoomxはx方向(横方向)への倍率、zoomyはy方向(縦方向)への倍列、smoothは画像をスムーズにするかどうかです。
zoomx、zoomyは1が原寸大、1より大きいと拡大、1より小さいと縮小です。smoothは1がスムーズにする、0がスムーズにしないです。
実際に使用したソースコード例と、その表示結果を示します。
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_rotozoom.h>
int main(){
SDL_Surface *image;
SDL_Surface *image_resized;
SDL_Surface *screen;
SDL_Rect rect_scr = {0,0,300,300};
SDL_Rect rect_img = {0,0,200,200};
SDL_Event event;
int endflag = 0;
SDL_Init(SDL_INIT_EVERYTHING); /* SDL起動 */
SDL_WM_SetCaption("ペンギン", "ぺんぎん");
SDL_SetVideoMode(300, 300, 32, SDL_HWSURFACE);
screen = SDL_GetVideoSurface();
image = IMG_Load("penguin.png");
image_resized = zoomSurface(image, 1.5, 1.5, 1);
SDL_BlitSurface(image_resized, &rect_img, screen, &rect_scr);
SDL_Flip(screen);
while(!endflag){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
case SDL_KEYDOWN:
endflag = 1;
break;
default:
break;
}
}
SDL_Delay(1);
}
SDL_FreeSurface(image_resized);
SDL_FreeSurface(image);
SDL_Quit(); /* SDL終了 */
return 0;
}
コンパイル時に「-lSDL_gfx」が必要です。
$ gcc test.c -lSDL -lSDL_image -lSDL_gfx

なお、smooth = 0にした場合、次のようになります。

smooth = 0の方がギザギザが目立ちます。
※コメント、トラックバックはできません。(ブログじゃないから)
Ubuntu Netbook Remix
24-4-2009
久しぶりに行ったUbuntuのサイトで見つけたUbuntu Netbook Remix。Netbookって、今5万円以下で売っていて、某通信会社と契約すると、格安で購入できるあれのことだろうな。(ウルトラモバイルPCってやつ?)
どんなのだろう?と思ってダウンロード中(サイズは947MB)。
1GB USBフラッシュメモリに入れて使えますということ。まあサイズ的にそうだろう。
virtualboxでも遊べるだろうけど、USBメモリに入れた方が楽しそうだ。
USBメモリ、買ってこなきゃ。
今日のSDL
参考サイトなど
- SDL Documentation Wiki
- SDL ライブラリ
- SDL_image ライブラリ
- SDL_ttf ライブラリ
- SDL_mixer ライブラリ
- SDL_net ライブラリ
- SDL_gfx ライブラリ
回転拡大
この言葉を聞くと複素数の授業の嫌な思い出が蘇ってくるのは私だけだと思いますが、複素数とは何の関係もありません。
単純に、画像を回転させて、拡大(または縮小)するだけです。
昨日に引き続き、SDL_gfxライブラリを使用します。
関数はrotozoomSurface()を使用します。
SDL_Surface *rotozoomSurface(SDL_Surface * src, double angle, double zoom, int smooth);
*srcは回転拡大する画像、angleは角度(度数法)、zoomは倍率(1で原寸大)、smoothは滑らかさ(1:滑らか、0:粗い)です。
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_rotozoom.h>
int main(){
SDL_Surface *image;
SDL_Surface *image_resized;
SDL_Surface *screen;
SDL_Rect rect_scr = {0,0,300,300};
SDL_Rect rect_img = {0,0,200,200};
SDL_Event event;
int endflag = 0;
SDL_Init(SDL_INIT_EVERYTHING); /* SDL起動 */
SDL_WM_SetCaption("ペンギン", "ぺんぎん");
SDL_SetVideoMode(300, 300, 32, SDL_HWSURFACE);
screen = SDL_GetVideoSurface();
image = IMG_Load("penguin.png");
image_resized = rotozoomSurface(image, 90, 1.5, 1);
SDL_BlitSurface(image_resized, &rect_img, screen, &rect_scr);
SDL_Flip(screen);
while(!endflag){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
case SDL_KEYDOWN:
endflag = 1;
break;
default:
break;
}
}
SDL_Delay(1);
}
SDL_FreeSurface(image_resized);
SDL_FreeSurface(image);
SDL_Quit(); /* SDL終了 */
return 0;
}

※コメント、トラックバックはできません。(ブログじゃないから)
USBメモリは
25-4-2009
明日買ってこよう(昨日のネタ参照)
今日のSDL
新しいネタがまだ素材が準備できていないので、おやすみです。
昨日のソースコードにコメントつけたりいろいろやってみました。
実際にプログラミングする時には、わかりやすく、修正しやすいように書きたいものです。
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
#include <SDL/SDL_rotozoom.h>
/* 画像イメージ複写エリアサイズ */
#define IMAGE_RECT_X (0)
#define IMAGE_RECT_Y (0)
#define IMAGE_RECT_W (200)
#define IMAGE_RECT_H (200)
/* 画像配置位置サイズ */
#define SCR_RECT_X (0)
#define SCR_RECT_Y (0)
#define SCR_RECT_W (300)
#define SCR_RECT_H (300)
/* ウインドウタイトル */
#define WINDOW_TITLE "ペンギン"
#define WINDOW_ICON "ぺんぎん"
/* ウインドウサイズ */
#define WINDOW_WIDTH (300)
#define WINDOW_HEIGHT (300)
#define WINDOW_BPP (32) /* bits per pixel */
/* 読み込む画像 */
#define IMAGE_FILE "penguin.png"
/* フラグ */
#define FLAG_ON (1)
#define FLAG_OFF (0)
/* ウエイト時間(ミリ秒) */
#define LOOP_WAIT_TIME (1)
/*****************************************
* NAME : main
* ARGS : なし
* DESC : アプリケーションエントリポイント
*****************************************/
int main(){
SDL_Surface *image; /* 画像イメージ用サーフェス */
SDL_Surface *image_resized; /* 回転後画像用サーフェス */
SDL_Surface *screen; /* スクリーンサーフェス */
SDL_Rect rect_scr /* 画像配置位置 */
= {IMAGE_RECT_X, IMAGE_RECT_Y, IMAGE_RECT_W, IMAGE_RECT_H};
SDL_Rect rect_img /* 画像複写エリア */
= {SCR_RECT_X, SCR_RECT_Y, SCR_RECT_W, SCR_RECT_H};
SDL_Event event; /* ユーザ操作によるイベント */
int endflag = FLAG_OFF; /* 終了フラグ */
/* SDL,ウインドウ初期設定 */
SDL_Init(SDL_INIT_EVERYTHING);
SDL_WM_SetCaption(WINDOW_TITLE, WINDOW_ICON);
SDL_SetVideoMode(WINDOW_WIDTH, WINDOW_HEIGHT, WINDOW_BPP, SDL_HWSURFACE);
/* スクリーンサーフェス取得 */
screen = SDL_GetVideoSurface();
/* 画像読み込み */
image = IMG_Load(IMAGE_FILE);
/* 画像回転拡大 */
image_resized = rotozoomSurface(image, 90, 1.5, 1);
/* スクリーンサーフェスにコピー */
SDL_BlitSurface(image_resized, &rect_img, screen, &rect_scr);
/* 画面表示 */
SDL_Flip(screen);
/* ここからイベント発生待ち */
while(!endflag){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT: /* ウインドウが閉じられようとした */
case SDL_KEYDOWN: /* キーが押された */
/* 終了する */
endflag = FLAG_ON;
break;
default:
break;
}
}
SDL_Delay(LOOP_WAIT_TIME);
}
/* サーフェスの解放 */
SDL_FreeSurface(image_resized);
SDL_FreeSurface(image);
/* 終了する */
SDL_Quit();
return 0;
}
まあ、書き方の一例ということで。
あと、上のソースコードでは返り値のチェックとかしていませんが、本来は必要です。
/* 修正例(一部) : 該当部分抜粋 */
if(SDL_Init(SDL_INIT_EVERYTHING) != 0){
return 1;
}
※コメント、トラックバックはできません。(ブログじゃないから)
Ubuntu NetBook
26-4-2009
Ubuntuのネットブック版。USBメモリを今日買ってきて使ってみた。
USBメモリから起動しているせいか、動作は若干重い。ハードディスクにインストールしてしまえば、問題ないでしょう。多分。
NetBook用というだけあって、デスクトップにも工夫が見られた。
(※ 画像クリックで大きな画像を表示。普通のノートパソコンのデスクトップ画面なので、ちょっと大きめです。)
全画面表示による操作前提のNetBookスタイル。アプリケーションを開くと、全画面表示される。ウインドウサイズを変えることはできず、閉じるか最小化するのみ。画面が小さい場合は操作しやすいと思う。普段ウインドウをたくさん出して作業するスタイルの人にはちょっとつらいかも。
もちろん、通常のデスクトップスタイルにすることも可能。
(これを書いている時点で27日になってしまったので、続きは今日の夜)
※コメント、トラックバックはできません。(ブログじゃないから)
透過色設定
27-4-2009
今日のSDL
タイトルどおり、透過色の設定についてです。
SDL_SetColorKey()により、透過色の設定ができます。ただし、アルファチャンネル情報が含まれていないもの(24ビットビットマップなど)に限られるようです。
int SDL_SetColorKey(SDL_Surface *surface, Uint32 flag, Uint32 key);
*surfaceは透過色を設定するサーフェス、flagはSDL_SRCCOLORKEY、または0をセット。前者は透過色をセット、後者はリセットします。keyはSDL_MapRGB()の返り値をセットします。
また、SDL_SRCCOLORKEYと同時にSDL_RLEACCELを指定すると、描画速度が上がります。
返り値は0で成功、-1で失敗です。
サンプル画像↓(bmpファイルです。)

#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
int main(){
SDL_Surface *image;
SDL_Surface *screen;
SDL_Rect rect_scr = {0,0,300,300};
SDL_Rect rect_img = {0,0,200,200};
SDL_Event event;
int endflag = 0;
/* 初期設定 */
SDL_Init(SDL_INIT_EVERYTHING);
SDL_WM_SetCaption("ペンギン", "ぺんぎん");
SDL_SetVideoMode(300, 300, 32, SDL_HWSURFACE);
screen = SDL_GetVideoSurface();
image = IMG_Load("green_penguin.bmp");
SDL_SetColorKey(image, SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB(image->format, 255, 255, 255));
SDL_BlitSurface(image, &rect_img, screen, &rect_scr);
SDL_Flip(screen);
while(!endflag){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
case SDL_KEYDOWN:
endflag = 1;
break;
default:
break;
}
}
SDL_Delay(1);
}
SDL_FreeSurface(image);
SDL_Quit(); /* SDL終了 */
return 0;
}

透過色に白((r,g,b)=(255,255,255))をセットしたため白が透過色となりました。
緑((r,g,b)=(0,255,0))を透過色にすると、次のようになります。
/* 該当部分抜粋 */ SDL_SetColorKey(image, SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB(image->format, 0, 255, 0));

※コメント、トラックバックはできません。(ブログじゃないから)
半透明
28-4-2009
SDLの参考サイトなど
- SDL Documentation Wiki
- SDL ライブラリ
- SDL_image ライブラリ
- SDL_ttf ライブラリ
- SDL_mixer ライブラリ
- SDL_net ライブラリ
- SDL_gfx ライブラリ
昨日のSDLの訂正
SDL_SetColorKey()により、透過色の設定ができます。ただし、アルファチャンネル情報が含まれていないもの(24ビットビットマップなど)に限られるようです。
と書きましたが、アルファチャンネルが含まれているpngなどでも透過色設定できます。
SDL_SetColorKey()を実行後、SDL_DisplayFormat()またはSDL_DisplayFormatAlpha()を呼びます。
SDL_Surface *SDL_DisplayFormat(SDL_Surface *surface); SDL_Surface *SDL_DisplayFormatAlpha(SDL_Surface *surface);
SDL_DisplayFormat()とSDL_DisplayFormatAlpha()はアルファチャンネルをセットするかどうかが違い、surfaceにアルファチャンネルが使用されていない場合、SDL_DisplayFormatAlpha()によってアルファチャンネルのセットができます。
/* 使用例 */ SDL_SetColorKey(image, SDL_SRCCOLORKEY | SDL_RLEACCEL, SDL_MapRGB(image->format, 255, 255, 255)); image2 = SDL_DisplayFormat(image);
今日のSDL
タイトルどおり、半透明の設定についてです。
半透明にするにはSDL_SetAlpha()を使います。
int SDL_SetAlpha(SDL_Surface *surface, Uint32 flags, Uint8 alpha);
*surfaceには半透明にするサーフェスを、flagsにはSDL_SRCALPHAを指定します。
alphaは0(透明:SDL_ALPHA_TRANSPARENT)から255(不透明:SDL_ALPHA_OPAQUE)を指定します。
また、SDL_SRCCOLORKEYと同時にSDL_RLEACCELを指定すると、描画速度が上がります。
返り値は0で成功、-1で失敗です。
SDL_SetColorKey()と同様、SDL_DisplayFormat()を呼べば、pngなども半透明にできます。
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
int main(){
SDL_Surface *image;
SDL_Surface *image2;
SDL_Surface *screen;
SDL_Rect rect_scr = {0,0,300,300};
SDL_Rect rect_img = {0,0,200,200};
SDL_Event event;
int endflag = 0;
/* 初期設定 */
SDL_Init(SDL_INIT_EVERYTHING);
SDL_WM_SetCaption("ペンギン", "ぺんぎん");
SDL_SetVideoMode(300, 300, 32, SDL_HWSURFACE);
screen = SDL_GetVideoSurface();
image = IMG_Load("penguin.png");
SDL_SetAlpha(image, SDL_SRCALPHA, 128);
image2 = SDL_DisplayFormat(image);
SDL_BlitSurface(image2, &rect_img, screen, &rect_scr);
SDL_Flip(screen);
while(!endflag){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
case SDL_KEYDOWN:
endflag = 1;
break;
default:
break;
}
}
SDL_Delay(1);
}
SDL_FreeSurface(image2);
SDL_FreeSurface(image);
SDL_Quit(); /* SDL終了 */
return 0;
}

画面を保存するには
SDL_SaveBMP()にて、画面などのサーフェスをビットマップ形式で保存できます。スクリーンショット機能をつけるときなどに便利です。
int SDL_SaveBMP(SDL_Surface *surface, const char *file);
*surfaceは保存するサーフェス、*fileはファイル名です。
返り値は0で成功、-1で失敗です。
#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
int main(){
SDL_Surface *image;
SDL_Surface *screen;
SDL_Rect rect_scr = {0,0,300,300};
SDL_Rect rect_img = {0,0,200,200};
SDL_Event event;
int endflag = 0;
/* 初期設定 */
SDL_Init(SDL_INIT_EVERYTHING);
SDL_WM_SetCaption("ペンギン", "ぺんぎん");
SDL_SetVideoMode(300, 300, 32, SDL_HWSURFACE);
screen = SDL_GetVideoSurface();
image = IMG_Load("penguin.png");
SDL_BlitSurface(image, &rect_img, screen, &rect_scr);
SDL_Flip(screen);
SDL_SaveBMP(screen, "test.bmp");
while(!endflag){
while(SDL_PollEvent(&event)){
switch(event.type){
case SDL_QUIT:
case SDL_KEYDOWN:
endflag = 1;
break;
default:
break;
}
}
SDL_Delay(1);
}
SDL_FreeSurface(image);
SDL_Quit(); /* SDL終了 */
return 0;
}
実行すると、下の画像が作成されます。

※コメント、トラックバックはできません。(ブログじゃないから)
Copyright (c) 2008, 2009 greencap


