トップページgamedev
987コメント396KB

SDLスレ

■ このスレッドは過去ログ倉庫に格納されています
0001login:Penguin01/11/11 17:59ID:u0HMN7qC
マルチプラットホームな汎用ゲームライブラリの
SDLについてのスレッドです。
最新情報、参考になるソース、質問等

とりあえず、本山
http://www.libsdl.org/
0523名前は開発中のものです。04/08/25 21:13ID:EcBBkrxH
BCCでライブラリをmakeしようとしたのですが、
エラー E2342 ..\..\src\video\windib\sdl_dibevents.c
189: パラメータ 'lpPrevWndFunc' は int (__stdcall *)() 型として定義されているので
long (__stdcall *)(void *,unsigned int,unsigned int,long) は渡せない
(関数 DIB_HandleMessage )とかいうエラーメッセージを吐いて出来ませんでした。
とりあえず該当箇所のソースを見て自分で直そうとしたのですが、見てみても
それらしき記述が発見できず…。

誰かどこを直せばいいかアドバイスお願いします。

一応環境は
Win98
BCC5.5.1
SDLのバージョンは安定版の1.2.7です。
052452104/08/26 00:18ID:bQrcHUhr
>>522
わざわざ試してくれてサンクス。
デバッガで追ってみたけどkanji_CreateSurfaceも成功してて、
SDL_BlitSurfaceの中まで行ったけどアセンブラばっかりで
よく分からなかったよ・・・。

日本語表示には別の方法考えるか・・・。

>>523
BCCは使ってないのでワカランのだが、
VC6用のバイナリ一式をimplibでBCC用に書き換える
っていうのじゃダメなん?
0525名前は開発中のものです。04/08/26 01:04ID:c70JkN3E
>>523
適当に環境構築して試してみた。おれの環境は Win2k なんだが、
それ以外は一緒だから多分参考になると思う。Win2k + BCC5.5.1 + SDL-1.2.7 。

お前さんの言うエラーの lpPrevWndFunc は、CallWindowProc の第一引数の仮引数名だ。
そのエラーは winuser.h 内の Call〜 の定義のせいで出てる。で STRICT つーマクロを定義しとけば大丈夫。
つまり、Borland\freebcc\SDL.mak の 66 行目(辺り)の、
USERDEFINES = WIN32;BUILD_SDL;__FREEBCC__; ...
ってなってるその行の最後に「STRICT;」って書き足せばオッケーだ。

本当はその次の行にある SYSTDEFINES から NO_STRICT を消す必要があると思うんだが、
なんでか残したままでも問題なかったな。

で実はこれをクリアしても他にも問題が出てきた。それも適当に対処できたから次に続く。
0526525 の続き04/08/26 01:23ID:c70JkN3E
そのままビルドするとコンパイルは通るんだがリンクの段になって
「Error: 外部シンボル '_SDL_HasMMX' が未解決(.\SDL-1.2.7\SRC\VIDEO\SDL_BLITN.OBJ が参照)」
みたいなエラーが来る。これは SDL_cpuinfo.c に定義されてるんだが、
SDL_cpuinfo.c のコンパイルが makefile にまるで書いてないのが原因。

なので、Borland\freebcc\SDL.mak の 70 行目(辺り)の
PATHCPP = .;..\..\src; ...(以下略)
ってなってる行の最後に「;..\..\src\cpuinfo」を追加して、
後 50 行目(辺り)の
  ..\..\src\video\SDL_blit.obj
に書き足して、
  ..\..\src\video\SDL_blit.obj ..\..\src\cpuinfo\SDL_cpuinfo.obj
にすればビルドできる。SDL-1.2.7\test\ に SDL.dll と SDL.lib が出来てるはず。

本当は SDLmain.mak にも間違いがあってビルドできんのだけど、
>>523 の implib で解決するんならそっちでやってくれい。

……ああ、やっぱり長文になってもうた。
0527名前は開発中のものです。04/08/26 14:19ID:JtN6FZlL
>>525
ありがとうございます。何故かmakeはILinkで止まってしまいましたが…。
SDLのソースをちょっと弄って使いたい場合はimplibだと無理ですよね?
色々ぐぐってみたところ
ttp://www.mediawars.ne.jp/~freemage/progs/sdl/sdl4bcc.html
にSDLmain.libの修正方法が書いてありましたがSDL_dibevents.c
辺りを弄って使いたい場合にはどうすればいいのでしょうか…
そういえばmakeはobjファイルを参照しているということは一度ソースから
objファイルを生成してからmakeしないと変更が反映されないんですかね?
makeの仕組みが未だによく分かってません…。
052852504/08/26 19:11ID:c70JkN3E
>>527
うん? ILink で止まるから >>526 を書いたんだが……。
SDL_dibevents.c を弄っても SDL_main.lib にゃ関係ないと思うぞ?
影響が出るのは SDL.lib の方だけだと思うから、
SDLmain.lib は Borland\lib\ にある奴でいいんじゃないか。
SDL_dibevents.c を弄りたいんなら好きに弄って make -f SDL.mak でいいと思う。

SDL_dibevents を弄りたいっていうと、DIB_CreateWindow とか書き換えて、
フルスクリーンで解像度変えた時の他ウィンドウのサイズ保持とかやりたいのかしらん。

>そういえばmakeはobjファイルを参照しているということは

