DXライブラリ質問&雑談掲示板2
[トップに戻る] [使いかた] [ワード検索] [管理用]
おなまえ
題  名
メッセージ
削除キー (記事削除用。英数字で8文字以内)
クッキー情報を保存

<管理人>
ご返信は一週間に一度、土日のどちらかで行います。平日は時間に余裕があるときだけご返信します。
この掲示板はマルチポスト禁止です。

[5164] ご返信 投稿者:管理人 投稿日:2020/09/10(Thu) 03:02 [返信]
> kanamaruさん お調べいただきありがとうございます > ちなみにDXライブラリに書式指定以外の可変長引数ってありましたっけ? 数少ない書式指定以外の可変長引数の関数は GraphFilter や GraphBlend などのフィルター処理系なのですが、 こちらについては引数の型が int だけなので、簡単なラッピング関数で C#版でも呼べるようにしています > ただしこの方法は書式指定がc++ではなくc#のものになりますが、特に問題はないでしょう。 > vsprintf呼び出せばc++の書式指定を使えるみたいですがc++の書式指定にする意味が無いでしょう。 はい、その通りだと思います 以前、今回と同じような話題が挙がった際にも 『可変長引数の関数は書式指定がほぼ全てで、書式指定の文字列はC#の機能で作成すれば良いから DrawFormatString のような  C++ の書式指定の可変長引数を使用する関数は C#版で使えなくてもOK』 という結論に至りました 今回 __arglist を使用してお手軽に対応できるのであれば( 実装の意味は薄いかもしれませんが ) DrawFormatString などの関数も 使用できるようにしようと思ったのですが、残念ながら『お手軽に対応』は難しいという結果になりました…

[5163] c#版の可変長引数実装 投稿者:kanamaru 投稿日:2020/09/09(Wed) 09:14 [返信]
試しに僕の方でも調べてみました。 結論から言うと、一部関数は実装可能という結論になりました。 まず、c#では可変長を実装するのにいくつか方法があるらしく、 __arglistを利用する方法もあるのですが、paramというのを使う方法の方がよさそうです。 (調べた限り関数を利用するときに__arglistだと__arglist(1,2)といった風に__arglist(〜)で囲む必要があるみたいです。 void*を使う方法は調べた限り出てきてないのですが__arglistを使っている以上同じようにする必要があるかもしれません) 可変長のような実行時に型が決まるようなものは型の変換がうまくできないために マーシャリング(でいいんでしょうか)が正常にできないそうです。 見つけた解決策は可変長を書式指定に使っていることを前提としています。 わかりやすく言えば書式指定をc#側で処理すればいいんです。 dllを呼び出すときは可変長引数を長さ0、つまりフォーマット文字列を指定するところに文字列をただ指定するだけにする。 で、c#側でフォーマット文字列と可変長引数を用いて引数に指定する一つの文字列を作成する。 その後c++には作成した文字列を指定する。 string.format関数を使えばできます。 ただしこの方法は書式指定がc++ではなくc#のものになりますが、特に問題はないでしょう。 vsprintf呼び出せばc++の書式指定を使えるみたいですがc++の書式指定にする意味が無いでしょう。 ちなみにDXライブラリに書式指定以外の可変長引数ってありましたっけ? もしあるのならその関数はc++の関数そのままc#で使うのはあきらめた方がよさそうです。 以上は調べただけで試してないのでうまくいくかわかりません。

[5162] ご返信 投稿者:管理人 投稿日:2020/09/08(Tue) 02:08 [返信]
> ともさん __arglist、微妙に使い勝手が悪いところが C++ の ... に似てますね… > kawaiさん うーん不思議ですね… 本日ビルドした DxLibModelViewer.exe をアップしましたので、よろしければこちらでも 正常に動作しないか試してみていただけないでしょうか? m(_ _)m https://dxlib.xsrv.jp/temp/DxLibModelViewerTest.zip

[5161] ModelViewer 投稿者:kawai 投稿日:2020/09/07(Mon) 18:10 [返信]
toolの中にあるmodelviewerが急に使えなくなりました。 ダブルクリックしても読み込みマークが数秒表示され、すぐに消えてしまいます。 新しくサイトからダウンロードしてみても、同じでした。 助けてください。

[5160] 無題 投稿者:とも 投稿日:2020/09/06(Sun) 21:33 [返信]
出来たと思ったらできませんでした おかしいなあ

[5159] 無題 投稿者:とも 投稿日:2020/09/06(Sun) 21:12 [返信]
間違えました。。。 [DllImport("DxLib.dll", EntryPoint="dx_DrawFormatString")] extern static int dx_DrawFormatString_x86( int x, int y, uint Color, string FormatString, __arglist); [DllImport("DxLib_x64.dll", EntryPoint="dx_DrawGraph")] extern static int dx_DrawFormatString_x64( int x, int y, uint Color, string FormatString, __arglist); public static int DrawFormatString( int x, int y, uint Color, string FormatString, void* m) { if( System.IntPtr.Size == 4 ) { return dx_DrawFormatString_x86( x , y , Color, FormatString, m); } else { return dx_DrawFormatString_x64( x , y , Color, FormatString, m); } }

