トップページ > 過去ログ > 記事閲覧
配列にロードした画像が・・・
名前:gucci 日時: 2010/04/21 00:06

ゲームに使用する画像をLoadDivGraphで分割していましたが、 突然一部配列内の画像が表示できたり、できなかったりします。 (当たり判定等は存在するので、画像のロードの問題のようです。) グローバル変数等を多様しているので、メモリの確保がおかしくなっているのでしょうか?

Page: 1 |

Re: 配列にロードした画像が・・・ ( No.1 )
名前:いっち 日時:2010/04/21 01:16

判断できないので、事象の再現するソースをご提供頂けますでしょうか?
Re: 配列にロードした画像が・・・ ( No.2 )
名前:gucci 日時:2010/04/21 23:25

返信ありがとうございます。 ソースですが、かなりの量になってしまっているので こちらに全て掲載するのは無理そうです。 プログラム実行前に、 LoadDivGraph( "img/map00.png" , 50 , 10 , 5 , 16 , 16 , maptip1 ) ; といった画像ロードを数十回行っていますが、 実際に画像を表示する順番によってDrawGraphの戻値が変わってしまいます。 デバッグ時に表示されるメッセージ(デバッグ開始〜プログラム終了)は次の通りです。 'nigasln.exe': 'C:\Users\gucci\Documents\nigaproject\niga_source\niga_source_091019\Release\nigasln.exe' を読み込みました。シンボルが読み込まれました。 'nigasln.exe': 'C:\Windows\System32\ntdll.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\kernel32.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\user32.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\gdi32.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\advapi32.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\rpcrt4.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\winmm.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\msvcrt.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\ole32.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\oleaut32.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\oleacc.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\wsock32.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\ws2_32.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\nsi.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\imm32.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\msctf.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\msacm32.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\shell32.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\shlwapi.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\shimeng.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\apphelp.dll' を読み込みました 'nigasln.exe': 'C:\Windows\AppPatch\AcLayers.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\userenv.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\secur32.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\winspool.drv' を読み込みました 'nigasln.exe': 'C:\Windows\System32\mpr.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\lpk.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\usp10.dll' を読み込みました 'nigasln.exe': 'C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_6.0.6002.18005_none_5cb72f96088b0de0\comctl32.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\uxtheme.dll' を読み込みました 'nigasln.exe': 'C:\Program Files\Stardock\ObjectDock\DockShellHook.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\IMJP12.IME' を読み込みました 'nigasln.exe': 'C:\Windows\System32\IMJP12.IME' をアンロード 'nigasln.exe': 'C:\Windows\System32\IMJP12.IME' を読み込みました 'nigasln.exe': 'C:\Windows\System32\version.dll' を読み込みました 'nigasln.exe': 'C:\Windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4053_none_d08d7da0442a985d\msvcr80.dll' を読み込みました 'nigasln.exe': 'C:\Windows\winsxs\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.0.50727.4053_none_d08d7da0442a985d\msvcp80.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\IMJP12K.DLL' を読み込みました 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\IMEJP\IMJPAPI.DLL' を読み込みました 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\SHARED\IMJKAPI.DLL' を読み込みました 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\IMEJP\IMJPPRED.DLL' を読み込みました 'nigasln.exe': 'C:\Windows\System32\clbcatq.dll' を読み込みました 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\IMEJP\IMJPTIP.DLL' を読み込みました 'nigasln.exe': 'C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6001.18000_none_886786f450a74a05\comctl32.dll' を読み込みました 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\SHARED\IMETIP.DLL' を読み込みました 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\SHARED\IMECFM.DLL' を読み込みました 'nigasln.exe': 'C:\Windows\System32\rsaenh.dll' を読み込みました 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\IMEJP\IMJPCMPS.DLL' を読み込みました スレッド 'Win32 スレッド' (0x1154) はコード 1 (0x1) で終了しました。 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\SHARED\IMECFM.DLL' をアンロード 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\SHARED\IMETIP.DLL' をアンロード 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\IMEJP\IMJPTIP.DLL' をアンロード 'nigasln.exe': 'C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6001.18000_none_886786f450a74a05\comctl32.dll' をアンロード 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\IMEJP\IMJPCMPS.DLL' をアンロード システムの情報を出力します DXライブラリ Ver2.25 OS WindowsVista ( Build 6002 Service Pack 2 ) CPU動作速度:大体1.45GHz MMX命令を使用します SSE命令が使用可能です SSE2命令が使用可能です CPUベンダ:GenuineIntel CPU名:Intel(R) Celeron(R) M CPU 520 @ 1.60GHz COMの初期化... 成功しました メモリ総量:1917.39MB 空きメモリ領域:1007.72MB 1007.72MB タイマーの精度を検査します 精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 パフォーマンスカウンターを使用します タイマー分解能 : 14318.180000 KHz ソフトの二重起動検査... 二重起動はされていませんでした ウインドウクラスを登録します... 登録に成功しました ウインドウモード起動用のウインドウを作成します IMEを無効にしました 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\IMEJP\IMJPTIP.DLL' を読み込みました 'nigasln.exe': 'C:\Windows\winsxs\x86_microsoft.windows.common-controls_6595b64144ccf1df_5.82.6001.18000_none_886786f450a74a05\comctl32.dll' を読み込みました 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\SHARED\IMETIP.DLL' を読み込みました 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\SHARED\IMECFM.DLL' を読み込みました 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\IMEJP\IMJPCMPS.DLL' を読み込みました ウインドウスタイルをウインドウモード用に変更します... 完了 DirectInput関係初期化処理 DirectInput7 の取得中... 'nigasln.exe': 'C:\Windows\System32\dinput.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\hid.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\setupapi.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\wintrust.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\crypt32.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\msasn1.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\imagehlp.dll' を読み込みました 成功 引き続き初期化処理... 初期化成功 ジョイパッドの初期化... ジョイパッドの初期化は正常に終了しました マウスデバイスの初期化... 初期化成功 キーボードデバイスの初期化... 初期化成功 DirectInput 関連の初期化は正常に終了しました DirectSound の初期化を行います DirectSound インターフェースの取得を行います.... 'nigasln.exe': 'C:\Windows\System32\dsound.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\powrprof.dll' を読み込みました 成功 引き続きインターフェースの初期化処理... 'nigasln.exe': 'C:\Windows\System32\MMDevAPI.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\AudioSes.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\AudioEng.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\psapi.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\avrt.dll' を読み込みました 成功 DirectSound デバイスを列挙します モジュール名: ドライバ記述:プライマリ サウンド ドライバ モジュール名:{0.0.0.00000000}.{19078da7-cd13-43a9-9525-220d5ae083cb} ドライバ記述:スピーカー (Realtek High Definition Audio) 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 利用可能サンプリング精度 プライマリ 16bit = OK 8bit = OK セカンダリ 16bit = OK 8bit = OK 利用可能チャンネル プライマリ MONO = OK STEREO = OK セカンダリ MONO = OK STEREO = OK DirectSound の初期化は正常に終了しました DirectDraw 関連の初期化を行います DirectDraw オブジェクトの取得を行います.... 'nigasln.exe': 'C:\Windows\System32\ddraw.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\dciman32.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\dwmapi.dll' を読み込みました 成功 引き続き初期化処理... 'nigasln.exe': 'C:\Windows\System32\atiumdag.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\atiumdva.dll' を読み込みました 初期化に成功しました ビデオカードの情報 画面モード変更処理を開始します 画面モードの変更処理を開始します 640 x 480 16 bit ウインドウモードにします 画面モードの変更は正常に終了しました カラー情報 A:00000000 B:00ff0000 G:0000ff00 B:000000ff ウインドウスタイルをウインドウモード用に変更します... 完了 出力画面用の DirectDrawSurface を作成します 各スクリーンメモリの配置位置 PrimaryBuffer : VIDEOMEMORY BaskBuffer : VIDEOMEMORY 出力画面用の DirectDrawSurface の作成は正常に終了しました Direct3D 関連の初期化を行います Direct3Dオブジェクトを取得します 'nigasln.exe': 'C:\Windows\System32\d3dim700.dll' を読み込みました Direct3Dオブジェクトを取得しました HALデバイスを発見しました ハードウエアT&Lデバイスを発見しました 3Dデバイスを作成します... 3Dデバイスの作成に成功しました テクスチャ最大幅:2048 最小幅:1 描画制限: D_D3DPTEXTURECAPS_POW2 = 1 D_D3DPTEXTURECAPS_SQUAREONLY = 0 最大テクスチャステージ数 = 8 最大テクスチャブレンド数 = 8 テクスチャピクセルフォーマット 通常グラフィック用 BIT:16 RED:5 GREEN:5 BLUE:5 RED:007c00 GREEN:0003e0 BLUE:00001f BIT:32 RED:8 GREEN:8 BLUE:8 RED:ff0000 GREEN:00ff00 BLUE:0000ff アルファチャンネル付きグラフィック用 BIT:16 ALPHA:4 RED:4 GREEN:4 BLUE:4 ALPHA:0000f000 RED:00000f00 GREEN:000000f0 BLUE:0000000f BIT:32 ALPHA:8 RED:8 GREEN:8 BLUE:8 ALPHA:ff000000 RED:00ff0000 GREEN:0000ff00 BLUE:000000ff Direct3D 関連の初期化は正常に終了しました グラフィック管理系の初期化を行います 3Dグラフィック描画機能を使用します フォントの初期化を行います フォントの初期化は正常に終了しました グラフィック管理系の初期化は正常に終了しました サーフェス間転送には BltFast を使用します BitBlt:1298045μs BltFast:345143μs スキャンラインの数:768 1フレーム当たりの時間は 17 msecです Tri00:17 msec Tri01:17 msec Tri02:16 msec Tri03:16 msec 画面モード変更処理は正常に終了しました DirectDraw 関連の初期化は正常に終了しました 文字コードバッファの初期化を行います... 完了しました スレッド 'Win32 スレッド' (0x1448) はコード 0 (0x0) で終了しました。 スレッド 'Win32 スレッド' (0x30c) はコード 0 (0x0) で終了しました。 スレッド 'Win32 スレッド' (0x135c) はコード 0 (0x0) で終了しました。 DirectSound の終了処理は正常に終了しました DirectSound8 の初期化を行います 'nigasln.exe': 'C:\Windows\System32\dmloader.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\dmusic.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\ksuser.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\dmime.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\wdmaud.drv' を読み込みました 'nigasln.exe': 'C:\Windows\System32\msacm32.drv' を読み込みました 'nigasln.exe': 'C:\Windows\System32\midimap.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\dmsynth.dll' を読み込みました 出力ポート Device0:Microsoft MIDI Mapper [エミュレート済み] 出力ポート Device1:Microsoft GS Wavetable Synth [エミュレート済み] 出力ポート Device2:Microsoft Synthesizer 'nigasln.exe': 'C:\Windows\System32\dsdmo.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\msdmo.dll' を読み込みました DirectSound デバイスを列挙します モジュール名: ドライバ記述:プライマリ サウンド ドライバ モジュール名:{0.0.0.00000000}.{19078da7-cd13-43a9-9525-220d5ae083cb} ドライバ記述:スピーカー (Realtek High Definition Audio) 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 利用可能サンプリング精度 プライマリ 16bit = OK 8bit = OK セカンダリ 16bit = OK 8bit = OK 利用可能チャンネル プライマリ MONO = OK STEREO = OK セカンダリ MONO = OK STEREO = OK DirectSound の初期化は正常に終了しました 'nigasln.exe': 'C:\Windows\System32\l3codeca.acm' を読み込みました 'nigasln.exe': 'C:\Windows\System32\dmstyle.dll' を読み込みました 'nigasln.exe': 'C:\Windows\System32\dmband.dll' を読み込みました ウインドウを閉じようとしています スレッド 'Win32 スレッド' (0x1594) はコード 1 (0x1) で終了しました。 'nigasln.exe': 'C:\Program Files\Common Files\microsoft shared\IME12\SHARED\IMECFM.DLL' をアンロード ウインドウが破棄されようとしています ソフトを終了する準備が整いました スレッド 'Win32 スレッド' (0x139c) はコード 0 (0x0) で終了しました。 DirectDraw 関連の終了処理をおこないます フォントの初期化を行います フォントの初期化は正常に終了しました グラフィック管理系の終了処理は正常に終了しました Direct3D 関連の終了処理を行います 3Dデバイスの削除は正常に終了しました Direct3D 関連の終了処理は正常に終了しました メインサーフェスを破棄をします... 完了しました DirectDrawオブジェクトを解放します スレッド 'Win32 スレッド' (0x750) はコード 0 (0x0) で終了しました。 'nigasln.exe': 'C:\Windows\System32\atiumdva.dll' をアンロード 'nigasln.exe': 'C:\Windows\System32\atiumdag.dll' をアンロード DirectDrawオブジェクトを解放しました DirectDraw 関連の終了処理は正常に終了しました DirectInput 関連の終了処理... 完了 スレッド 'Win32 スレッド' (0x17bc) はコード 0 (0x0) で終了しました。 スレッド 'Win32 スレッド' (0x7c8) はコード 0 (0x0) で終了しました。 スレッド 'Win32 スレッド' (0xa74) はコード 0 (0x0) で終了しました。 スレッド 'Win32 スレッド' (0x1668) はコード 0 (0x0) で終了しました。 スレッド 'Win32 スレッド' (0x10b0) はコード 0 (0x0) で終了しました。 DirectSound の終了処理は正常に終了しました Alloc memory dump size:348(0.340kb) file: line:0 ID:44 addr:06d48d30 data:<.C..............> [90 43 00 00 00 00 00 00 00 00 00 00 00 00 00 00] size:56(0.055kb) file: line:0 ID:36 addr:06d48ca0 data:<....0...........> [00 00 00 00 30 8d d4 06 0d f0 ad ba 0d f0 ad ba] Total size:404(0.395kb) Alloc num:2 スレッド 'Win32 スレッド' (0x1254) はコード 0 (0x0) で終了しました。 スレッド 'Win32 スレッド' (0x168c) はコード 0 (0x0) で終了しました。 スレッド 'Win32 スレッド' (0x166c) はコード 0 (0x0) で終了しました。 スレッド 'Win32 スレッド' (0xe10) はコード 0 (0x0) で終了しました。 スレッド 'Win32 スレッド' (0x1664) はコード 0 (0x0) で終了しました。 スレッド 'Win32 スレッド' (0x1584) はコード 0 (0x0) で終了しました。 スレッド 'Win32 スレッド' (0x16f4) はコード 0 (0x0) で終了しました。 スレッド 'Win32 スレッド' (0x142c) はコード 0 (0x0) で終了しました。 スレッド 'Win32 スレッド' (0x10ac) はコード 0 (0x0) で終了しました。 プログラム '[4328] nigasln.exe: ネイティブ' はコード 0 (0x0) で終了しました。
Re: 配列にロードした画像が・・・ ( No.3 )
名前:いっち 日時:2010/04/22 01:04