……その辺勝手にやってくれるから便利なんだと思うぞ。
0529名前は開発中のものです。04/08/26 22:50ID:JtN6FZlL
あ、よく見たらビルドできてました。
いや、SDLからIMEの文字列を取得しようと思ったんですが、そのままだと
メッセージが取得できないらしくて、少しソースを書き換える必要が出てきたんですよ。
何にせよとりあえずはこれでうまく出来そうです。ありがとうございました。
0530sgi rocks04/08/27 00:50ID:fcNUInF8
最近、SDLとOpenGLでゲームを作っているのですが、
日本語入力のあたりでどうしようか考えてしまっています。
SDLは素晴らしいのですが、日本語入力が絡んで来ると、
せっかくマルチプラットフォームなのが有効に利用できないので、
皆で、SDLで動く日本語入力機構を作りませんか?

各々のOSの入力機構を使うか、それそのものを作るかもなにも決まってませんが、
今のところ、WindowsではIME、LinuxではXIMかIIIMFを使うといいかな、
と思っていたりします。
0531名前は開発中のものです。04/08/27 10:41ID:hR9vryWf
http://pc5.2ch.net/test/read.cgi/gamedev/1005469181/398-399n
前にもそういう話はあったみたいだけど、
SDL でそういうことをやるのは結構難しいみたいだね。

俺も前ちょっと調べて同じことやろうとしたんだけど、
IME 関連のプログラミングの経験浅いからいまいちよくわかんないんだよね。
入力内容を勝手に描画してくれるのも悪くないとは思うけど、
もうちょっとプリミティブに現在の変換状況を取得できるような作りは厳しいかな。
053252904/08/27 17:05ID:pn3VuAxV
とりあえずビルドも成功して、プログラムを書き始めたのですが、
C++でSDL使ったプログラムを書くときに何か注意するところはあるでしょうか?
というのも、書いたプログラムをメイクしてみると
Error: 外部シンボル '_main' が未解決(E:\BCC55\LIB\C0X32.OBJ が参照)
という何だか?なエラーが発生して少し困っているところなのです。
ちなみに、コンパイル時には-WC、-DDEBUG;WIN32をつけてコンパイルしました。
(他にも色々あったのですがとりあえず関係ありそうなものだけあげました)
0533名前は開発中のものです。04/08/27 17:09ID:ED0DtQy8
int main(int argc, char* argv[]) にする
0534名前は開発中のものです。04/08/27 17:57ID:cER7lJgy
sdl-config --libs
0535531 ◆pm4Rr1N8T6 04/08/27 18:27ID:hR9vryWf
トリップつけた。

うーん、すっげー適当な調査しかしてないんだけど、処理の流れとしては
1.SDL_GetWMInfo() でウィンドウシステム固有の情報を受け取る
2.IME が処理してる情報をコールバックで拝借する
3.共有 API によってウィンドウシステムに依存しない情報を得られるようにする
って感じが良さそうな気がする。

共有 API で取得できるべき情報はこんなとこだろうか。
・現在の漢字入力の ON/OFF
・現在入力中の文字列
・変換確定を行ったかどうかの情報
・確定後の文字列

わー、よくわからない!
結局変換中の小さいウィンドウを出す座標も設定出来ないと駄目だよなー。
Qt のソースでも読もうかな。

↓続く
0536531 ◆pm4Rr1N8T6 04/08/27 18:28ID:hR9vryWf
SDL で対応してるウィンドウシステムはよくわからないんだけど、
SDL_SysWMinfo の定義には
・X11
・Nano-X
・Win32
・RiscOS
があるね。
BeOS とか Amiga とかは最初は無視しといていいかな。
Mac はどうしよう。随分前に調べたんだけど情報を見付けることができなかった。

情報リンク
http://home.catv.ne.jp/pp/ginoue/im/index.html
日本語入力プログラミング
http://www.hmug.org/man/3/XmbLookupString.html
XmbLookupString() の man (ごめん、UNIX よくわからない)
http://www.kumei.ne.jp/c_lang/sdk3/sdk_278.htm
IME の操作@猫でもわかるプログラミング
0537sgi_rocks04/08/28 00:26ID:IBxR98vc
せっかくマルチプラットフォームな環境で走るSDLなので、
共通のAPIを提供しておいて、そのAPIが各々のOSの
ネイティブな入力機構を使うのに賛成です。

Mac OS Xに関しては、X11を使っている場合に限っては、
Linuxなどと同じX11経由の入力機構が使えると思います。

私はLinuxでSDLを動かしているので、X11(XIM経由)を少しやってみます。
0538sgi_rocks04/08/28 02:14ID:IBxR98vc
ふと思ったのですが、日本語入力機構だけ提供するのが良いのか、
それらを含めたSDLを使ったGUIを提供した方が良いのでしょうか?

入力している時の、変換候補などの表示や、入力欄の事を考えると、
そこだけ他のGUIと違ってしまうのも変な感じがしなくもないのです。
簡単なGUIも一緒に提供するのも良いかもしれない、と思うのですがどうでしょう。
053952904/08/28 13:34ID:D9fRqR5k
>>533
とりあえずmainはSDL_mainに置換されるという話なのでもちろんint main(int argc, char* argv[])
は書いているのですが、それでもError: 外部シンボル '_main' が未解決(E:\BCC55\LIB\C0W32.OBJ が参照)
が表示されるというのは謎ですね…。このエラーメッセージが何を言っているかがいまいちよく分からないのですが、
多分システムからコールバックされるべき_main、が無いってことなんですかね?
SDLmain.libでそっちの方が定義されてるはずなのに…orz
>>538
私は完璧に素人なのでこんなことにコメントするのもちとあれなのですが、
GUIごと提供してくれるとかなり便利そうな気もしますね。
0540名前は開発中のものです。04/08/28 15:30ID:YZXmLvih
>>538
とりえあず日本語入力機構だけを提供した方がいいと思います.