[5158] 無題 投稿者:とも 投稿日:2020/09/06(Sun) 20:48 [返信]
DXクラスだけunsafeを使うのはどうですか? そうすればvoid*が使えます unsafe public static class DX { public static int DrawFormatString( int x, int y, uint Color, string FormatString, void* m) { if( System.IntPtr.Size == 4 ) { return dx_DrawFormatString_x86( x , y , Color, FormatString, m); } else { return dx_DrawFormatString_x64( x , y , Color, FormatString, m); } } } //使用例 DX.DrawFormatString(0, 150, c, "今日は%sだよパート", __arglist("雨"));

[5157] 無題 投稿者:とも 投稿日:2020/09/06(Sun) 11:58 [返信]
出来ないですね わかりました お手数をかけて申し訳ありませんでした

[5156] ご返信 投稿者:管理人 投稿日:2020/09/06(Sun) 00:05 [返信]
> ともさん 本日 __arglist を試してみたのですが、結論から申し上げますと実装はできませんでした… C#版のDXライブラリの関数は以下のようになっていまして [DllImport("DxLib.dll", EntryPoint="dx_DrawGraph")] extern static int dx_DrawGraph_x86( int x, int y, int GrHandle, int TransFlag); [DllImport("DxLib_x64.dll", EntryPoint="dx_DrawGraph")] extern static int dx_DrawGraph_x64( int x, int y, int GrHandle, int TransFlag); public static int DrawGraph( int x, int y, int GrHandle, int TransFlag) { if( System.IntPtr.Size == 4 ) { return dx_DrawGraph_x86( x , y , GrHandle , TransFlag ); } else { return dx_DrawGraph_x64( x , y , GrHandle , TransFlag ); } } C#のラッパー関数の中で実行形式が 32bit なのか 64bit なのかを判断して使用する dll を分岐しています なので、可変長引数の場合は以下のようになるのですが [DllImport("DxLib.dll", EntryPoint="dx_DrawFormatString")] extern static int dx_DrawFormatString_x86( int x, int y, uint Color, string FormatString, __arglist); [DllImport("DxLib_x64.dll", EntryPoint="dx_DrawGraph")] extern static int dx_DrawFormatString_x64( int x, int y, uint Color, string FormatString, __arglist); public static int DrawFormatString( int x, int y, uint Color, string FormatString, __arglist) { if( System.IntPtr.Size == 4 ) { return dx_DrawFormatString_x86( x , y , Color, FormatString, __arglist ); } else { return dx_DrawFormatString_x64( x , y , Color, FormatString, __arglist ); } } この中の return dx_DrawFormatString_x86( x , y , Color, FormatString, __arglist ); return dx_DrawFormatString_x86( x , y , Color, FormatString, __arglist ); ↑こちらの記述がエラーになってしまう( __arglist を引数には渡せない )ので、 __arglist を使用した可変長引数の実装は不可、という結果になりました (_ _;

[5155] 無題 投稿者:とも 投稿日:2020/09/04(Fri) 16:55 [返信]
C#版は気長に待ってるので、ゆっくりで良いですよ

[5154] ご返信 投稿者:管理人 投稿日:2020/09/04(Fri) 02:15 [返信]
> ともさん 了解です C#版DXライブラリの不具合ではなくて良かったです (^ ^; ( __arglist 対応の途中で C#版DXライブラリが作成できない状態なので… )

[5153] 無題 投稿者:とも 投稿日:2020/09/03(Thu) 18:53 [返信]
ごめんなさい、画像がフォルダになかっただけでした 申し訳ないです

[5152] ご返信 投稿者:管理人 投稿日:2020/09/03(Thu) 00:59 [返信]
> ともさん > DxLibModelViewer.exeでmv1ファイルに変換しようとしたのですが、テクスチャが表示されません... > c#だと読み込みエラーになります すみません、テクスチャが貼られていないモデルが表示されるのか、 MV1LoadModel 自体がエラー( 戻り値が -1 )になるのか、どちらでしょうか?

[5151] 無題 投稿者:とも 投稿日:2020/09/02(Wed) 23:55 [返信]
c++だと表示されました c#だと読み込みエラーになります

[5150] 無題 投稿者:とも 投稿日:2020/09/02(Wed) 19:34 [返信]
blenderというツールで作成したfbxファイルを、 DxLibModelViewer.exeでmv1ファイルに変換しようとしたのですが、テクスチャが表示されません... 因みに、3Dビューアーというツールだと正しく表示されます よろしくお願いします