DXライブラリのバージョンが古いようですが、最新のものを使用しても同様の事象が発生しますでしょうか? また、LoadDivGraphやLoadGraph系の戻り値でエラーを返している箇所は無いでしょうか? 画像の読み込みすぎ等も考えられますので、一部のロードをコメントにするなどしてみて下さい。 (この場合はログにエラーが出ていそうですが・・・) > ソースですが、かなりの量になってしまっているので 無理にお願いするつもりはありませんが、公開に支障がなければアップローダをご利用下さい。
Re: 配列にロードした画像が・・・ ( No.4 )
名前:NNN 日時:2010/04/22 09:54

>>LoadDivGraph( "img/map00.png" , 50 , 10 , 5 , 16 , 16 , maptip1 ) ; 1,使用する配列 maptip1 のサイズは50確保していますか? 2,おそらく他にもLoadDivGraphを使っていると思いますが、そちらのサイズも確保されていますか? 自分が以前同じ現象にあったので・・・。 たとえばA[10]に問題なく10分割した画像を読み込んでも、B[10]に11個の画像を読み込んだ場合、メモリが食い込むことがあるようです。
Re: 配列にロードした画像が・・・ ( No.5 )
名前:PATOLE 日時:2010/04/23 01:49

NNNさんの言うとおり、自分もそのようなことをして同じ現象が起こったことがあります。 同じく、 A[10]だけ確保し、10分割で読み込んだ後、 DrawGraphなどで表示するときに、 A[-1]になったり、A[11]になったりすると、また違う画像が表示されたりすることがあるようですよ。
Re: 配列にロードした画像が・・・ ( No.6 )
名前:hima 日時:2010/04/23 19:14

