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

SDLスレ

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

とりあえず、本山
http://www.libsdl.org/
0485名前は開発中のものです。04/08/09 22:02ID:suCCLB3h
>>484
Ruby/SDL はよくしらないけど、
SDL_CreateRGBSurfaceFrom に相当するメソッドは存在しないの?
SDL_CreateRGBSurface は SDL::Surface.new に置き換わっているようだけど。
048648404/08/09 23:55ID:lqi/7vlX
>>485
>SDL_CreateRGBSurfaceFrom に相当するメソッドは存在しないの?
う〜ん…displayFormatあたりだろうか…
実験してみます。
048748404/08/10 16:19ID:ojobLfTU
>displayFormat
チュートリアルにサンプルがありました。どうやらサーフィス→サーフィスなメソッドのようです。
う〜ん…1ピクセルずつ書いていくしかないのか…_| ̄|○
0488名前は開発中のものです。04/08/10 19:03ID:og4arkOY
RubyだとBlitSurface が使えないってこと?
0489名前は開発中のものです。04/08/11 17:50ID:DHS7JU0v
>>488
使えるよ。
0490名前は開発中のものです。04/08/11 18:10ID:fjnBF2CC
>>484
Ruby/SDL のソースをざっと見てみたが、SDL_CreateRGBSurfaceFrom は無いようだな。
処理時間云々を気にするなら Ruby 以外も検討してみるといいかも知れん。

>>488
SDL_BlitSurface はあるが、引数に Surface をとるからな。
>>484 の場合手元にあるのはメモリ上のデータだから、それを Surface にする手段が欲しいんじゃないか?
0491名前は開発中のものです。04/08/11 23:45ID:uIr8FGgs
基礎的な質問なんですが、SDL使って作ったアプリってSDL.DLLとか必要になると思うんだけど、同梱配布していいものなの?
同人とかで売っても大丈夫なのですか?
0492名前は開発中のものです。04/08/12 01:11ID:1Ox6RoRS
>>491
動的リンクをして使うんだよね?
それなら、SDL.DLLのソースの入手方法さえ用意すればOK。
具体的には、そのソースを同梱するとか、本家のサイトのアドレスを説明書に入れとくとか。

LGPLライセンスについて、調べてみるべし。
0493名前は開発中のものです。04/08/12 03:39ID:GXLAlDtL
>>491
俺は実際同人で売ってる。
で、CDの中にSDL.dllのバイナリの他に
SDL-1.2.7.tar.gz
LGPL
を入れてある。
0494名前は開発中のものです。04/08/12 21:36ID:U24wpCkA
ほっしゅ
049549104/08/12 23:53ID:wAr6hdR2
SDL.DLLってファイルのまま使うことを動的リンクって言うんですよね。
動的リンクで使う予定です。

入手方法もしくはソースを同梱すればOKなんですね。勉強になりました。
LGPLがいまいち理解できなくて、いつまでも踏み出せずにいました。
ありがとうございました。

実際やろうとしていた事をズバリやっている493氏のような人物も居て励みになります。
0496名前は開発中のものです。04/08/17 01:08ID:2NQFsJZQ
AllegroをMingw(+MSYS)上でビルドしてサンプルを眺めている所なんだけど、
これ日本語入力はどうすればよいのだろう?
まだalfontは導入していないがデフォルトで日本語の表示は可能だし、
guiクラスに入力用のtextboxが用意されているようだが日本語は無理だ。
SDLは一応sdlskkなぞあるようだが。

Gtk+やTkからテキストウィジェットだけ拝借してくるしかないのかな。
0497名前は開発中のものです。04/08/17 02:39ID:NkMI/CJf
>>496
つーか何故SDLのスレでAllegroの質問をしますか。
0498名前は開発中のものです。04/08/17 21:22ID:Mr02eSkK
Ruby/SDLのSDL.transformってバグ持ちか?
拡大したときに下と右が削れる。
俺だけ?
0499名前は開発中のものです。04/08/18 00:14ID:O0wT/ab0
各種ライブラリ紹介スレ
http://pc5.2ch.net/test/read.cgi/gamedev/1008220559/
0500名前は開発中のものです。04/08/19 06:31ID:88YaKIPR
現在の画面解像度を取得する関数ありますか?
0501名前は開発中のものです。04/08/19 06:40ID:O1yTQBZf
http://www.wakhok.ac.jp/~momma/SDL/video/functions.html
0502名前は開発中のものです。04/08/19 23:51ID:6l6QpGXx
>>500
無いんじゃないかなぁ。
SDL_SetVideoMode()時に覚えておくぐらいしか。