[5149] > ご返信 投稿者:magway 投稿日:2020/08/29(Sat) 16:58 [返信]
> KeyInputSingleCharString は、文字列入力が終わるまで関数から出てきませんので、 なるほど。勘違いしていたわけですね。 ありがとうございました。

[5148] 無題 投稿者:とも 投稿日:2020/08/29(Sat) 02:42 [返信]
すみません、管理人さんのサンプルを実行したら正常に動きました ありがとうございました!

[5147] ご返信 投稿者:管理人 投稿日:2020/08/29(Sat) 02:01 [返信]
> ともさん 手元で以下のようなプログラムを組んで utf-8 BOM付きのテキストファイルを 表示できるか試してみましたが、正常に動作しました #include "DxLib.h" int android_main( void ) { char String[ 1024 ]; int FileHandle ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) { return -1 ; } // ファイルを開く FileHandle = FileRead_open( "text.txt" ); // 全ての行を描画する int i = 0; while( FileRead_gets( String, sizeof( String ), FileHandle ) > 0 ) { DrawString( 0, i * 16, String, GetColor( 255,255,255 ) ); i ++; } // キー入力待ち WaitKey() ; // DXライブラリ使用の終了処理 DxLib_End() ; // ソフトの終了 return 0 ; } テキストファイルが読めないとのことですが、具体的にはどのような挙動に なってしまうのでしょうか? > magwayさん KeyInputSingleCharString は、文字列入力が終わるまで関数から出てきませんので、 Cr = GetColor(160, 160, 0); DrawString(400, 200, "キーワード入力(半角英数8文字)", Cr); KeyInputSingleCharString(400, 250, 8, keyword, TRUE); DrawString(400, 350, "決定(Enter)", Cr); Cr = GetColor(255, 255, 255); DrawString(360, 700, "キーボード操作:半角英数字/Enter/Esc", Cr); ScreenFlip(); こちらのプログラムの場合は、 『「決定」や「キーボード操作」など黒く塗りつぶされてしまっている』のではなく 『「決定」や「キーボード操作」などが描画される前に文字列入力が始まっている( そして文字列入力が終わってから「決定」や「キーボード操作」などが描画される )』 という状態となっています

[5146] Re:[5145] KeyInputSingleCharString:入力領域の描画について 投稿者:magway 投稿日:2020/08/27(Thu) 22:46 [返信]
> 「KeyInputSingleCharString」を使うと、 > 入力エリアの下にも文字列を「DrawString」で書いてるのですが、 > 下記コードでの「決定」や「キーボード操作」など黒く塗りつぶされてしまうようです。 自己解決ですが、先に注意書きを描画してからKeyInputを使うと表示できました。

[5145] KeyInputSingleCharString:入力領域の描画について 投稿者:magway 投稿日:2020/08/27(Thu) 22:19 [返信]
久しぶりに来ました。お世話になります。 「KeyInputSingleCharString」を使うと、 入力エリアの下にも文字列を「DrawString」で書いてるのですが、 下記コードでの「決定」や「キーボード操作」など黒く塗りつぶされてしまうようです。 これはそういうものなのでしょうか? 入力文字の表示領域を確保してるからなんでしょうか? それでしたら自分で指定できるようになると助かります。 Cr = GetColor(160, 160, 0); DrawString(400, 200, "キーワード入力(半角英数8文字)", Cr); KeyInputSingleCharString(400, 250, 8, keyword, TRUE); DrawString(400, 350, "決定(Enter)", Cr); Cr = GetColor(255, 255, 255); DrawString(360, 700, "キーボード操作:半角英数字/Enter/Esc", Cr); ScreenFlip();

[5144] 無題 投稿者:とも 投稿日:2020/08/27(Thu) 20:53 [返信]
と思ったら今度はFileRead_gets()でテキストファイルが読めません テクストファイルはutf-8(BOM)です

[5143] 無題 投稿者:とも 投稿日:2020/08/27(Thu) 19:30 [返信]
FileRead_openで読み込めました

[5142] 無題 投稿者:とも 投稿日:2020/08/27(Thu) 16:20 [返信]
visual studioでandroidアプリを作成しようと思って始めたのですが、 LoadGraphではデータを読み込めたのですが、 バイナリファイルが読み込めません fopen以外に読み込む方法があるのでしょうか? よろしくお願いします