記憶が正しければ、配列が十分な大きさを持っていても、画像が十分な大きさを持っていない場合その画像の分割画像全てが表示されなくなった気がします。 ex 40x10の画像をLoadDivGraph("hoge.png",5,5,1,10, 10,hoge);にて展開
Re: 配列にロードした画像が・・・ ( No.7 )
名前:Will 日時:2010/04/23 19:55

> 突然一部配列内の画像が表示できたり、できなかったりします。 出来たり出来なかったりするってことなら、バッファオーバーランでメモリ破壊している 可能性も考えられますから、maptip1の前後に定義されているメモリの 使用に間違いがないかもチェックすべきでしょうね。
Re: 配列にロードした画像が・・・ ( No.8 )
名前:gucci 日時:2010/04/26 21:33

皆様、ありがとうございます。 アドバイスを基に、ソースを見直したところ、 どうも文字表示部分でnull文字の付加がきちんと出来ておらず、 そこからオーバーフローが発生し、画像配列の中身を破壊していたようです。 他にもかなりのバグがあり、修正が追いついていませんが なんとか修正の糸口が掴めたので 出来るところまで頑張ってみます。 ちなみに、ソースは以下です。 かなりのサイズになっていますが、よろしければバグの修正にご協力頂ければ幸いです。 mecha-tacwan.hp.infoseek.co.jp/niga_log.lzh
Re: 配列にロードした画像が・・・ ( No.9 )
名前:いっち 日時:2010/04/27 00:37

