トップページ > 記事閲覧
DX アーカイブについて
名前:ジンセイ 日時: 2014/03/11 21:18

DX アーカイブデータをリソースとして実行ファイルに埋め込んで、 DX アーカイブ機能を使用したいと考えています。 DxLib.h をざっと眺めてみたところ実現出来そうな関数は見当たりませんでしたが、 DXArchivePreLoad()という関数が DX アーカイブデータのファイルパス渡しになっていたので、 ファイルパス渡しではなくメモリ上の DX アーカイブデータを 渡せる関数を追加すれば実現出来るのではと思ったのですが可能でしょうか? ご多忙の折、恐縮ではございますが、 実現可能ということであれば対応頂けると幸いです。
メンテ

Page: 1 |

Re: DX アーカイブについて ( No.1 )
名前:softya(ソフト屋) 日時:2014/03/11 21:46

実行ファイルが巨大化するのですが、それはよろしいのでしょうか? つまり、常駐メモリ用がすごく増えます。
メンテ
Re: DX アーカイブについて ( No.2 )
名前:ジンセイ 日時:2014/03/11 23:52

実行ファイルが「巨大化」するかは使用するリソースのサイズに因ります メモリ使用量が「すごく」増えるかどうかも同様です
メンテ
Re: DX アーカイブについて ( No.3 )
名前:管理人 日時:2014/03/12 01:16

DXライブラリ内部にはメモリ上に展開されたDXアーカイブを扱うための 機能が既にあります ただ、それは通常のDXアーカイブの機能である 『DXアーカイブをファイルシステム上のフォルダに見立てる』 というものではなく、メモリ上のDXアーカイブから指定のファイルが 格納されているメモリアドレスとファイルサイズを取得するだけの機能や、 せいぜい FileRead_open, FileRead_read, FileRead_close でファイル内容に アクセスする程度の機能しかありません その機能だけでも問題ないとのことでしたら直ぐに使うことができますが、 そうではなくメモリ上に展開されたDXアーカイブをファイルシステム上の フォルダに見立てる機能をご所望でしたら、まだ機能が無いので実装するだけの お時間を頂くことになります
メンテ
Re: DX アーカイブについて ( No.4 )
名前:ジンセイ 日時:2014/03/12 18:50

返信ありがとうございます。 こちらの希望と致しましては、 ファイルかメモリかの違いを意識せずに FileRead*、LoadGraph*、LoadSound* などの関数を、 ファイル版DXアーカイブと同じインターフェース(ファイルパス渡し)で使用出来ればと思っています。 お時間がある時にでも対応して頂けるとうれしい限りでございます。 お手数おかけしますが、宜しくお願いいたします。
メンテ
Re: DX アーカイブについて ( No.5 )
名前:管理人 日時:2014/03/16 11:18

