ページ 11

DXライブラリでsnapshot

Posted: 2009年12月14日(月) 23:04
by むつ
DXライブラリでsnapshotが撮れると聞いたのですが、
これはどの関数を使ってどのように使えばいいのでしょうか?
保存方法も分かる方がいましたら教えてください

Re:DXライブラリでsnapshot

Posted: 2009年12月14日(月) 23:18
by 山崎
こんばんは。

おそらく、GetDrawScreenGraphのことでしょうかな?

使い方は、本家DXライブラリのリファレンスページを読むほうが早いでしょう。
サンプルコードがありますので、それをご覧になるとわかりやすいかと思います。
ご存じでしょうが、こちらです。
ttp://homepage2.nifty.com/natupaji/DxLib/dxfunc.html

「保存方法」とは、
「キャプチャーした画面を、画像ファイルとして保存する方法」ということでしょうかな?
それとも、グラフィックハンドルとして保存する、ということでしょうか?

Re:DXライブラリでsnapshot

Posted: 2009年12月14日(月) 23:20
by むつ
ありがとうございます。
キャプチャーした画面を、画像ファイルとして保存する方法です。
どうやって、指定したフォルダ等の中に名前を指定してつけて保存するのかが分からないです。

Re:DXライブラリでsnapshot

Posted: 2009年12月14日(月) 23:22
by 山崎
おおっとすいません!!

正しくは、こちらの関数でした。
SaveDrawScreen です。

これなら、一発で画面のスクリーンショットを撮れます。
こちらも、本家のリファレンスページを参照するのが一番いいと思います。

「その他」の方にあったので見落としていました、申し訳ないです…。

Re:DXライブラリでsnapshot

Posted: 2009年12月14日(月) 23:23
by チルチル
こんな感じでどうですか?
#include <shlwapi.h>
#pragma comment( lib , "shlwapi.lib" )
void SnapShot(void){
    if( CheckHit_Switch(KEY_INPUT_P) ){
        for( int i=0;i<1000;i++ ){
            char str[64];
            sprintf( str , "SnapShot/ss%03d.bmp" , i );
            if( PathFileExists(str)==0 ){
                SaveDrawScreen( 0 , 0 , 640 , 480 , str );
                break;
            }
        }
    }
}

Re:DXライブラリでsnapshot

Posted: 2009年12月14日(月) 23:34
by むつ
チルチルさんの方法で試してみると、エラーが発生したのですが、
これはどう対処すればいいのでしょうか?
error C3861: 'sprintf' の宣言を確認してください。
error C2664: 'PathFileExists': 識別子が見つかりませんでした


PathFileExistsって何ですか?

Re:DXライブラリでsnapshot

Posted: 2009年12月14日(月) 23:45
by Libra
>>チルチルさん

実行してないですが、