ソース一式をダウンロードさせて頂きましたが、プロジェクトが開けないようです。 "DxLib_VC2005用.vcproj"がありませんと怒られます。(私はVS2008EEを利用しています) 現在はとりあえず、適当なプロジェクトにソースを放り込んでコンパイルしています。 ちなみにDxLibは2.25bが必要なようです。3.02bでは起動しませんでした。 余談ですが、とても一生懸命作ってあってちょっと感動しました。 ゲームも面白かったです。
Re: 配列にロードした画像が・・・ ( No.10 )
名前:いっち 日時:2010/04/27 19:54

ソース拝見しました(全部ではありませんが)。 しかし、分量が多く、片手間にできるような作業では無さそうなので、あまりお役に立てそうにありません。 せっかくソースをご提供頂いたのに申し訳ありません。 とりあえず、複数のヘッダに同じdefineや構造体の定義が存在するのはあまりよろしくないと思いましたので、 defset.hとgloval.hを共通化してみました。 既存のバグが無くなるわけではありませんが、保守性はあがると思います。 もし宜しければご利用下さい。 ttp://www1.axfc.net/uploader/Sc/so/107746.zip&key=niga
Re: 配列にロードした画像が・・・ ( No.11 )
名前:いっち 日時:2010/04/28 01:47

