スクリーンセーバーの作り方



DxLibFanに戻る

DxLibScreenSaverLibrary Style1を使ったスクリーンセーバーの作り方


Menu
関数リファレンス
デフォルトプロジェクトを使ってスクリーンセーバーを作る。
最初から作る。
DxLibScreenSaverLibrary Style1をダウンロードする
2005/02/06 / screen_saver02.hpp / DxLibでスクリーンセーバーを製作するクラス


DxLibScreenSaverLibrary Style1 関数リファレンス

C言語で記述!?されているのでDxLib使用経験者は使いやすいと思う^^;
int DxLibScreenSaverInit(
    HINSTANCE *hInst,
    LPSTR *lplpCmdLine,
    WORD Resorce,
    DLGPROC lpDialogFunc );

DxLibと一緒に初期化します。必ずこれを呼び出してください。
引数:
*hInst
WinMainの第一引数をぶち込みます。HINSTANCE hInstanceってやつです。
&hInstanceって感じでぶち込んでください。
(まぁ人によりいろんな名前だけどね^^;デフォルトはこう。よく分からなかったら付属のサンプルソースを見よう^^)

*lplpCmdLine

WinMainの第三引数をぶち込みます。LPSTR lpCmdLineってやつです。
&lpCmdLineって感じでぶち込んでください。

