DXライブラリでsnapshot

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
むつ

DXライブラリでsnapshot

#1

投稿記事 by むつ » 15年前

DXライブラリでsnapshotが撮れると聞いたのですが、
これはどの関数を使ってどのように使えばいいのでしょうか?
保存方法も分かる方がいましたら教えてください

山崎

Re:DXライブラリでsnapshot

#2

投稿記事 by 山崎 » 15年前

こんばんは。

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

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

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

むつ

Re:DXライブラリでsnapshot

#3

投稿記事 by むつ » 15年前

ありがとうございます。
キャプチャーした画面を、画像ファイルとして保存する方法です。
どうやって、指定したフォルダ等の中に名前を指定してつけて保存するのかが分からないです。

山崎

Re:DXライブラリでsnapshot

#4

投稿記事 by 山崎 » 15年前

おおっとすいません!!

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

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

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

チルチル

Re:DXライブラリでsnapshot

#5

投稿記事 by チルチル » 15年前

こんな感じでどうですか?
#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

#6

投稿記事 by むつ » 15年前

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


PathFileExistsって何ですか?

Libra

Re:DXライブラリでsnapshot

#7

投稿記事 by Libra » 15年前

>>チルチルさん

実行してないですが、

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

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

初心者

Re:DXライブラリでsnapshot

#8

投稿記事 by 初心者 » 15年前

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

チルチル

Re:DXライブラリでsnapshot

#9

投稿記事 by チルチル » 15年前

>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

#10

投稿記事 by むつ » 15年前

詳しい解説ありがとうございます!

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

Libra

Re:DXライブラリでsnapshot

#11

投稿記事 by Libra » 15年前

breakを見落としていました^^;


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

チルチル

Re:DXライブラリでsnapshot

#12

投稿記事 by チルチル » 15年前

う~んそれは私にもわからないですね
私の所ではコンパイルが通るので環境的な問題かもしれません

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

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

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

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

むつ

Re:DXライブラリでsnapshot

#13

投稿記事 by むつ » 15年前

念のために聞きたいのですが、
マルチバイト文字に変更する以外の方法はないでしょうか?

チルチル

Re:DXライブラリでsnapshot

#14

投稿記事 by チルチル » 15年前

また違う方法で代用すればできると思いますが
DXライブラリ自体がマルチバイト文字で動くのでマルチバイト文字にした方が良いと思います

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

むつ

Re:DXライブラリでsnapshot

#15

投稿記事 by むつ » 15年前

なるほど。分かりました。ありがとうございます。

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

チルチル

Re:DXライブラリでsnapshot

#16

投稿記事 by チルチル » 15年前

う~ん、どうもリンクに失敗しているようですが私の時は

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

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

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

y

Re:DXライブラリでsnapshot

#17

投稿記事 by y » 15年前

ソリューションのクリーン→ソリューションのビルド
もしくは、
ソリューションのリビルド
を実行しても出来ませんでしょうか。

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

むつ

Re:DXライブラリでsnapshot

#18

投稿記事 by むつ » 15年前

実行してみましたが、特にエラーは消えませんでしたが・

y

Re:DXライブラリでsnapshot

#19

投稿記事 by y » 15年前

どう考えても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

#20

投稿記事 by ねこ » 15年前

昔そのリンクの仕方を教えたような気がするので一応。

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

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

むつ

Re:DXライブラリでsnapshot

#21

投稿記事 by むつ » 15年前

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

チルチル

Re:DXライブラリでsnapshot

#22

投稿記事 by チルチル » 15年前

>まず「shlwapi.lib」は標準ライブラリではなかったような気が・・・

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

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

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る