あと、>>501のよりも>>421のが良いかも。
050350004/08/20 10:57ID:csZBm7g+
無いようですね。
サイズ変更させたくなかったんですけど妥協しときます。
ありがとうございました。
0504名前は開発中のものです。04/08/20 12:05ID:LiSmyfUa
http://zinnia.dyndns.org/~cvsweb/sdldoc-jp/sdlgetvideoinfo.html
0505名前は開発中のものです。04/08/20 16:46ID:esCldzWy
>>500-504
……なんか間違えてないか?
SDL_GetVideoSurface() だけで事足りると思うんだが。

SDL_Surface* screen = SDL_GetVideoSurface();
printf("width, height: %d, %d\n", screen->w, screen->h);

みたいな。おれがなんか間違えてんだろうか……。
0506名前は開発中のものです。04/08/20 22:03ID:JqCl1DGv
画像の拡大とか縮小って出来ないの?
SDL_BlitSurfaceのSDL_Rect *dstrectってw,hが無視されてしまうし。
困った困った。
050749804/08/21 00:43ID:ELGMlgii
自己解決
ソースとなるサーフィスのサイズはぴったりではいけないようだ。
余裕を持たせたら削れなくなった
0508名前は開発中のものです。04/08/21 01:17ID:wDjE80nx
>>506
SGEを使う手がある(sge_transform)。
http://www.etek.chalmers.se/~e8cal1/sge/index.html

正直、俺もネイティブSDLで使える方法があったら知りたいです
050950004/08/21 01:20ID:diBViIiV
サーフェイスじゃなくてディスプレイのサイズ知りたいんですよ。
winAPIのGetSystemMetrics(SM_CXSCREEN)みたいな。
0510名前は開発中のものです。04/08/21 10:32ID:FvC1IsvO
>>506
SDL_SoftStretch は?あまし勧められた API でも無いみたいだけど。
>>509
SDL_ListModes は?一番大きいのを取れば多分良いかな…
0511名前は開発中のものです。 04/08/21 22:11ID:H0unQWjV
gl_kanjiを使おうとしているのですが
これはいったいどこの部分にSDLを使っているのでしょうか??
ソースを見た限りではウインドウ表示ぐらいしかしていないような…。
ご存知の方いませんか??
というか、SDLがどういうライブラリなのかいまいち分かっていないです…ごみんなさい。

因みにSDL関係の関数(?)をウマーくOpenGLの関数などに置き換えたら、
SDL抜きの日本語表示ができました…!?何故だ〜〜?
051250504/08/21 22:19ID:qlUWPwIq
>>509
ああ、そういうことか。すまん、SDL_FULLSCREEN を前提にしちまった。
しかしそうなると >>502-503 の発言が判らないんだが。
「サイズ変更」ってのは SDL_SetVideoMode かと思ったんだが、
それでディスプレイのサイズがとれるのか……?

SDL の Windows 部分のソースを適当に眺めたんだが、GetSystemMetrics(SM_CXSCREEN) は
DX5_SetVideoMode と DIB_SetVideoMode (どっちも SDL_SetVideoMode の下請け) でしか使ってないな……。
両方ウィンドウを画面中央に表示するために使ってるだけだし。
SDL_ListModes は EnumDisplaySettings か IDirectDraw2_EnumDisplayModes の結果を使ってるから、
これもやっぱり「現在の」画面解像度はとれそうにない。

……やたら長文なだけで全然解決案にならんなorz

>>510
SDL_ListModes の一番大きいの、おれは使ってないな……。
1600x1200 で使うと字が小さすぎて目が痛くなるorz

>>511
……お前さん SDL_kanji と gl_kanji を間違えてないか?
0513名前は開発中のものです。04/08/21 22:34ID:H0unQWjV
511です。
>>512さん
間違えてないですよ。gl_kanjiも
#include <SDL.h>
#include <SDL_opengl.h>
ってなっています。
ウインドウ表示もSDL_SetVideoModeでやっていますし。
ひょっとしたらこれだけにSDLを用いているのかなーと思いまして。
051450504/08/21 23:18ID:qlUWPwIq
>>513
いや、おれは gl_kanji, SDL_kanji はおろか OpenGL も弄ったことのない軟弱者なんだが、でもやっぱりなんか違うと思うぞ。