その後少し触ってみましたが、2点ほど違和感がありました。 すでにご存知の事かも知れませんが、念のためご報告させて頂きます。 ・マウスの操作が直感的ではない マウスがウィンドウの右、もしくは下に行くほど移動量が少なくなるように感じます。 (ウィンドウモードだとわかりやすいと思います) これはたとえば、move.cppのmove_menu関数の場合、 GetMousePoint( &mousemove[0], &mousemove[1] ); でマウスの位置を取得した後に以下のように補正を行うことで、直感的になると思います。 mousemove[0] /= 2; mousemove[1] /= 2; しかし、この方法をソース全般に適用するのは影響範囲が大きいため、私では出来ません。 (move_menu関数の内部に限って言えば問題ないように見受けられました) ・垂直な壁に向かって左右キーを押し続けると挟まれたわけではないのに死亡する おそらく、壁と衝突すると下方に移動するという処理に巻き込まれているのではないかと思います。 ゲームデザインに関わる件ですので私ではなんとも言えません。 以上です。拙い私見でお恥ずかしいですが、参考にして頂ければ幸いです。
Re: 配列にロードした画像が・・・ ( No.12 )
名前:gucci 日時:2010/04/29 10:51

御指摘ありがとうございます。 マウスの操作改善とdefset.hの導入を行わせていただきました。 壁にくっついた際の移動は、ソース作成時も悩んだのですが どうにも解決策が思いつきませんでした。 追記で失礼しますが、質問があります。 SelectMidiMode(DX_MIDIMODE_DM);を宣言した後に midiファイルを再生すると、一部ファイルの一部の音色が聞こえなくなりました。 (例:snd/aseri2.mid等) SelectMidiMode(DX_MIDIMODE_DM);を消去すると正常に再生されるのですが ループ再生時の繋ぎ目にロード時間が入り、処理が1秒程停止してしまいます。 使用環境によるものかもしれませんが、 何か良い方法はないでしょうか?
Re: 配列にロードした画像が・・・ ( No.13 )
名前:いっち 日時:2010/04/29 23:37