for( int i=0;i<1000;i++ ){

↑ループ1000回も回して大丈夫でしょうか?

Re:DXライブラリでsnapshot

Posted: 2009年12月15日(火) 00:43
by 初心者
#include <shlwapi.h>
#pragma comment( lib , "shlwapi.lib" )
って何ですか?

Re:DXライブラリでsnapshot

Posted: 2009年12月15日(火) 00:45
by チルチル
>PathFileExistsって何ですか?

失礼、説明不足でしたね

PathFileExists関数はshlwapi.hで宣言されていて、引数に渡したファイルが存在すれば0を返します

sprintf関数はたしかstdio.hで宣言されていて書式付き文字列を出力します
DxLib.h内でstdio.hがインクルードされているので使えると思います

関数の前に

#include "DxLib.h"
#include <shlwapi.h>
#pragma comment( lib , "shlwapi.lib" )

が書いてあれば行けると思うんですけどね・・

#pragma comment( lib , "shlwapi.lib" )

は必要ないかもしれませんが・・

>↑ループ1000回も回して大丈夫でしょうか?

これはss000.bmp~ss999.bmpまでのスナップショットが
取れると言う意味なので実際に1000回も回らないと思います

SnapShotフォルダにss000.bmpが無ければ、その名前で保存して終了

あれば次は
SnapShotフォルダにss001.bmpが無ければ、その名前で保存して終了

と言う風に続いて行くので最初の5回ぐらいでループから抜けると思います

>#include <shlwapi.h>
>#pragma comment( lib , "shlwapi.lib" )
>って何ですか?

私も同じ質問をした時に教えていただいたので良く知りませんが
おそらく標準ライブラリの1つです

Re:DXライブラリでsnapshot

Posted: 2009年12月15日(火) 00:52
by むつ
詳しい解説ありがとうございます!

ただ、この
if( PathFileExists(str)==0 ){
部分でエラーが新しくでて、
error C2664: 'PathFileExistsW' : 1 番目の引数を 'char [64]' から 'LPCWSTR' に変換できません。
実行できないのですが、どうしたらエラーが外せるのでしょうか?

Re:DXライブラリでsnapshot

Posted: 2009年12月15日(火) 00:59
by Libra
breakを見落としていました^^;


>>LPCWSTR
プロジェクトの文字セットの設定がUnicodeになっていると思います。
マルチバイト文字に変更すると良いと思います。

Re:DXライブラリでsnapshot

Posted: 2009年12月15日(火) 01:00
by チルチル
う~んそれは私にもわからないですね
私の所ではコンパイルが通るので環境的な問題かもしれません

とりあえずコード全部作ってみたので実行してみてください

Pを押すとスナップショットを撮ります

実行する前に作業ディレクトリにSnapShotフォルダを作成しておいてくださいね

sprintf関数は別の関数を推奨しているようです
それが何かは知らないですが・・

Re:DXライブラリでsnapshot

Posted: 2009年12月15日(火) 01:05
by むつ
念のために聞きたいのですが、
マルチバイト文字に変更する以外の方法はないでしょうか?

Re:DXライブラリでsnapshot

Posted: 2009年12月15日(火) 01:11
by チルチル
また違う方法で代用すればできると思いますが
DXライブラリ自体がマルチバイト文字で動くのでマルチバイト文字にした方が良いと思います

それから上のコードなんですがフォルダが無い場合に作成してくれる機能は無いので
アレを使う場合は「SnapShotフォルダを消さないでください」ってどこかに書いた方が良いと思います・・

Re:DXライブラリでsnapshot

Posted: 2009年12月15日(火) 01:20
by むつ
なるほど。分かりました。ありがとうございます。

あれ?でも今度は
error LNK2019: 未解決の外部シンボル __imp__PathFileExistsA@4 が関数 _WinMain@16 で参照されました。
というエラーに変わっただけなのですが・・

Re:DXライブラリでsnapshot

Posted: 2009年12月15日(火) 01:30
by チルチル
う~ん、どうもリンクに失敗しているようですが私の時は

#pragma comment( lib , "shlwapi.lib" )

これで解決できたんですが、今回はまだ足りないようですね・・

プロジェクトの設定が怪しいですが
これは私の手には負えないので誰か手助けをお願いします

Re:DXライブラリでsnapshot

Posted: 2009年12月15日(火) 02:19
by y
ソリューションのクリーン→ソリューションのビルド
もしくは、
ソリューションのリビルド
を実行しても出来ませんでしょうか。

あと、SnapShotフォルダが見つからないときは、
CreateDirectory関数なんかでフォルダを作ってあげると親切かもしれません。

Re:DXライブラリでsnapshot

Posted: 2009年12月15日(火) 20:10
by むつ
実行してみましたが、特にエラーは消えませんでしたが・

Re:DXライブラリでsnapshot

Posted: 2009年12月15日(火) 21:43
by y
どう考えてもshlwapi.libをリンクできていないようなのですが…。

新しいプロジェクトを作って、設定をDxLibを導入するときと同じ設定に変えてから、
以下のプログラムをそのままコピペしてコンパイルしてみてください。
#include <windows.h>
#include <shlwapi.h>

#pragma comment(lib, "shlwapi.lib")

int WINAPI WinMain(HINSTANCE, HINSTANCE, char *, int)
{
        ::PathFileExists("test.txt");
        
        return EXIT_SUCCESS;
}
これで実行できれば、変な設定を行っている(行われている)場合があります。
その場合は、新しいプロジェクトに移すといいかもしれません。

実行できなければ…すみません、私もわかりません。

Re:DXライブラリでsnapshot

Posted: 2009年12月15日(火) 23:22
by ねこ
昔そのリンクの仕方を教えたような気がするので一応。

まず「shlwapi.lib」は標準ライブラリではなかったような気が・・・
むつさんの環境次第ではライブラリ自体が無い可能性があります。

関数自体はチルチルさんが気を利かせて作った処理を実行するのに必要なものですが
主題であるのはスナップショットなので「SaveDrawScreen」だけ実行したのでいいんじゃないでしょうか?

Re:DXライブラリでsnapshot

Posted: 2009年12月15日(火) 23:31
by むつ
龍神録でスナップショットは撮ることできないのですか?

Re:DXライブラリでsnapshot

Posted: 2009年12月16日(水) 00:44
by チルチル
>まず「shlwapi.lib」は標準ライブラリではなかったような気が・・・

確かに一覧に軽く目を通しても見つからないので違うかもしれませんね
とりあえずVC++およびBCCではあるみたいですが、むつさんの環境は何ですか?

>主題であるのはスナップショットなので「SaveDrawScreen」だけ実行したのでいいんじゃないでしょうか?

そう言えば主題はそっちでしたね・・失礼しました
とりあえずSaveDrawScreen関数の使い方はわかって頂けたと思うので
後はyさんの指摘してくれた機能などを実現する関数を探して組み込めば完成すると思います

>龍神録でスナップショットは撮ることできないのですか?

見た感じは無いようですね