今 gl_kanji を落として軽く見てみたが、
SDL 関係のヘッダを include してるのは、変換ツールとかサンプルとかのソースだろう?
gl_kanji の本体(?)は gl_kanji.cc と gl_kanji.h だけで、その二つは SDL とは関係ないんじゃないか。
つーか gl_kanji の readme.txt 読んでくれ。断言はできんがお前さん相当とっけんはっけんな質問してるような気がする。

SDL 判ってないっていうから念の為書いておくと、SDL と OpenGL の組み合わせには、
1. SDL 単体で使う、2. OpenGL 単体で使う、3. SDL から OpenGL を使う、って三種類あるぞ。
で OpenGL を使う気なら、gl_kanji つーのも選択肢に入ってくるだろうが、
OpenGL 抜きの SDL だけで日本語表示がしたいなら、
SDL_kanji か SDL_ttf を使うことになると思う。

どうでもいいがお前さん、2ch じゃメール欄に sage って書く癖つけておいた方がいいぞ。

……また無駄に偉そうな長文になってしまったorz
0515名前は開発中のものです。04/08/21 23:52ID:H0unQWjV
>>2ch じゃメール欄に sage って書く癖つけておいた方がいいぞ。
失礼しました…m(_ _)m

gl_kanji.ccのヘッダに
#include <SDL.h>
#include <SDL_opengl.h>
と記述してあるのはI-Saintさんのgl_kanjiです。
多分、オリジナルのとはちょっと違うのかもしれません。

...あ、しかもgl_kanji.ccのヘッダではなくtestgl_kanji.cppのヘッダ
でした…申し訳ないです、お騒がせいたしました…orz
もう二度とプログラミングには手をつけませんから許してください。
0516名前は開発中のものです。04/08/22 00:00ID:HGFZMTgG
>>515
冗談だと思うけど…
がんがれ!
んな事(゚ε゚)キニシナイ!!でプログラム書きまくれ!
051750804/08/22 00:02ID:pseiC9zk
>>510
おお、そんな隠しAPIがあるとは知らなかったですよ。thanks
とりあえずソースからコピればGPLとしては使えるわけか。

ぐぐってみたら、メーリングリストに506氏と同じ疑問が書いてあって
面白かった。
ttp://www.libsdl.org/pipermail/sdl/2001-March/034394.html
051850604/08/22 01:04ID:WvVrOjz5
>>508
サンクス。sge_transform_surfaceってやつですかね。

今のところ拡大・縮小だけ必要なのでsgl入れるのは気が進まないです。
自作した方が良いのかなあ…

>>510
SDL_SoftStretch、検索してみたけどうまく見つかりません。
もうちと捜索してみます。

0519名前は開発中のものです。04/08/22 23:02ID:WvVrOjz5
fpsをカウント表示するようにしたんですが、
フルスクリーンではfpsがリフレッシュレートと同じになったんですが、ウィンドウモードではとんでもなく多くなります。

アニメーションはSDL_GetTicksの値を利用しているので、早くなったりすることは無いですが、CPU時間は猛烈に食っていますよね。
ウィンドウ時になにか対策したほうがいいですか?

0520名前は開発中のものです。04/08/23 01:09ID:JruymYaP
>>519
次のフレームまでの間に時間が余ってる間はSDL_Delay(0)でループさせるとか。
0521名前は開発中のものです。04/08/23 02:20ID:4IY4L0bN
日本語の表示にSDL_kanji_f1bを使おうと思っているんだけど、
付属のサンプルがうまく動いてくれない・・・。

kanji_PutTextは問題なく動いてるっぽいのだが、
kanji_CreateSurfaceで作ったサーフェイスを
SDL_BlitSurfaceで転送しようするとアクセスバイオレーションとか言われてしまう。

環境は
Win2000
VC6.0
SDL-1.2.7(本家から落としてきたVC6用のバイナリ)
です。

何故わかる人アドバイスprz

0522名前は開発中のものです。04/08/23 23:37ID:vOt8qlrp
>>521
全く同じ環境だったから SDL_kanji_f1b 落としてきて試してみたんだが、普通に動くな……。
デバッガで追っかけて、具体的に何がバイオレーションを起こしてるのか探ってみるといいかも。

screen は kanji_PutText とかでも使ってるし text は kanji_CreateSurface 内でエラーチェックがあるから、
少なくともポインタが NULL になることはなさそうなんだがなあ。
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/
■ このスレッドは過去ログ倉庫に格納されています