> SelectMidiMode(DX_MIDIMODE_DM);を宣言した後に > midiファイルを再生すると、一部ファイルの一部の音色が聞こえなくなりました。 私の環境でも同様な事象になりました。 事象を確認したファイル名は以下の通りです。 ・hanayaka.mid ・aseri2.mid ・end.mid このような事象が起こる原因については分かりませんでした。 DTMをなさっている方のほうが詳しいかもしれません。 ※注意 私はMIDIにまったく詳しくないので、以下に書くことはかなり当てにならないと思います。 (システムエクスクルーシブなんて用語は今日はじめて知りました) しかし、せっかく検証したので書いておきます。 MCIとDirectMusicで再生に差異が出るMIDIファイルの中をのぞいてみましたが、 どうやらMIDIのシステムエクスクルーシブを使ってパートを指定していると DirectMusicで再生がうまくいっていないような気がしました。 ・・・ので、パート指定のSysExイベントを削ってみたのですが、やっぱり鳴りませんでした。 でも、GSリセットのSysExイベントのみを削ると何故か鳴りましたが、音が変わっていました・・・
Re: 配列にロードした画像が・・・ ( No.14 )
名前:いっち 日時:2010/04/30 22:43

> 壁にくっついた際の移動は、ソース作成時も悩んだのですが > どうにも解決策が思いつきませんでした。 たとえば下記ソースのような感じでどうでしょうか? ttp://www1.axfc.net/uploader/Sc/so/108886.zip&key=niga (使い方はjudement.cppのniga_to_map関数を置き換えて下さい) 横の壁に引っ張られるような動作は面白いのでそのままにしてあります。 その他の現行動作には影響が無いように配慮したつもりですが、 十分と言えるほどの検証は行っていません。 (一応、縦スクロール、横スクロールでの動作はともに確認しました) 余談ですが、WinMainの最初のDrawStringをコメントにするとDxLibの3.00以降でも起動するようでした。
Re: 配列にロードした画像が・・・ ( No.15 )
名前:gucci 日時:2010/05/06 00:31

>>いっち様 修正ソースを早速実装させていただきました。 マップとの引っかかりが軽減され、かなりスムーズに操作できるようになりました。 midiの問題は修正が難しいとの事でしたので、正常に再生する別の曲で代用しようと考えています。 Dxlibの最新版も、導入時に正常に動作せず困っていたのですが 問題点を指摘していただいたお陰でなんとかなりそうです。 まだまだ開発の終わりが見えませんが、 大きく前進できたように思います。 本当にありがとうございました。 また不具合や疑問点が発生した際は、 お手数ですがよろしくお願いいたします。
Re: 配列にロードした画像が・・・ ( No.16 )
名前:うにゅ 日時:2010/05/06 05:02

