忍者ブログ

覚え書き

パソコン・マイコン関連の、あとで必要になりそうな情報を残しておくための、健忘録てきななにかです。

[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

SDL2+gcc-Sample-progrum01(サンプルプログラム)
前の記事に載せた、サンプルプログラムです。
SDL2/gcc/Linuxという組み合わせで作成しています。
動作を確認することが目的なので、女の子の初期位置が微妙とか、色々ありますが、気にしないでください。
また、画面左上の数字はFPSのつもりですが、精度がどれほどのものかは、まったく当てになりません。

実行中の画面は、前記事を参考にしてください。
(本当に、期待するようなものじゃないです)


//
//        2019.01.28
//        PNG-timer-02a.CPP
//        png画像を扱い、透過処理を行うサンプルプログラム
//        カーソルキーで左右に動き、ESCキーでプログラム終了
//        画像の一部分だけを切り出してコピーできる(画面左上のカウンターに使用している)
//
//        製作者の環境はgcc/ubuntu18.04(KonaLinux4.0)
//        コンパイルコマンドは以下の通り
//        gcc -g -o png-01 png-01.cpp `sdl2-config --cflags --libs` -lSDL2_image
//        geany用コマンド
//        gcc -g -o "%e" "%f" `sdl2-config --cflags --libs` -lSDL2_image
//

#include <stdio.h>

int loopy=1; //無限ループ処理で、whileを回し続けるためのもの
int va=0;
int vga=0; //画面のサイズ0ならウィンドーモード、1ならフル画面
int iw,ih; //テクスチャ画像の処理の為に用意する変数
int cx=200; //カーソルキーで左右にテクスチャを動かす実験用
int cxx=00; //カーソルキーで左右にテクスチャを動かす実験用

SDL_atomic_t frames;

/* 設定された間隔で平均フレームレートの計算と表示を行う */
Uint32 fps_timer_callback(Uint32 interval, void *data)
{
const float f = SDL_AtomicGet(&frames);
const float iv = (float)interval / 1000.0f;
// printf("%.2f\tfps\n", f / iv);

va=(f/iv)/60;

/* フレームカウンタをリセットする */
SDL_AtomicSet(&frames, 0);

return interval;
}

int main(int, char ** const){
SDL_Init(SDL_INIT_VIDEO); //Windows作成処理開始
SDL_Window* window = SDL_CreateWindow("SDL-Test", //Windows作成処理・タイトル
SDL_WINDOWPOS_CENTERED,SDL_WINDOWPOS_CENTERED, //Windows作成処理
320,240,vga); //Windows作成処理・サイズ&モード
SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0); //Windows作成処理終了

SDL_Surface *screen = SDL_GetWindowSurface(window);


int flags = IMG_INIT_PNG; //SDL_Image初期化開始
int initted = IMG_Init(flags); //エラー対応
if((initted & flags) != flags) { //エラー対応
printf("IMG_Init: Failed to init required jpg and png support!\n");
printf("IMG_Init: %s\n", IMG_GetError()); //エラー対応
}; //SDL_Image初期化終了
SDL_Surface *image = IMG_Load("image/myw4sss.png"); //png画像読み込み(フロント)
SDL_Surface *backg = IMG_Load("image/spring.png"); //png画像読み込み(背景)
if(!image & !backg){ //エラー対応
printf("IMG_Load: %s\n", IMG_GetError()); //エラー対応
}; //png画像読み込み終了

SDL_Texture *backg_texture; //png画像の変数化(背景)
backg_texture = SDL_CreateTextureFromSurface(renderer, backg); //png画像の変数化(背景)
SDL_FreeSurface(backg); //RGBサーフェイス開放
SDL_Texture *image_texture; //png画像の変数化(フロント)
SDL_SetColorKey( image, SDL_TRUE, //透過色の設定
SDL_MapRGB(image->format, 255, 0, 255));//透過色の設定
image_texture = SDL_CreateTextureFromSurface(renderer, image); //png画像の変数化(フロント)
SDL_FreeSurface(image); //RGBサーフェイス開放
SDL_Event ev; //エラー確認
if (SDL_PollEvent(&ev)) { //エラーへの対応。対象はev
if (ev.type == SDL_QUIT) { //戻り値の如何によって処理は終了となる
loopy=0; //戻り値の如何によって処理は終了となる
}; //戻り値の如何によって処理は終了となる
}; //戻り値の如何によって処理は終了となる

SDL_QueryTexture(backg_texture, NULL, NULL, &iw, &ih); //画像テクスチャのサイズを取得
SDL_Rect backg_rect = (SDL_Rect){0,0,iw,ih}; //取得したサイズから、構造体を定義
SDL_QueryTexture(image_texture, NULL, NULL, &iw, &ih); //画像テクスチャのサイズを取得
// SDL_Rect image_rect = (SDL_Rect){0,0,iw/2,ih/2}; //取得したサイズから、構造体を定義

SDL_Rect SrcR; /*呪い少女A&B*/ //テクスチャから一部を切り出すための前処理
SrcR.x = 8; /*左端X座標 */ //テクスチャから一部を切り出すための前処理
SrcR.y = 0; /*左端Y座標 */ //テクスチャから一部を切り出すための前処理
SrcR.w = 56; /*取出し横量 */ //テクスチャから一部を切り出すための前処理
SrcR.h = 88; /*取出し縦量 */ //テクスチャから一部を切り出すための前処理
SDL_Rect DestR1; /*呪い少女 A */ //テクスチャから一部を切り出すための前処理
// DestR1.x = cx; /*表示X座標 */ //移動に関係するため、ループ中に設定
DestR1.y = 100; /*表示Y座標 */ //テクスチャから一部を切り出すための前処理
DestR1.w = (56); /*取出し横量 */ //テクスチャから一部を切り出すための前処理
DestR1.h = (88); /*取出し縦量 */ //テクスチャから一部を切り出すための前処理
SDL_Rect DestR2; /*呪い少女 B */ //テクスチャから一部を切り出すための前処理
// DestR2.x = cx; /*表示X座標 */ //移動に関係するため、ループ中に設定
DestR2.y = 100; /*表示Y座標 */ //テクスチャから一部を切り出すための前処理
DestR2.w = (56); /*取出し横量 */ //テクスチャから一部を切り出すための前処理
DestR2.h = (88); /*取出し縦量 */ //テクスチャから一部を切り出すための前処理

SDL_Rect NunbD3; /*数字3桁目 */ //テクスチャから数字部分を切り出す為の前処理
NunbD3.x = 30; //テクスチャから数字部分を切り出す為の前処理
NunbD3.y = 30; //テクスチャから数字部分を切り出す為の前処理
NunbD3.w = 16; //テクスチャから数字部分を切り出す為の前処理
NunbD3.h = 24; //テクスチャから数字部分を切り出す為の前処理

SDL_Rect NunbD2; //テクスチャから数字部分を切り出す為の前処理
NunbD2.x = 46; //テクスチャから数字部分を切り出す為の前処理
NunbD2.y = 30; //テクスチャから数字部分を切り出す為の前処理
NunbD2.w = 16; //テクスチャから数字部分を切り出す為の前処理
NunbD2.h = 24; //テクスチャから数字部分を切り出す為の前処理

SDL_Rect NunbD1; //テクスチャから数字部分を切り出す為の前処理
NunbD1.x = 62; //テクスチャから数字部分を切り出す為の前処理
NunbD1.y = 30; //テクスチャから数字部分を切り出す為の前処理
NunbD1.w = 16; //テクスチャから数字部分を切り出す為の前処理
NunbD1.h = 24; //テクスチャから数字部分を切り出す為の前処理

SDL_AddTimer((1000/60), fps_timer_callback, NULL); //サブルーチン呼び出し設定(1/60秒に1回)


//////////////////////////////////////////////////////////////////////
// 以下、メインアルゴリズム
//////////////////////////////////////////////////////////////////////
int vvga; //変数の設定(カウンター補佐用)
while(loopy){ //メインルーチン開始(無限ループ)
vvga=va/100;
SDL_Rect NunbU3; //テクスチャから一部を切り出すための前処理
NunbU3.x = 0+(vvga*8); //テクスチャから一部を切り出すための前処理
NunbU3.y = 180; //テクスチャから一部を切り出すための前処理
NunbU3.w = 8; //「8」はコピー元の数字で、2倍表示している
NunbU3.h = 12; //「12」はコピー元の数字で、2倍表示している
vvga=(va-(vvga*100))/10;
SDL_Rect NunbU2; //テクスチャから一部を切り出すための前処理
NunbU2.x = 0+(vvga*8); //テクスチャから一部を切り出すための前処理
NunbU2.y = 180; //テクスチャから一部を切り出すための前処理
NunbU2.w = 8; //「8」はコピー元の数字で、2倍表示している
NunbU2.h = 12; //「12」はコピー元の数字で、2倍表示している
vvga=0+va%10;
SDL_Rect NunbU1; //テクスチャから一部を切り出すための前処理
NunbU1.x = 0+(vvga*8); //テクスチャから一部を切り出すための前処理
NunbU1.y = 180; //テクスチャから一部を切り出すための前処理
NunbU1.w = 8; //「8」はコピー元の数字で、2倍表示している
NunbU1.h = 12; //「12」はコピー元の数字で、2倍表示している

DestR1.x = cx; //テクスチャから一部を切り出すための前処理
DestR2.x = 220-cx; //テクスチャから一部を切り出すための前処理

SDL_SetRenderDrawColor(renderer, 200, 200, 200, 255); //色指定(灰色)
SDL_RenderClear(renderer); //指定色による塗りつぶし(画面初期化)
SDL_RenderCopy(renderer,backg_texture, //描写のための処理(背景)
NULL, NULL); //描写のための処理(背景)

// SDL_Rect draw_rect = (SDL_Rect){640-cx,200,iw/2,ih/2}; //取得したサイズから、構造体を定義
SDL_RenderCopy(renderer,image_texture, //描写のための処理(フロント)
&SrcR,&DestR1); //描写のための処理(フロント)
SDL_RenderCopy(renderer,image_texture, //描写のための処理(フロント)
&SrcR,&DestR2); //描写のための処理(フロント)
SDL_RenderCopy(renderer,image_texture, //描写のための処理(数字)
&NunbU3,&NunbD3); //描写のための処理(数字)
SDL_RenderCopy(renderer,image_texture, //描写のための処理(数字)
&NunbU2,&NunbD2); //描写のための処理(数字)
SDL_RenderCopy(renderer,image_texture, //描写のための処理(数字)
&NunbU1,&NunbD1); //描写のための処理(数字)
SDL_Delay(0); //待機
SDL_RenderPresent(renderer); //描写を反映させる
SDL_AtomicAdd(&frames, 1); //FPS用のカウンターに加算する

SDL_Event e; //キーボード入力のための待機
while(SDL_PollEvent(&e)){ //イベントがなければ内部が実行される
if (e.type==SDL_KEYDOWN){ //キーボード入力があるかどうか調べている
switch (e.key.keysym.sym){ //キーをチェックしている
case SDLK_ESCAPE: //ESCキーだった場合
loopy=0; //looyt=0は、メインループからの脱出=終了
break;
case SDLK_RIGHT: //右カーソルキーだった場合
cx=cx+2;
break;
case SDLK_LEFT: //左カーソルキーだった場合
cx=cx-2;
break;
}}};
if (cx>=640){cx=cx-2;
};
if (cx<=0) {cx=cx+2;
};

};

//////////////////////////////////////////////////////////////////////
// 以下、プログラム終了処理
//////////////////////////////////////////////////////////////////////

IMG_Quit(); //プログラム終了処理
SDL_FreeSurface(image); //プログラム終了処理
SDL_DestroyTexture(image_texture); //プログラム終了処理
SDL_DestroyRenderer(renderer); //プログラム終了処理
SDL_DestroyWindow(window); //プログラム終了処理
SDL_Quit(); //SDL終了処理
return 0;
};

使用した画像ファイル。

/image/myw4sss.png

/ image/spring.png

2つの画像ファイルは、「image」というフォルダ内に収めてください。
ってか、背景画像は、640x480になってますね。
最初はこのサイズで作っていたので。

拍手[0回]

PR

コメント

コメントを書く