GUIは結局アプリケーション作る人次第な気がするので…
0541名前は開発中のものです。04/08/28 15:58ID:QqhNTGOx
7以降ってどんだけの人材と時間が費やされてるんだろうな?
よくあのペースで発表・発売できるもんだよ。
俺も将来はあのくらいの会社をもちたい。
0542名前は開発中のものです。04/08/28 16:01ID:QqhNTGOx
うはwwww 




誤爆です。
0543531 ◆pm4Rr1N8T6 04/08/28 16:23ID:doDxlGS3
>>538
GUI 部分はあとからでも付け足せるから先に入力機構だけでいいんじゃないかな。
と思いながら Win32 部分を作ってたんだけどさ、
まさか編集可能なウィンドウ(テキストボックスなど)が付いてないと
IME を入力可能状態にできないウィンドウシステムってある?
どうも上手くいかないんだけど、Win32 とかはそうなってるのかな。
うーん、ちょっと怖いなあ。GUI セットじゃないと厳しいかな。

とりあえず共通 API は、
・ネイティブな C で書く
・初期化関数で構造体を生成してポインタを返し、終了関数で開放
・ポリモーフィズムは構造体内に関数へのポインタを保持することで実装
・各処理系ごとにプリプロセッサで分岐し、初期化関数内の処理を切り分ける
って感じでいいかな。
SDL 本体内部の SDL_rwops や、多くの SDL 系ライブラリで使用されてる方法だから、
ソースを読めばもっと具体的な実現方法は把握できると思う。
ある程度各処理系の情報、実装の方向性がまとまってきたら、
共通 API を作るためのフレームワークを実装するよ。

一応 smpeg みたいな例もあるし、C++ で書いても問題は無いと思うけど、どっちがいいかな。
054452904/08/29 10:00ID:o5xfi0oD
相変わらずうまく行きませんな…。
公式ページからSDL.dllをダウンロードしてきてimplibでSDL.libを生成して、
SDL_win32_main.cをコンパイルしてSDL_main.libを作っても駄目でした。
最近のソースにはBorland用のライブラリ一式があるんですがあれは使っていいのでしょうかね?
Error: 外部シンボル '_main' が未解決(E:\BCC55\LIB\C0X32.OBJ が参照)
もう見飽きた…orz
0545名前は開発中のものです。04/08/29 12:50ID:dvcQQr7Q
>>544
一応、念のため聞いておくが、
SDL.libはリンクしているけどSDL_main.libをリンクし忘れているなんてことは無いよな?
0546名前は開発中のものです。04/08/29 14:02ID:iNpWlI3a
$ sdl-config --libs
-L/usr/local/lib -lmingw32 -lSDLmain -lSDL -mwindows
0547名前は開発中のものです。04/08/29 14:57ID:dvcQQr7Q
>>546
それ、cygwinの場合でしょ?>>529の場合はbccらしいから同じとは限らないし。
0548名前は開発中のものです。04/08/29 15:00ID:dvcQQr7Q
あ。>>546のはMinGW+MSYSのほうかもしれないすね。
0549名前は開発中のものです。04/08/29 17:36ID:Vt1Safbs
>>544
オプションを-Wにしてみろ。
055052904/08/29 19:35ID:o5xfi0oD
>>545
SDL.libとSDL_main.libは同じフォルダにおいてフォルダにリンクをしてるので
多分し忘れということは無いと思うんですが…。
>>549
-Wを入れると今度は
Error: 外部シンボル 'WinMain' が未解決(E:\BCC55\LIB\C0W32.OBJ が参照)
となるんでどうしたものか…。

一応構造的にはSDL_main.libの_mainやらWinMainがコールバックされてそこから
mainが置換されたSDLmainの方に制御が移されるんですよね?
それともそれをやるにはコンパイルするときにコマンドラインオプションが必要とか?
もうわけわかんないです…。
0551名前は開発中のものです。04/08/29 20:24ID:iNpWlI3a
まずはtdumpとかでSDL_main.libにWinMainや_mainが存在することを確認した方がよいのでは。
0552名前は開発中のものです。04/08/29 23:02ID:hlhX5yl6
>>550
> 一応構造的にはSDL_main.libの_mainやらWinMainがコールバックされてそこから
> mainが置換されたSDLmainの方に制御が移されるんですよね?

どう考えてるのかよくわかんないんだけど、実際には
 1. SDL_win32_main.c の中の WinMain() が呼ばれる
 2. その WinMain() が consol_main() を経由して SDL_main() を呼ぶ
 3. SDL_win32_main.c が SDL_main.h を include しており、
    その中で main() が SDL_main() として define されている
という作りになってる。
要するに、SDLmain.lib の中の WinMain() によって起動して、
その WinMain() が君のソースの中の main() を呼ぶって仕組み。
WinMain() で起動するために -W オプションは必須だね。