こんにちは。 普段はROMばかりなのですが、 MIDIの再生でちょっとだけお役に立てそうでしたので横槍ご無礼します。 (長文でまとまりが無くなってしまいました、スミマセン・・) スレッドを読んだところ―― > 私の環境でも同様な事象になりました。 > 事象を確認したファイル名は以下の通りです。 > ・hanayaka.mid > ・aseri2.mid > ・end.mid 上記のMIDIファイルにて音源がGSもしくはXGなのかと思われます。 (GMレベル2なんてことは無いですよね?!) ソフトウェア音源では基本的にGM音源しかサポートされません。 RolandのVirtual Sound CanvasやYAMAHAのS-YXG50の様に、 それぞれのメーカーが音源を搭載したソフトウェア音源を開発している場合もありますが・・ それでもハードウェア音源の全てをカバーしているわけではありません。 (特にバンクセレクトでそれは如実です) 問題の > SelectMidiMode(DX_MIDIMODE_DM); ですが、DirectMusicでMIDIの再生を行うことはご存知かと思います。 DirectMusicを利用したMIDIの再生は「ソフトウェア音源」で行われます。 そのため、GS・XG音源のMIDIの再生は―― “できることはできるが、一部のMIDIイベントやエクスクルーシブメッセージが無視されることがあるよ” と言うことになります。 (エクスクルーシブメッセージは対応しない音源では無視するものなので当たり前ですけどね) エクスクルーシブメッセージが無視されると言うことは、 MIDI音源が「そのMIDIファイルが使いたい音源」に合わせてMIDI音源のリセットができないことになります。 要は“上手くリセットができないので受け取れたエクスクルーシブメッセージとMIDIイベントでリセットするよ”ってことです。 このリセットができないと言うのが重要なのです。 リセットができないと「最後にMIDIイベントを操作した状態」を保持します。 そのため、「一つ前のMIDI」で音量をいじるなどしてフェードアウトした場合、 「今再生してるMIDI」では「その音量を引き継ぐ」のです。 MIDIイベントには他にも音を響かせたり、ビブラートを再現するもの、 はたまたギターのチョーキングの様なことまでできます。 これら全てを引き継いでしまうため、思った通りにMIDIが再生されないのです。 では、MCIで再生した場合には何故この様なことが起きないのか。 それはMIDIファイルの再生を始める前に必ずMIDIリセットを送信してくれるMIDI音源が標準搭載されることが殆どだからです。 (中には標準でMIDIリセットを送信しないMIDI音源が搭載されてるPCなんてのもあるかも知れません) これが曲者で、MIDIリセットをわかりにくくしている原因の一つだと思います。 ちなみにループ時に入る空白はMIDIリセットを送信している空白だと思われます。多分・・ (GMリセットの送信には大体1秒ほどかかるのです) よく素材サイトでは “再生後にMIDI音源のリセットをして下さいね。音源のリセットがわからない方は「この曲」を最後まで再生して下さい” みたいな文句を見ますよね。 必ずMIDIリセットを送信してくれるありがた迷惑な音源を使っているユーザは、 「これを再生したら何が違うんだろう?」と思うことが大抵ではないでしょうか? 少なくとも自分はそうでした(笑) この挙動はどちらが正しいのかと言えば、DirectMusicの様な「勝手にリセットしない」音源の挙動が正しいのです。 PCは放っておいても勝手に電源は切れませんし、本は読んで放っておいても勝手に棚に戻りませんよね? つまりはそう言うことです。 (勝手にリセットしてしまう音源は使い勝手を考えてのことだと思います・・) そのため、MIDIファイルの先頭にはMIDIリセットが挿入されるわけですね。 では、回避策は無いのか?と言うのが気になると思います。 初めに重要なのはMIDIを作られた方にGMオンリーで作ってもらうことです。 無駄なエクスクルーシブメッセージの送信も止した方がいいでしょう。 DirectMusicがどこまでサポートしているのかわかりません。 探せば資料もあるのやも知れませんが、正直、そんなことするならば せっせとGMリセットに切り替えた方がよっぽど楽だと思います。 また、素材サイトから拝借している場合は「GM」と「GSないしXG」を配布しているのであれば、 GM音源のものを選択することです。 次にMIDIファイルの頭にGMリセットを挿入することです。 上で散々説明しましたが、MIDIリセットが挿入されていなければ「前の状態」で再生されてしまいます。 さらに万全を期すならば、その際、一部GM音源では対応していないエフェクトについてもリセットしておけば より再生時の差異は少なくなります。 (リバーブやコーラスなんかはよく使われると思います) 長くなりましたが、これでほぼ100%回避できると思われます。 本当ならGMリセットのサンプルをお見せできればよかったのですが、 丁度いいファイルを持ち合わせていなくて・・ この書き込みを書くのに時間も食ってしまって(笑) 用語もその時々で変わってしまって…申し訳ないです・・ それでは、少しでもお役に立てれば幸いです。
Re: 配列にロードした画像が・・・ ( No.17 )
名前:gucci 日時:2010/05/12 00:28