Resorce
スクリーンセイバーの設定時に表示するダイアログのリソースIDを渡します。
リソースってスペル間違っているみたいだけど気にしないでね( ̄ー ̄; ヒヤリ
デフォルトプロジェクトのサンプルではIDD_DIALOG1になっています。

lpDialogFunc
ダイアログのコールバック関数をぶち込んでください。
サンプルではMyDefDlgProcになっています。
そのまま使用する事をオススメします。

戻り値

私が定義した列挙が戻ってくる。詳細は以下
//モード列挙
enum{
   enuSSaverSetDataDialog=1,
   enuSSaverPreview,
   enuSSaverFullScreen,
   enuSSaverChangePasswd
};

enuSSaverSetDataDialog
設定ウインドウモードで起動した。

enuSSaverPreview
プレビューモードで起動した。(実際帰ってこないみたい^^;

enuSSaverFullScreen
フルスクリーンで起動した。これが帰ってきたらDxLibの描画関数等を使ってスクリーンセーバーのプログラムを組む。音楽とかムービーももちろん使用できる。
つまり〜^^;すべてのDxLib関数を使用できるって訳よ。
あとエラーログ出したくない場合は
int SetOutApplicationLogValidFlag( FALSE ) ;
をして下さい。どうぞよろしく^^;
(追記:こちら側で上記の関数はデフォルトでFALSEにするようにしました)

enuSSaverChangePasswd
パスワードチェンジモードで帰ってきた。
実際ライブラリ側で自動で設定するので帰ってきても無視して良い。

サンプル

//このサンプルはダウンロードしたファイルの
//ScreenSaverLibrary->デフォルトプロジェクトを参考にしています。
#include "nsaverDxlib.h"
#include "resource.h"

int WINAPI WinMain(HINSTANCE hInstance,
             HINSTANCE hPrevInstance,
             LPSTR lpCmdLine,
             int nCmdShow )
{
 int r;
 r=DxLibScreenSaverInit(
       &hInstance,
       &lpCmdLine,
       IDD_DIALOG1,
       MyDefDlgProc );
       //戻ってきたらDxLib
 if(r==enuSSaverFullScreen){
  WaitKey();
  DxLibScreenSaverEnd();
 }

 return 0;
}

int DxLibScreenSaverEnd(void);
DxLibと一緒に終了します。DxLib_Endと使い方は一緒です。
戻り値
DxLib_Endと同じ?だと思うけど^^;無視してよし



bool CheckPasswd(bool autoflg);
パスワードをチェックする。(内部でマウス処理やキーボード処理も行う。)
よってメインループ内にこの関数を呼び出すだけで良い。

引数
autoflg
tureにすると、パスワードが一致した際すぐに終了する。

戻り値
tureでパスワード入力成功。
falseでパスワード入力失敗。またはパスワード入力はされなかった、パスワード入力ダイアログを表示しなかった。

bool GetDxLibSaverData();
GetGraphicFileNamePointerやGetMusicFileNamePointerを使用する前に呼び出してください。falseが返るとGetGraphicFileNamePointerやGetMusicFileNamePointerは使用できません。

戻り値
false:
GetGraphicFileNamePointerやGetMusicFileNamePointerは使用不可能
true:
GetGraphicFileNamePointerやGetMusicFileNamePointerは使用可能



char *GetGraphicFileNamePointer(char **p=NULL);
設定モードで使用したグラフィックファイルPathのポインターを返す。

引数

戻り値と一緒。&で渡す。

戻り値
グラフィックファイルPathの先頭アドレス

注意
GetDxLibSaverDataを呼び出さないのにこの関数を呼び出すと、
グラフィックファイルが設定されてないと帰ってくる値は不明です。
また、DxLibScreenSaverInitでデフォルトのダイアログを渡さないと正常に機能しません。
よってオリジナルに凝る場合はこの関数は無視していいです。


char *GetMusicFileNamePointer(char **p=NULL);
前説明したGetGraphicFileNamePointerとほぼ一緒。
ダイアログで設定した音楽ファイルフルパスの先頭のアドレスを返す。
GetGraphicFileNamePointerと一緒なので説明は省略させてもらう。

void SetTestFunc(BYTE (*f)(void));
デフォルトダイアログを表示したとき”テスト”というボタンがある。
そのボタンを押したときに実行する関数を登録する。
ちなみに登録する関数は引数はvoid戻り値はBYTEと決まっている。

引数
引数はvoid戻り値はBYTEの関数の名前を渡す。(ポインタを渡すらしい)
(文字列ではない 詳しくはサンプルにて)

戻り値
ナシ

注意
DxLibScreenSaverInit関数を呼び出す前に呼び出すこと。

サンプル
BYTE sample(void){
 DrawBox(0,0,600,400,0xffff,TRUE);
 ScreenFlip();
 WaitKey();
 DxLibScreenSaverEnd();//必ずこの終了関数を呼び出すこと
}

SetTestFunc(sample);

//タブンこれでOK!?



デフォルトプロジェクトから作る
    用意するもの
  • VisualC++6.0(C++コンパイラ)
  • DxLib
  • DxLibScreenSaverLibrary
よく分からなければDxLibFanの掲示板に質問して下さい。



DxLibFan.exeを解凍してデフォルトプロジェクトというフォルダを見つけましょう!
例:DxLibFan\ScreenSaverLibrary\デフォルトプロジェクト
そこにDxLibのページ からダウンロードしてきたDxLibをこのフォルダ内にコピーします。
img1
そして、DxLibSaver.dswをダブルクリックしてVisualC++を起動して下さい。
できればDxLib.hをプロジェクトに追加しましょう^^
(いや、しなくてもいいけど気持で^^)
img2
さて、早速取り掛かりましょう。
まずはFileViewをクリックしてDxLibSaver.cppを開いてください。
おなじみのWinMainが書いています。
ぶっちゃけこのまんまでコンパイルするとサンプルのスクリーンセーバーが作成されます。
しかし、自分で組まないと良く分からないので順を追って説明していきます。
チュートリアル形式って言うのかな?
img3
まず、このライブラリを使うには以下のような手順があります。

DxLibScreenSaverInit関数を呼ぶ。

その戻り値がenuSSaverFullScreenだったらDxLibの関数を使って処理をする。

戻り値がenuSSaverFullScreenの場合に限り、DxLibScreenSaverEnd関数を呼んで終了する

こんな感じです。
デフォルトの設定で作るのでDxLibScreenSaverInitの
第三引数はIDD_DIALOG1
第四引数はMyDefDlgProc
です。
関数の説明は説明書のほうを見てください。

DxLibSaver.cppより引用
 int r;
 r=DxLibScreenSaverInit(
   &hInstance,//WinMainの第一引数をぶち込む
   &lpCmdLine,//WinMainの第三引数をぶち込む
   IDD_DIALOG1,//デフォルト
   MyDefDlgProc );//デフォルト
 
 //もし戻り値がenuSSaverFullScreenならば
 if(r==enuSSaverFullScreen){
   //なんらかの処理
  DxLibScreenSaverEnd();
 }
img4
DxLibScreenSaverLibraryを使用するに当たっての注意

1.本家のDxLibとデフォルト初期化が違う

さて、DxLibScreenSaverInit関数では本家のDxLib_Init関数とは違ったデフォルト初期化をします。
以下がその初期化のリストです。

  • デフォルトでバックバッファに画像を書きこむ
    SetDrawScreen(DX_SCREEN_BACK);
  • パスワードダイアログを表示するので隠れ関数のSetUseGDIFlagを使う。
    この関数はGDIで描画できるようにするらしい
    SetUseGDIFlag(TRUE);
  • エラーログは吐き出さない
    SetOutApplicationLogValidFlag(FALSE ) ;
このような設定になっています。
また、内部で二重起動防止策もしています。

2.フロントバッファに書きこむのはやめよう

なんらかの不具合がでるからです。良い子も悪い子もやめましょう^^
厳禁です。
SetDrawScreen(DX_SCREEN_FRONT);

3.外部ファイルは使えません(多分)

外部ファイルは使えないみたいです。^^;ってかデスクトップにファイル置くわけにはいかないし
よってスクリーンセーバーに使う画像、音楽、効果音はリソース。
せーブ等のデータは全てレジストリに格納します。(私の方法ではこうやってます)
忌み嫌われているレジストリですが、結構便利だなぁ〜と思ってます。
レジストリに登録する関数は用意していますが、ここでの解説は控えます。
いずれ説明書に書くでしょう。

4.画像読込みにDxLibの隠れ関数を使います

画像をリソースからロードするので、
LoadGraphToResourceという関数を使います。
int result=LoadGraphToResource(リソースのID);みたいな感じで使います。
LoadGraphと同じようなものです^^;LoadDivGraphToResourceは執筆時には無いみたいです。
img5

1.キーを押すとすぐに終了するぷろぐらむ(DxLibと同じ^^;

さて早速サンプルプログラムでも^^

さて、このサンプルを実行してみてください。簡単ですよね^^;
C言語とDxLibに精通していれば分かるはずです。
ただの黒い画面が表示されるはずです。
そして、なにかボタンを押せば終了!
なんて簡単な^^;
つまり”注:1”から以降はDxLibの関数が使用できます。って事。
分からない関数に付いてはわたしの説明書DxLibのページで知ることができます。

実は私としては教える立場は慣れてないもので^^;ごめんなさい。分かりにくかったら。
さて、次いってみましょう!

2.よりスクリーンセーバーらしく

スクリーンセーバーの機能はすべてもりこんであります。
ただし、画像無し。音楽無しです。黒い画面が表示されます。

どうですか?スクリーンセーバーにパスワードの設定をかけていればパスワードのダイアログが表示されます。
新しい関数でProcessMessageとCheckPasswdがでてきましたねぇ^^
ProcessMessageはDxLib上ではループするときに必ず呼び出してください。というふうに私は考えてます。
くわしくはDxLibのページへ^^
CheckPasswdはパスワードのダイアログを表示しなければならない(マウスを動かしたとかキーボードに触ったとか)状態になったとき パスワードのダイアログを表示します。
引数にfalseを入れてますが、trueにするとパスワード入力が成功するとすぐに終了します。
また、パスワードが設定されて無い場合はマウスを動かしたりキーボードに触った場合すぐ終了するように作られています。
バグがあったらごめんなさいm(_ _;)m

3.グラフィカルなスクリーンセーバーへ

こんな黒いスクリーンセーバーなんて糞だぜぇ ̄m ̄
確かに! (・。・)b
よってグラフィカルなスクリーンセーバーに挑戦しましょう。
おやや、■が沢山、描画されますね^^
こんなんは誰でも出来る!!このバカチンが〜!!!  川`0´)/☆#T。T) アウッ!
まぁ、冗談です^^;(笑えない)
下が本命。 デフォルトプロジェクトにはリソースに私の作った画像がIDB_BITMAP1として納められています。
それをLoadGraphToResourceで読込みます。
この関数に付いては前に説明しましたよね^^
それを読込み戻りとを受け取り、DrawGraphの第三引数に渡しています。
これで普通に画像が表示されます(ってーかそれだけかよ。
しかし、これだけ分かればもうあなたは普通にスクリーンセーバーが組めるのではないでしょうか?
時間の都合もあり。今回の執筆はここまでにさせていただきます。すみません。
サンプルとしては、nsaverDxlib.cppにBYTE SaverInit01(),BYTE SaverInit00()等があります。
サンプルになるとは私も正直おもいませんが、どうかご活用ください。
分からないことがあれば掲示板へ

このスクリーンセーバライブラリの作成に協力してくださった、
山田 巧 様
新坂 様
この場を借りてお礼申し上げます。

2002年11月2日
最初から作る
DxLibFanに戻る DxLibのダウンロードは以下から
Dxライブラリ置き場
DxLib Copyright(C) 山田 巧

The program using DxLib.
The text of this page.
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送