メモリ上に展開したDXアーカイブを特定のパス上に存在するものとして扱うための関数を追加しました よろしければこちらのバージョンをダウンロードしてください http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) 追加した関数は以下の二つです // メモリ上に展開されたDXAファイルを指定のファイルパスにあることにする // ( EmulateFilePath は見立てる dxa ファイルのパス、 // 例えばDXAファイルイメージを Image.dxa というファイル名で c:\Temp にあることにしたい場合は // EmulateFilePath に "c:\\Temp\\Image.dxa" を渡す、 // SetDXArchiveExtension で拡張子を変更している場合は EmulateFilePath に渡すファイルパスの拡張子も //  それに合わせる必要あり ) int DXArchiveSetMemImage( void *ArchiveImage, int ArchiveImageSize, const TCHAR *EmulateFilePath, int ArchiveImageCopyFlag = FALSE ) ; // DXArchiveSetMemImage の設定を解除する int DXArchiveReleaseMemImage( void *ArchiveImage ) ; DXArchiveSetMemImage でメモリに読み込んだDXアーカイブを EmulateFilePath で指定する ファイルパスにあることにすることができます、 必要がなくなった場合は DXArchiveReleaseMemImage でその設定を解除します ArchiveImageCopyFlag を TRUE にすると ArchiveImage の内容を丸ごとコピーして使用するので、 DXArchiveSetMemImage の直後に ArchiveImage が示すメモリ領域を解放してしまっても大丈夫になります ( が、コピー用のメモリ確保とそのメモリ領域へのコピーの処理が発生します ) こちらにサンプルプログラムを載せておきますので、よろしければご覧ください // C:\Game\DataFile\Image.dxa を C:\Temp に存在することにしたあと、Image.dxa の中の PlayerImage.bmp を読み込む #include "DxLib.h" #include <malloc.h> int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ) { int GrHandle ; int FileHandle ; void *FileImage ; int FileImageSize ; ChangeWindowMode( TRUE ) ; if( DxLib_Init() == -1 ) return -1; // DXアーカイブファイルを丸ごとメモリに読み込む FileImageSize = FileRead_size( "C:\\Game\\DataFile\\Image.dxa" ) ; FileImage = malloc( FileImageSize ) ; FileHandle = FileRead_open( "C:\\Game\\DataFile\\Image.dxa" ) ; FileRead_read( FileImage, FileImageSize, FileHandle ) ; FileRead_close( FileHandle ) ; // 読み込んだDXアーカイブファイルを C:\Temp に存在することにする DXArchiveSetMemImage( FileImage, FileImageSize, "C:\\Temp\\Image.dxa" ) ; // C:\Temp\Image.dxa の中の PlayerImage.bmp を読み込む GrHandle = LoadGraph( "C:\\Temp\\Image\\PlayerImage.bmp" ) ; // 読み込んだ画像を画面に描画する DrawGraph( 0, 0, GrHandle, FALSE ) ; WaitKey() ; // C:\Temp に存在することにする設定を解除する DXArchiveReleaseMemImage( FileImage ) ; // 読み込むために確保したメモリを解放する free( FileImage ) ; DxLib_End() ; return 0 ; }
メンテ
Re: DX アーカイブについて ( No.6 )
名前:ジンセイ 日時:2014/03/16 19:21

早速のご対応ありがとうございます。 確認してみましたが printfDx が正常に表示出来ないようです。 それともう一つ問題があるのですが、 実行ファイルにDXアーカイブを埋め込んだ場合、 リソースが ROM に配置されているようで、 ArchiveImageCopyFlag を TRUE にするとメモリアクセス違反が起こってしまいました。 そうなると実行ファイルにDXアーカイブを埋め込んだ場合、 リソースサイズの倍メモリを使うことになってしまいます。 DXArchiveSetMemImage では ArchiveImage をコピーせず、 LoadGraph 等の関数が呼ばれた時に指定されたファイルだけを その時にコピーするという風に出来ないでしょうか? 宜しくお願い致します。
メンテ
Re: DX アーカイブについて ( No.7 )
名前:ジンセイ 日時:2014/03/16 19:22

すみません誤記がありました。 - ArchiveImageCopyFlag を TRUE にするとメモリアクセス違反が起こってしまいました。 + ArchiveImageCopyFlag を FALSE にするとメモリアクセス違反が起こってしまいました。
メンテ
Re: DX アーカイブについて ( No.8 )
名前:管理人 日時:2014/03/21 22:14

> 確認してみましたが printfDx が正常に表示出来ないようです。 すみません、不具合を確認しました、修正しました > 実行ファイルにDXアーカイブを埋め込んだ場合、 > リソースが ROM に配置されているようで、 > ArchiveImageCopyFlag を TRUE にするとメモリアクセス違反が起こってしまいました。 渡したファイルイメージの内容を書き換えるかどうかを指定する引数を追加しました int DXArchiveSetMemImage( void *ArchiveImage, int ArchiveImageSize, const TCHAR *EmulateFilePath, int ArchiveImageCopyFlag = FALSE, int ArchiveImageReadOnly = TRUE // ←こちら ) ; デフォルトではイメージを書き換えないようにしました よろしければ上記の変更と printfDx の修正をしたこちらのバージョンをお試しください http://homepage2.nifty.com/natupaji/DxLib/DxLibVCTest.exe // VisualC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibBCCTest.exe // BorlandC++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_DevCppTest.exe // Dev-C++ 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibGCC_MinGWTest.exe // MinGW 用 http://homepage2.nifty.com/natupaji/DxLib/DxLibDotNet.zip // .NET用 http://homepage2.nifty.com/natupaji/DxLib/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: DX アーカイブについて ( No.9 )
名前:ジンセイ 日時:2014/03/22 12:36

修正ありがとうございます! 問題なく動作しています。 管理人様の丁寧で迅速な対応に感謝致します。 ありがとうございました。
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存