>>うにゅ様 返事が遅くなり、申し訳ありません。 ご指摘ありがとうございます。 早速midi作成ソフト(cherry)を用いてGMへ修正しようと考えたのですが、 使い方が分からず、変換できませんでした。 midi配布サイトもmp3公開へ変更したようで、 GM形式を新たに入手することができません。 GMへの修正は、知識がなくても容易にできるのでしょうか?
Re: 配列にロードした画像が・・・ ( No.18 )
名前:いっち 日時:2010/05/12 12:51

※ど素人の意見です。偏見や誤解に満ちている可能性があります。 > GMへの修正は、知識がなくても容易にできるのでしょうか? 難易度はわかりません。 変換することはおそらく可能だと思いますが、MCIを使って再生したような音を再現するのは難しいと思います。 > midi配布サイトもmp3公開へ変更したようで もし可能であれば、BGMをMP3に変更してはいかがでしょうか? 配布サイズが大きくなってしまうのが難点ですが・・・。
Re: 配列にロードした画像が・・・ ( No.19 )
名前:うにゅ 日時:2010/05/17 20:32

こんにちは。うにゅです。 返信が遅くなってしまい申し訳ございません。 また、先に謝っておかなくてはいけないことがあります・・ 実は前回の書き込みには一部、間違っているところがあります。 しかしながら、現状では前回の書き込みを参考にされても問題ないと思います。 気になったのでしたら、そこでMIDIを勉強すればどこが間違っているのかわかると思います。 先に書いておくべきでした・・・申し訳ございません。 > GMへの修正は、知識がなくても容易にできるのでしょうか? ですが、いっちさんがおっしゃっている通り難易度はわかりません。 と言うのも、使っているエクスクルーシブメッセージにもよるためです。 また、GMとGSもしくはXGでは音源が違うため「100%同じに鳴る」ように修正するのは難しいと言えます。 それは、例えば最大同時発音数の違いが分かりやすいです。 GMでは24和音が限界とされています。 それに比べてGS・XGではそれ以上の和音を同時に発音できます。 > > midi配布サイトもmp3公開へ変更したようで > もし可能であれば、BGMをMP3に変更してはいかがでしょうか? どうしてもBGMをMIDI再生されたい様でしたので、前回、お知恵添え致しましたが、 正直な話、この意見に賛成します。 ttp://www1.axfc.net/uploader/Sc/so/114584.zip 最後になりますが、一応、GMリセットを挿入した*.midを置いておきます(PWD : reset)。 丁度いいファイルが無かったので、クラシックの譜面を打ち込みました('-`*) (Cherryを使っているようですので、その前提で話をしますね。) ※エクスクルーシブメッセージ「0xF0 0x7E 0x7F 0x09 0x01 0xF7」がGMリセットです。  CherryならばCC#160を挿入するだけです。 ※RPN MSB(CC#101)、RPN LSB(CC#100)、Data Entry MSB(CC#006)はピッチベンドレンジと言うメッセージです。  同時に送信して意味があります。CherryではCC#128を使います。 0小節目をMIDIリセットとして当てます(大抵のMIDIファイルではそうなってると思います)。 その際、テンポ(CC#155)は120です。 演奏データ(ノートなど)は1小節目から入力します。 1小節目から演奏したい曲に合わせてテンポを変更します。 この「0小節目はテンポ120」と言うのがミソで、テンポ120で1小節演奏するのに1秒かかります。 これがMIDIリセットに1秒ほどかかる理由なんです。 ところで、MIDIファイルによってはMIDIリセット時のテンポを120以上にしているものもあります。 しかし、MIDI音源は「素早く」「何度も」「様々な」MIDIコントロールを一気に解釈できません(ステップ0で連続送信など)。 ですので、正確に思った通りのMIDIリセットができているかは不安が残ります。 テンポ120、MIDIコントロールごとのステップは60(分解能480)程度開ける。 このことは守っておいた方がいいようです。
Re: 配列にロードした画像が・・・ ( No.20 )
名前:gucci 日時:2010/05/23 12:31

返信が遅くなり、申し訳ありません。 お二人のご意見通り、無理にmidiを使わずに mp3へ差し替えを行いたいと思います。 最終的にファイルサイズが想定外になってしまうようであれば、 エクスルーシブメッセージを無視しない別のmidiへ 再度差し替えも考えています。 なんとか前述のバグも解消し、 BGMもmp3を使うことで問題が解消されそうです。 貴重なご意見をいただき、ありがとうございました。

Page: 1 |