[5141] ご返信 投稿者:管理人 投稿日:2020/08/27(Thu) 03:32 [返信]
> noshiさん 描画した後に線の太さを変更することはできません とはいえ、線の太さを指定できるBOXの描画関数も無いので、DrawBox の代わりに以下の 関数を使ってください m(_ _)m ( DrawBox を4回実行して太い線のBOXを描画する関数です ) // 太さ指定付きの線の描画を行う void DrawLineBox( int x1, int y1, int x2, int y2, unsigned int color, int width ) { x1 -= width / 2; y1 -= width / 2; x2 -= width / 2; y2 -= width / 2; DrawBox( x1, y1, x1 + width, y2 + width, color, TRUE ); DrawBox( x2, y1, x2 + width, y2 + width, color, TRUE ); DrawBox( x1 + width, y1, x2, y1 + width, color, TRUE ); DrawBox( x1 + width, y2, x2, y2 + width, color, TRUE ); } 引数 width に線の太さ( ピクセル数 )を渡します

[5140] DrawBoxの線の太さ 投稿者:noshi 投稿日:2020/08/26(Wed) 12:33 [返信]
DrawBox関数を使って描画する際、 描画されたBOXの線の太さを変更することは可能ですか?

[5139] Re:[5128] Re:clang++ 投稿者:手提鞄あたっしゅ、 投稿日:2020/08/25(Tue) 21:59 [返信]
文字化けは、ソースが UTF-8 だったせいでした。 Shift-JIS に直したら、文字化けは、治りました。

[5138] 無題 投稿者:とも 投稿日:2020/08/24(Mon) 06:36 [返信]
おはようございます 是非お願いします!

[5137] ご返信 投稿者:管理人 投稿日:2020/08/23(Sun) 23:47 [返信]
> ともさん おお、__arglist という裏技があるのですね ご情報ありがとうございます こちらを使用して可変長引数の関数を C# でも使えるようにしてみようと思います

[5136] 無題 投稿者:とも 投稿日:2020/08/23(Sun) 12:38 [返信]
こちらが正しいです DrawFormatStringが文字化けせずに動きました! ////////////////////////// //myshaap.dllのソース(マルチバイトを使用) #include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdarg.h> #include <string> #include <cstring> #include "DxLib.h" using namespace std; //某サイトより拝借 std::string utf_16_to_shift_jis(const std::wstring& str) { static_assert(sizeof(wchar_t) == 2, "this function is windows only"); const int len = ::WideCharToMultiByte(932/*CP_ACP*/, 0, str.c_str(), -1, nullptr, 0, nullptr, nullptr); std::string re(len * 2, '\0'); if (!::WideCharToMultiByte(CP_ACP, 0, str.c_str(), -1, &re[0], len, nullptr, nullptr)) { const auto ec = ::GetLastError(); switch (ec) { case ERROR_INSUFFICIENT_BUFFER: break; case ERROR_INVALID_FLAGS: break; case ERROR_INVALID_PARAMETER: break; default: break; } } const std::size_t real_len = std::strlen(re.c_str()); re.resize(real_len); re.shrink_to_fit(); return re; } extern "C" __declspec(dllexport) int __stdcall dx_DxLib_Init() { return DxLib_Init(); } extern "C" __declspec(dllexport) int __stdcall dx_DxLib_End() { return DxLib_End(); } extern "C" __declspec(dllexport) int __stdcall dx_ChangeWindowMode(int n) { return ChangeWindowMode(n); } extern "C" __declspec(dllexport) int __stdcall dx_WaitKey() { return WaitKey(); } extern "C" __declspec(dllexport) unsigned int __stdcall dx_GetColor(int r, int g, int b) { return GetColor(r, g, b); } extern "C" __declspec(dllexport) int __stdcall dx_DrawFormatString(int x, int y, unsigned int color, TCHAR* format, void* list) { return DrawFormatString(x, y, color, format, list); } ////////////////////////// //Program.cs using System; using System.Text; using System.Runtime.InteropServices; namespace testdxlib { class Program { [DllImport("mysharp.dll", EntryPoint = "dx_DxLib_Init")] extern public static int DxLib_Init(); [DllImport("mysharp.dll", EntryPoint = "dx_DxLib_End")] extern public static int DxLib_End(); [DllImport("mysharp.dll", EntryPoint = "dx_ChangeWindowMode")] extern public static int ChangeWindowMode(bool flag); [DllImport("mysharp.dll", EntryPoint = "dx_WaitKey")] extern public static int WaitKey(); [DllImport("mysharp.dll", EntryPoint = "dx_GetColor")] extern public static uint GetColor(int r, int g, int b); [DllImport("mysharp.dll", EntryPoint = "dx_DrawFormatString")] extern public static int DrawFormatString(int x, int y, uint Color, string b, __arglist); static void Main(string[] args) { ChangeWindowMode(true); DxLib_Init(); DrawFormatString(0, 120, GetColor(255, 255, 255), "%dと%sです", __arglist(123,"あいう")); WaitKey(); DxLib_End(); } } }

[5135] 無題 投稿者:とも 投稿日:2020/08/23(Sun) 12:33 [返信]
using myshapdll;は入りません ごめんなさい

記事No 削除キー

- Aska BBS -