BCC が使う OMF っていうオブジェクトファイル、ライブラリファイルの形式では
関数の頭にアンダーバーを付けることになってるっぽい。
従って、main() をリンクする時には _main って部分を探すんだよ。
「bcc32.exe に -W オプションをきちんとつけて」
「`SDLmain.lib' と、`main() のあるソースから作った .obj ファイル' の両方をきちんとリンクする」
というプロセスが必要だよ。
常にどれかが抜けてるんだと思う。
0553531 ◆pm4Rr1N8T6 04/08/29 23:55ID:hlhX5yl6
うーん、Win32 では編集可能なウィンドウが無くても IME を ON の状態にはできるんだけど、
このまんまじゃ入力状態を取得できないなー。
表示すらしてないわけだから入力事態が行われてなさそう。
やっぱり GUI をセットにしないと駄目っぽい。
とりあえず、枠線付けただけのテキストボックスを CreateWindow() して
その GUI 内で IME による入力をできるようにしてみるよ。
こういうアプローチを取ると IME による入力部分だけ
OS 依存のフォント表示になってしまうけど、
その辺はもっと煮詰めてから考えることにする。
055452904/08/31 00:00ID:QiRAdHy6
自己解決した。
055552904/08/31 00:27ID:mI6iYA96
>>529
??まだ解決してませんが。
まぁもうちと粘ってみます。何か進展(&壁が)あったらまた来るかもしんないです。
055652904/08/31 00:29ID:mI6iYA96
うお、失礼。
誤:>>529
正:>>554
変な書き込みするから混乱しましたよ(笑
0557sgi_rocks04/08/31 04:06ID:hQvLtj9A
SDL_SysWMinfoではなくて、各々のOSからのメッセージが入ってる構造体の方を、
SDL_PeekEventかなんかで定期的にチェックするのが良いのかも、と思っています。

最初はSDL_SysWMinfoのwindowのIDを使って、イベント自体を自分でマップしようとしていたのですが、
どうもSDL自体がマップしようとしてるイベント等と衝突する可能性もありそうなので、
イベント自体はすべてSDLに任せといて、SDL_Event構造体にある、SDL_WMMsg(やったっけ?)のwindow
に対するメッセージをチェックしつつ、もしそれがIM関連だった場合のみIM関連のものを実行するのが良いかもしれません。

実際にテストでやってみて、できたらまた書きます。
OpenGL使ってる場合は、別にコンテキストが用意されてるみたいなのですが、
WindowsでのOpenGLの扱いがどうなってるかは良くわからないので時間かかるかもしれませんが・・・。
0558531 ◆pm4Rr1N8T6 04/09/01 04:52ID:Iu2ojuI1
GUI を使うってのは、ウィンドウシステム(この場合 Windows)標準のテキストボックスを使うって意味で、
子ウィンドウ(この場合テキストボックス)を作るために SDL_SysWMinfo を使ってるって意味で言ってたんだけど、
アプローチが違うから伝わってなかったみたいでごめん。

で、Windows 側でテキストボックス(エディットコントロール)を置いてみたんだけど、
どーしてもキーボードからの文字入力ができない。
まあよく考えると DirectX や OpenGL を使ってプライマリに描画されると
子ウィンドウは消えてしまうから元々この方法じゃ駄目かも知れないけど、
貼り付けや切り取りなんかはできるのに
一切の文字の入力ができないのはやっぱりおかしい。

と思ってソース読んでみたら、SDL め、
メッセージループでキーボードイベントを SDL の中に取り込んだあと
Windows 標準のウィンドウプロシージャーに渡さず破棄してる。
当然ウィンドウにキーボードイベントは通達されず、文字入力は不可能。
ALT+F4 での終了や ALT+SPACE でのメニュー出現が動かないのもこのせい。

そこで SDL_WMmsg を使ってみようとしたんだけど、
SDL で拾えなかったものだけを扱ってるもんだから
Windows 固有のキーボードイベントは破棄されててどうやっても取得できない。
もう一段ウィンドウプロシージャを噛ませるしか無いかな。
こりゃ大変だ……
0559531 ◆pm4Rr1N8T6 04/09/01 04:56ID:Iu2ojuI1
な、長すぎる。なんかスレ違いになってきてごめん。どっか別の場所に移動するよ。
0560名前は開発中のものです。04/09/01 10:29ID:Ph6g14fm
なんとなく。
Anthyのライブラリを使って自前で漢字変換するようにすればよいのではないかと思った。
sdlskkも同じような方式だっけ?なら同じようなのを増やしても意味無いな・・・。
0561名前は開発中のものです。04/09/01 22:55ID:M+Pa7IBI
>>560
意味あると思うよ。
skkは操作系がかなり独特だから対象ユーザが限られるけど、
Anthyなら普段は別のIMEを使用している人もそれほど違和感なく使えると思うし。
0562sgi_rocks04/09/02 04:11ID:fDohgGN6
>>558
ゲームのWindowと別のWindowを作ってそこで入力するのであれば、
それは既にやった事があります。(gtk+-2.xを使いました)
ゲームのWindow内に直接入力したいな、と思ってます。
恐らく、SDL_ttfを使うことになると思います。

>>560
自分で変換エンジンを作ってしまうのもよいのですが、
なるべく、ユーザーが使っているIMをそのまま使えるようにしようと思っていたので、
cannaやanthyではなく、XIMやIIIMFを操作する方法を探っています。

ただ、anthyなどを使って変換してしまうのも一つの手段ですし、
比較的簡単にできるかもしれませんね。

今少し時間がなかったりするので何もできてないのですが、
とりあえず私はXIMを操作する方向でやってみる予定です。
0563531 ◆pm4Rr1N8T6 04/09/05 01:18ID:O4WY3ynx
うごご、やっとなんとか動くもんができたよーん。
http://gamdev.org/up/img/1165.zip
中身の test.zip の中にサンプル入れてある。
現在 Win32 用の処理のみ。
自分で IME 処理を実装することもできるから、
フリーな IME があったら自分で機能を追加できるよ。
まだテストが不十分だからあちこちにバグがありそう。注意!

>>562
いや、Windows 標準の入力機構を使おうとしたってこと。
Windows では、テキスト入力部分もウィンドウの一種として扱われてるんだよ。

あと、SDL_ttf は仕様レベルでのバグもあるし、
文字描画エンジンをユーザーが選ぶことができなくなるからできれば使いたくないなあ。
一応、上のライブラリでは単純な変換状況取得しかできないようになってる。
ライブラリの使い方サンプルプログラムでは SDL_ttf を使って描画した。
0564名前は開発中のものです。04/09/05 21:21ID:gDPcDraA
562ではないですが、SDL_EventからXEventへ変換して、
それをXFilterEventしてやればXIMでも大丈夫なような気がしてきたのでちょいやってみます。
0565531 ◆pm4Rr1N8T6 04/09/05 22:36ID:Po72KKsf
http://gamdev.org/up/img/1175.zip
ソースがぐちゃぐちゃだったのであちこち修正。
ついでにバグを潰して間に合わせだった仕様も結構変えてしまった。
昨日のを落としてた人ごめんなさい。

>>564
がんばれー
056656404/09/07 02:23ID:aIh9QYNB
それっぽく動いたけど、キー取りこぼすし、終了できないし。
プロトコルとかまで調べないといかんかなぁ。。。
だれかXIMの挙動に詳しい人っている?
0567531 ◆pm4Rr1N8T6 04/09/07 03:52ID:s0fkyrDg
うーん、VMware に FreeBSD 入れてみようと頑張ったけど
インストール途中でこけるなあ。

とりあえず、MacOS 9 と MacOS X の入ったマシンを一台ずつ持ってるから、
そっちで Mac 版を作ってみるよ。
Mac の IME のインターフェイスは Text Service Manager ってんだっけ。
0568531 ◆pm4Rr1N8T6 04/09/07 03:58ID:s0fkyrDg
http://gamdev.org/up/img/1183.zip
昨日バグ潰したんだった。
あと、README のメッセージに関する説明を細かくしておいた。
仕様を確定させたつもりは無いから、
ウィンドウシステム固有の問題とかあったら連絡お願い。
0569sgi_rocks04/09/08 00:55ID:hVzmkiI8
>>568
基本的な仕様は現在ので良いと思います。
ひとつ提案があるとすれば、SDL_PollEventでイベントがなかった場合にIM関連のイベントを調べるのではなく、
User DefineなイベントをSDLのイベントキューに入れて、SDL_PollEventのループ内で他のイベントと同じように
処理できるようになればよいかな、と思いました。

>>566
私も531さんの仕様に沿った形で、XIMでの実装していたのですが、なかなか難しいですね(汗。
というのも、win32.cのように、自分でprocを作って、そっちで必要なものを処理した後、
SDLのprocにメッセージを渡す、というような形が取れれば一番良いと思うのですが、
X Window Systemでは、イベントが起こるたびに呼ばれるコールバック関数を設定する、というのはなく、
SDLが常にイベントを見るためにループしてるので、どうやってイベントをSDLより先に取得するかで悩んでます。
一応、XReparentWindowとかいう関数で、無理やり自分の作ったwindowをSDLの描写windowの親にして、
wmwindowの方はXUnmapWindow関数でマップをはずす事でなんとかSDLより先にイベントを取れるようになったのですが、
今度はXIMの仕様でなかなかわからなくて・・・。

XIMでは変換だけIMに任す、というのはできないらしく、必ず
何を入力しているのか、というのがXIMによって描写されてしまっている感じがします。
なので、変換中の文字列が取得できるにしても、すでにXIMによって画面に描写されている感じになってしまうかもしれません。
もしXやXIMに詳しい方がいらっしゃれば、その辺り教えて頂けると嬉しいです。
0570sgi_rocks04/09/08 01:07ID:hVzmkiI8
長くてすいません(汗。
なんかサイトとか立ち上げた方が良い気がしてきたりしますがどうでしょう?
057156404/09/08 03:05ID:/gyCnV3K
あ、かぶってしまった >>569
http://gamdev.org/up/img/1198.zip
kinput2 + canna で一応動いた。test/main.cは書換え無しでほぼ同じ挙動をするはず。
skkinputでは動かなかった。
on-the-spot とかいうスタイルを使えば描画も全部アプリケーション側でいけるはず。

いちいち全部描画をアプリケーションでやるのは面倒なこともあるかもしれんので、
ネイティブなIMEウィンドウで描画する方法もあったらいいかもしれんと思う。 >>仕様

>>570
たしかに、あったら助かるかも。
0572sgi_rocks04/09/08 10:28ID:Z7GwucVh
>>571
すごいです。Fedora Core 2(XIM + canna)で試しましたが、Windowsと同じように動作しました。
on-the-spotだとコールバック関数設定できたんですか(汗。思いつかなかったです。

一応サイトを作ってみました。
もし良かったら使って下さい。
ttp://p56.aaacafe.ne.jp/~sdlim/
0573sgi_rocks04/09/08 10:35ID:Z7GwucVh
>>571
すごいです。Fedora Core 2(XIM + canna)で試しましたが、Windowsと同じように動作しました。
on-the-spotだとコールバック関数設定できたんですか(汗。思いつかなかったです。

一応サイトを作ってみました。
もし良かったら使って下さい。
ttp://p56.aaacafe.ne.jp/~sdlim/
0574名前は開発中のものです。04/09/08 12:44ID:4F4ga2pg
>>569
> どうやってイベントをSDLより先に取得するかで悩んでます。
一応こんなもんがあるよ。
http://www.tacoworks.jp/software/SDLdoc-jp/html/sdlseteventfilter.html
ただ、これを使っても、SDL 自体の処理がタコで
ユーザーにイベントを回してこないことがある。
win32.c では SDL が一部のイベントを握り潰していたから
自分で Win32API 側のイベントを奪い取るしか無かった。
あと、アプリケーション開発側のユーザーが
SDL_inputmethod と同時に自前で SDL_SetEventFilter() を使った場合、
きちんと古い SDL_EventFilter を呼んでくれない危険性もあるね。
0575名前は開発中のものです。04/09/08 13:09ID:4F4ga2pg
>>571
おお、やった!
っていうか SDL_EventFilter 使ってたんだね。

> ネイティブなIMEウィンドウで描画する方法もあったらいいかもしれんと思う。 >>仕様
SDL_rwops や SDL_rotozoom みたいに本体と分離できないかな。
SDL_inputmethod 自体に描画を入れるのを嫌がってるのは
ユーザーに何らかの制約を課したくないだけだからなんだけど、
ほら、使わない場合にまでわざわざ SDL_ttf を入れるのって面倒じゃない。
もっとプリミティブな部分を前面に押し出していった方が
ユーザーとしても使いやすいと思ってたんだけど、そうでもないのかな。
そういう意味で
>569
> User DefineなイベントをSDLのイベントキューに入れて、SDL_PollEventのループ内で他のイベントと同じように
> 処理できるようになればよいかな
とも考えてたんだけど、
IME 処理は SDL 本体のイベントループと別の場所で
単純に処理できた方が楽だと思ってわざと今の仕様にした。
仕様に関しては他の人の意見も参考にしたい。

>>572
あらら、SourceForge.jp にでもプロジェクト立てればいいやと思ってたんだけど、
それは大体出来てからでいいかな。
っていうか LGPL で問題無い?

>573
おちけつ

ちょっと家に帰ったらテストプログラム修正する。
0576531,575 ◆pm4Rr1N8T6 04/09/08 13:11ID:4F4ga2pg
トリップ忘れ。上司が後ろを通って焦ってしまった。
0577sgi_rocks04/09/08 13:58ID:Z7GwucVh
>>576
確かにSDL_inputmethod自体は描写に関するものは一切含まないようにしておいて、
もしそれが必要でありそうなら、SDL_inputmethodに対するラッパーを書く方が良いかもしれませんね。

sourceforge.jpはまったく頭に無かったです。
もしそっちでできるのであればそっちの方が良さそうですね。

SDLでIMを使いたいな、と思ったのもゲームを作ってたのが原因なので、
今作ってるものにSDL_inputmethodを使ってみます。
057856404/09/08 16:06ID:5bciN7sZ
あー、ネイティブっていうのは、OSネイティブのIMっていう意味。
WindowsだったらMS-IMEの変換ウィンドウっていう意味で。

それだったらどう?
0579531 ◆pm4Rr1N8T6 04/09/08 18:28ID:4F4ga2pg
うーん、調べた限りだと、Windows の仕様では DirectX なんかで
プライマリバッファに描画するようにした時、
どうしても OS ネイティブなウィンドウがプライマリバッファで上書きされてしまうみたい。
Windows の場合は変換中の文字列も一つのウィンドウの中の表示という扱いで、
プライマリバッファに上書きされてしまうから、そういう条件下ではどうしても自前描画になるっぽい。

基本的な知識が足りてないから曖昧な言い方になってしまった。
わかりづらい説明ですまん。
結局 OS 自体に入力部分を描画させるのは難しいみたい。

俺の知識不足である可能性も充分に有り得るから、
誰か解決方法知ってる人がいたら情報お願い。
0580('A`)04/09/08 21:41ID:il2D+HG0
みなさんすごいですな。影ながら応援しとります。
自分は面倒くさいのでgtk windowid hackで取り込んで
テキストウィジェット貼り付けただけですませてもたですよ('A`)
('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)('A`)

http://drizzt.kilobug.org/pub/misc/gtksdl-gtk2.tar.gz
http://www.maccormack.net/~djm/sdl_win32_demo/sdl_win32_demo.zip
058156404/09/09 03:39ID:b9WTMygk
>>579
なるほど。じゃあ、やっぱ
プリミティブな部分ライブラリ + それのラッパみたいなライブラリ
っていう構成がいいのか。
0582名前は開発中のものです。04/09/12 22:47:27ID:Y32NRKdw
CVS版のsmpegなんですが、
smpeg/video/MPEGvideo.cppのMPEGvideo::Stopが以下のようになってます。
297 MPEGvideo:: Stop(void)
298 {
299     if ( _thread ) {
300         SDL_WaitThread(_thread, NULL);
301         _thread = NULL;
302     }
303 ----
304     playing = false;
305 ----
306     ResetPause();
307 }
playing = false;をSDL_WaitThreadの前にしないと何時までもStopしないと思うのですが…。
058358204/09/12 22:51:21ID:Y32NRKdw
> 303 ----
> 305 ----
の----は無視してください。
0584名前は開発中のものです。04/09/13 17:03:47ID:F/MIp811
SDL_inputmethodの話題、SDL Watch::TNGに取り上げられたね。期待!

SDL_inputmethod
http://p56.aaacafe.ne.jp/~sdlim/
0585名前は開発中のものです。04/09/13 17:16:32ID:055hpd5o
音沙汰がないと思ったらそっちでやってたのか。
0586名前は開発中のものです。04/09/13 18:53:29ID:F/MIp811
すいません。休刊になったLinux japan最終号の付録CD-ROMについてた"SDLバカ一代"のpdfは公開されているものでしょうか?
Linux japan最終号は出版元にも既にバックナンバーがない状態でして、SDLの貴重なドキュメントを逃したことが非常に残念です。。
Linux japanのいくつかの連載記事は出版元の協力を得てpdfで公開されているので、"SDLバカ一代"についても期待をしているのですが...
0587名前は開発中のものです。04/09/14 16:53:11ID:F75T3zlI
>>586
著者にメールで相談してみては?
0588名前は開発中のものです。04/09/14 19:23:51ID:BUAbryMc
GtkSDLをWindows上で動作させることは可能だろうか?
0589名前は開発中のものです。04/09/14 20:10:50ID:BUAbryMc
尋ねる前に自分でやってみるべきだた。
どうも無理ぽい。
gdkx.hをgdkwin32.hに、GDK_WINDOW_XWINDOWをGDK_WINDOW_HWNDに書き換えて
-mms-bitfields付けてgcc3.2.3でコンパイルしたところ、
SDLのウィンドウとGTK+のウィンドウの二つが。
0590名前は開発中のものです。04/09/16 14:37:11ID:HQ3ex6FR
おちる。。
0591名前は開発中のものです。04/09/16 17:49:16ID:2OLCusIL
SDL_inputmethod が sourceforge.net に引越ししたみたい

http://sdlinputmethod.sourceforge.net/
0592名前は開発中のものです。04/09/16 23:34:47ID:Bx2LEHan
ゲームの効果音って、Mix_LoadWAVあたりで全部pre-loadするのが一般的なのかな?
0593名前は開発中のものです。04/09/17 00:11:19ID:jqWr+HpC
>>592
一般的かどうかは知らんが、オレはそうしてる。
0594名前は開発中のものです。04/09/17 08:53:16ID:YTjwD9Cr
俺もそうすることが多いけど、会話シーン中の効果音程度ならその場で読み込んでる。
RPGやSLGなんかもその場で読んで充分じゃないかと思う。
リアルタイム要素の強さ次第かな。
059559204/09/20 00:02:29ID:qEnIINch
>>593-594
えらく遅くなりましたがありがとです。
0596名前は開発中のものです。04/09/23 07:48:29ID:MAQ37xzD
SDL_Init(SDL_INIT_VIDEO|SDL_INIT_TIMER)が失敗するのは具体的にどんな時なのだろう……
0597名前は開発中のものです。04/09/23 09:56:35ID:PYDXgeMB
ソースを読むのが確実なんじゃないですか
0598名前は開発中のものです。04/09/24 00:07:23ID:WNRqvYHH
>>596
とりあえずSDL_GetError()。
で、そのエラーを出してる部分のソースを読むしかないんじゃないかな。
0599名前は開発中のものです。04/10/12 16:04:41ID:JVe9TSlC
>>591
web pageからproject page(http://sourceforge.net/projects/sdlinputmethod)
へのリンクを張ってもらえるとうれしいです。
0600名前は開発中のものです。04/10/15 13:38:24ID:0e1E0ggZ
>>599の対応ありがとうございます。
0601名前は開発中のものです。04/10/21 11:52:02ID:6v+I1mnz
ちょいとみなさんに聞きたいのだが、
画像の回転表示ってどうやってますか?
OpenGL使うという方法もあるのかも知れませんが、一応それ以外で。
0602名前は開発中のものです。04/10/21 13:55:22ID:B5V9eGhn
>>601
どうやってといわれれば、回転させるプログラム組んで。
0603名前は開発中のものです。04/10/21 20:05:17ID:JI3rp/xx
SDL_gfx
SGE
0604名前は開発中のものです。04/10/22 16:04:05ID:jWZrFodZ
SDLでサーフィスを拡大・縮小するにはどうしたらいい?
Ruby/SDLのSDL#transformみたいなことをRUDLでやりたいんだが…
0605名前は開発中のものです。04/10/24 21:43:30ID:f3AiXIG4
SDL_ttfでアンチエイリアスを効かせるには、どうすればいいんでしょうか?
0606名前は開発中のものです。04/10/25 07:22:46ID:VVYWZ8/E
>>603
SDL_gfx SGE のどっちかを使え。
それぞれどういうものかは自分で使って確かめろ。

>>605
TTF_Render*_Shaded() TTF_Render*_Blended() のどっちかを使え。
どういう差があるのかは自分で使って確かめろ。

ドキュメントが少ないのは事実だが、
いくらなんでももうちょっと自分で調べないと何もできないぞ。
このぐらいの情報はすぐ見付かる。
0607名前は開発中のものです。04/10/25 15:36:34ID:+kRZkPnx
フォントをbmpにレンダリングするツールと、そのbmpを使って日本語を表示するものを作ってみた
しかし4MByte近いbmpになってしまった
でけーなぁ
透過pngにすると使い勝手はいいんだが、内部ではどれくらいに展開されてるんだろ
060860504/10/25 22:33:39ID:snYpUN8B
>>606
駄目ですた。
SHADEDは背景色が透過されずに表示されて、BLENDEDは何も表示され
ませんでした。
OpenGLのテクスチャに使うために、一度2の累乗サイズのサーフェイスに
Blitしてるのが原因なのかもしれないです。
SOLIDの場合はちゃんと透過されてるのに、何故なんだろう・・・。
060960504/10/25 23:43:05ID:snYpUN8B
すみません、出来ました。
SDL_ttfから取得したサーフェイスを、2の累乗サイズのサーフェイスに
Blitした後に、ttfのサーフェイスにアルファフラグを書き戻してやらないと
いけないみたいです。

何故こうなってるのか、未だにさっぱりですが、ともかくこういう物の
ようです。
どうもありがとうございました。
061060604/10/26 00:44:33ID:zFRaLOBe
>>609
「アルファフラグを書き戻す」ってのがどういう行為を指してるのかちょっとよくわからなかったんだが、
SDL_ttf の Blended 系では、
・フォントを描画した Surface を返す
・階調的なアルファブレンドも行う
という二つの条件を満たすために
返した Surface の中にアルファチャンネルを含めてある。

で、新しいサーフェスに Blit したりして
サーフェスをいくつもまたぐ時に問題になってくるのがこれ。
http://zinnia.dyndns.org/~cvsweb/sdldoc-jp/sdlblitsurface.html
> blit 操作の結果は SDL_SRCAPLHA がセットされているか否かによって大きく変化します。
> これがどのように結果に影響するかについては、 SDL_SetAlpha を見て下さい。

ここら辺をちゃんと設定してなかったんでないかい?
ちょっと情報が少ないから推測でもの言ってるが。

ところで、最初に提供してもらった情報が少なかったとはいえ、
この条件下なら確かに混乱して質問してもおかしくないわな。
キツい言い方して悪かった。
0611名前は開発中のものです。04/10/26 17:28:03ID:UwgETfqy
外出かも知れないが
SDL_imageを使って読み込んでOpenGL のテクスチャデータに変換
ttp://alb.hp.infoseek.co.jp/opengl/texture.shtml
透過png使えて幸せになれる
061260304/10/26 20:49:27ID:8Om0IHEs
???
061360504/10/26 23:10:01ID:tqT7U+dq
>>610
どうもです。
「アルファフラグを書き戻す」というか、Blitする前に
文字を書いたサーフェイスのSDL_PixelFormatのcolorkeyと、
alphaを保存しておいて、Blitした後に同じサーフェイスに
再度セットしなおすとうまく行くんです。
そのサーフェイスは後は解放するだけで、全く使わないんですが
そんなものなんでしょうか。

SDL_SRCALPHAとかSDL_SRCCOLORKEYとかは色々やってみたんですが、
全く駄目駄目でした。

スレ汚しでしたが、どうもありがとうございました。
0614名前は開発中のものです。04/10/28 05:06:14ID:mhNHIfQh
ところで、SDLの書籍ってないの?
探しても見付からない。できれば日本語が良いけど最悪英語でも良いかな。
0615名前は開発中のものです。04/10/28 07:07:22ID:qwRYnaqu
>>614
http://www.libsdl.org/books.php
日本語はなかったと思う。IntroductionとTutorialとかが結構充実していて
読みやすい英語で書かれているから(日本語訳もあるし)、それで十分間に合うと思うけど…。
でも、新しいAPIのmanは整備して欲しいかなぁ…。manが使えないときはソース読め。
0616名前は開発中のものです。04/10/28 07:09:55ID:LDePkSKW
翻訳すっか。
誰か英語に強い人いない?
0617名前は開発中のものです。04/10/28 10:03:12ID:tuc1m51K
>92
SDLってLGPLだよね?
LGPLはソースコード公開の義務はなかったはず
ソースコード公開の義務があるのはGPL
LGPLはリンクし直せなければいけなかったはず
でもWindows版はDLLになっているから大丈夫なのかな?
その他のプラットフォームならリンク前の物も入手できるようにしないといけないのか?
「欲しい人はメールください」ってREADMEにメアドといっしょに書いておけば、
常時アップしておく必要はない気がする
詳しいエロい人教えて
あとSDLを使ってること、SDLがLGPLであることはきちんとREADMEに載せないといけないよね?
0618名前は開発中のものです。04/10/28 23:15:32ID:rppov/8Q
いかなるオープンソース/フリーソフトウェアを使うに際しても
ライセンスを理解して同意するプロセスは必要不可欠.
つまり >>617 にSDLを使う資格はない.てか DirectX で十分だろ.
0619名前は開発中のものです。04/10/29 16:03:43ID:VQCXStAA
>614
日本語リファレンスは見た?
0620名前は開発中のものです。04/11/03 11:35:47ID:oDGcAACs
D言語でSDLを使っていて、
画像の回転や拡大のライブラリSDL_gfxがあると知りました。
早速使ってみようと思って落としてみました。
ですが、ビルドしてもインポートライブラリが無効であるとエラーがでます。
SDLgfxを使ってる方はどのようにしてLIBファイルを入手したのでしょうか。
それともD言語用には別な方法があるのでしょうか。

ttp://www.ferzkopp.net/~aschiffler/Software/SDL_gfx-2.0/SDL_gfx-2.0.12.tar.gz
0621名前は開発中のものです。04/11/03 12:21:56ID:YwbSD6qV
http://www.digitalmars.com/ctg/implib.html
これ使って作るんじゃね?
062262004/11/03 15:03:02ID:oDGcAACs
なるほど、Dでも使えるように変換しなければいけなかったのですね。
先ほど試しましたところ、ビルド自体は成功しました。(テストはまだですが

大感謝です。
■ このスレッドは過去ログ倉庫に格納されています