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

SDLスレ

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

とりあえず、本山
http://www.libsdl.org/
073973605/02/11 23:43:02ID:dXQ7K1nl
>>737
絶対パスでもだめでした。
>>738
ビットマップ埋め込みのやつでは駄目なんですね。
公式サイトから落としたやつは出来ました。
ありがとうございます。
0740名前は開発中のものです。05/02/13 00:50:02ID:phhxXInx
>>735
御意。うちは USE_RWOPS を定義して ogg を読み込んでます。

SDL_mixer の music.c を見てると、Mix_LoadMUS_RW() は
ogg, mikmod 以外は実装されてないですね…。
ということは mp3 に限らず cmd, wav, midi もダメっぽい。

ところで cmd て何?って調べてみたら
外部プログラムを実行して曲を再生するんですね…。

music_cmd.c を読んでみたら

冒頭に /* This is a UNIX-specific hack */

再生時に music->pid = fork();

一時停止時に kill(music->pid, SIGSTOP);
再開時に kill(music->pid, SIGCONT);
停止時に kill(music->pid, SIGTERM);

とかやってて、ビビリました。
074137805/02/13 10:02:12ID:msvBWsr3
>>735
> ってことは、mp3でなく、oggを推奨していますってことなのかな?

ogg の実装が一番楽だったってだけだよ。
libogg の方に登録する読み込み関数のポインタを
FILE 系から RWops 系にするだけだったから。

SDL_mixer は、USE_RWOPS の場合は RWops 版と FILE 版をコンパイルして、
そうでない場合は FILE 版だけをコンパイルする、というスタンスを取ってるせいで、
mp3, wav, midi は実装なんて読み込む部分以外全部同じなのに
両方のバージョンが必要になってる。

以前、全ソースを RWops 版で統一して、
Mix_LoadMUS は内部で単に Mix_LoadMUS_RW か cmd を呼ぶだけ、
という実装でパッチ投げたんだけど返答は無かった。
Mix_LoadMUS(_RW) レベルじゃなくて、
mp3, wav, midi それぞれの実装に FILE 版と RWops 版のインターフェイスを作らないと
受け入れてもらえそうにない。
めんどいなあ。ほとんど関数名置き換えるだけだから簡単なんだけど。
0742名前は開発中のものです。05/02/14 18:46:49ID:pz8RlDej
初歩的な質問で申し訳ないのですが、
SetColorKeyを使って透明色を持たせたテクスチャを表示するのは
SDL_BlitSurfaceでできますが、このテクスチャを拡大、回転をさせたい場合はどうすればよいの
でしょうか?
SGE_Transeformを使うとどうも透明色の効果が発揮しません。
0743名前は開発中のものです。05/02/14 19:59:14ID:ea+EL2qX
SDL_Surface は思ったより込み入った作りをしてる上に
適当に扱ってもそこそこ動いてしまうことが多いから、
仕様を厳密に守ってるライブラリは少ないよ。

http://www.ferzkopp.net/~aschiffler/Software/SDL_gfx-2.0/
こっち使ってみたらどうかな。
ちょっと前にソースを覗いたときはまだ不完全な実装してたから、
透明色周りの処理全部がちゃんとしてるかどうかはわからないけど。
0744名前は開発中のものです。05/02/14 21:00:13ID:pz8RlDej
>>743
さっそくのご回答ありがとうございます。
警告がばしばし出たうえに、多少手を加えないとコンパイルが通らない
ほどいまだ不完全な実装でしたが、透明色まわりは解決されていたようです。
0745名前は開発中のものです。05/02/15 19:44:14ID:YKXR9FxL
ぐあーBCCで1.2.8肝心のSDL.dllやらがコンパイルできねえ
\Borland\freebcc>make -f SDL.mak

..\..\src\video\windib\SDL_dibevents.c:
Error E2342 ..\..\src\video\windib\SDL_dibevents.c 189: Type mismatch in paramet
er 'lpPrevWndFunc' (wanted 'int (__stdcall *)()', got 'long (__stdcall *)(void *
,unsigned int,unsigned int,long)') in function DIB_HandleMessage
*** 1 errors in Compile ***
とかいうエラーが出て止まる……
makeall.bat動かしたらtestディレクトリに色々とデモらしきものが出来てるけど。

フリーBCC使ってる皆さんちゃんと動いてます?
0746名前は開発中のものです。05/02/15 19:48:01ID:TwJPXr3V
SDL.dllってコンパイルして作成しないといけなかったのん?
074774505/02/15 19:56:12ID:YKXR9FxL
>>746
SDL-1.2.8-win32.zipのSDL.dllをtestディレクトリに入れたらサンプル群がちゃんと動きました。
コンパイルできなくてもなんとかなる、というよりコンパイルする必要が無いからその辺テキトーなのかな…。
ソースに付いてるインストールガイド(Borland.html)ではSDL.dllもコンパイルされるみたいに書かれてるのに。
0748名前は開発中のものです。05/02/15 20:31:16ID:+9+lxg8U
>>745
>Error E2342 ..\..\src\video\windib\SDL_dibevents.c 189: Type mismatch in paramet
とりあえずキャストしてみたら?
intとlongの違いなら害は無さそうだし。
0749名前は開発中のものです。05/02/15 20:48:20ID:6CIQh+IC
前から BCC で使ってるけど、1.2.7 からコンパイルできなくなったと記憶してる。
DirectX と WinDIB の両方でエラーになるから、片方潰して回避することもできない。
結構粘ってみたんだけど、問題解決できなかった。
単に一つ定義が足りないっつってるだけかと思ったら、
手動で定義しても次々別のエラーが出てくるだけ。終わらない。
他に根本的な原因があるんだろうけど、解明できなかった。

ちなみに VC も DirectX のソースでエラー吐く。
こっちも問題を解決できなかったので、
プロジェクトの設定 -> 左の'SDL'を選択 -> C/C++ -> プリプロセッサ -> 定義から ENABLE_DIRECTX を消す
とやって、これでもまだ足りないから、
ファイルビューから名前に dx5 を含むファイルを全部削除した。
これで DirectX 無しでだがコンパイルできるようになる。
ちなみに、初期状態だと afxres.h が無いとか言い出すけど、
#include <windows.h>
とだけ書いた afxres.h を SDL-1.2.8\VisualC\SDL に置けば回避できる。
まさかちゃんとした afxres.h を持ってこないと
DirectX 付きでコンパイルできないってんじゃないだろうな……。

1.2.7 の時の話だから、今はまた少し事情が違うかもしれないけど、
手元で確認した限りだと 1.2.8 も BCC VC 共にそのままではコンパイル不可。
もう Cygwin でしかテストしてないのかね。
0750名前は開発中のものです。05/02/15 20:57:08ID:YKXR9FxL
中身見てみると
return CallWindowProc(userWindowProc, hwnd, msg, wParam, lParam);

てとこのおそらく第一の引数なんだが、関数の型キャストのしかたわからんです (´・ω・`)
でもここをなんとかしても駄目なのか……

>>749
情報ありがと。BCC使ってる人自体がもう少数なのか?
まあdll作れなくても動くみたいだからいいや。他のSDL_image なんかが使えるか心配だが。
0751名前は開発中のものです。05/02/15 22:58:42ID:+KOUJpD5
>>750
SDL_dibevents.cの189行
SDL_dx5events.cの547行
return CallWindowProc((FARPROC)userWindowProc, hwnd, msg, wParam, lParam);
SDL.makeの
OBJFILES=に..\..\src\cpuinfo\SDL_cpuinfo.objを追加
PATHCPP=に..\..\src\cpuinfoを追加
これで、make出来ると思う。(動くかどうかは(゚听)シラネ)
VC++だとerrorじゃなくてwarningだから、コンパイル通るみたいだね。

>>749
1.2.7も1.2.8もVC++6.0、VC.NET2003両方とも普通にコンパイルできるけど?
0752名前は開発中のものです。05/02/15 23:00:06ID:V7EcU05u
>750
BCC使ってるけどDLLをコンパイルし直すということはしないなぁ
075374905/02/16 05:37:50ID:ASwNW9Kw
>>751
ありゃ。俺んちだと次のエラーが出る。
SDL-1.2.8\src\Video\Windx5\SDL_dx5events.c(171) : warning C4013: 関数 'GetAncestor' は定義されていません。int 型の値を返す外部関数と見なします。
SDL-1.2.8\src\Video\Windx5\SDL_dx5events.c(171) : error C2065: 'GA_ROOT' : 定義されていない識別子です。
SDL-1.2.8\src\Video\Windx5\SDL_dx5events.c(171) : warning C4047: '=' : 間接参照のレベルが 'struct HWND__ *' と 'int ' で異なっています。
SDL-1.2.8\src\Video\Windx5\SDL_dx5events.c(655) : warning C4047: '=' : 間接参照のレベルが 'struct HWND__ *' と 'int ' で異なっています。
俺の環境がおかしくなってるだけかも。VC 入れ直してみる。

>>751
やべー、ほんとだ通った。ありがとう!

>>752
stdout.txt が鬱陶しいから直接コンソールに出力して欲しいとか、
パッチ書いたから BCC でもコンパイルできるか試すとか、
大抵そんなんじゃないかな。
0754名前は開発中のものです。05/02/19 00:06:37ID:G5VXh4sK
フリーのbcc使ってるから、ちょっとためになった。
imageとmixerしか使ってないけど…。
0755名前は開発中のものです。05/02/19 17:54:05ID:vHiopGBS
どうしてもわからないので教えてください。
SDL_CreateRGBSurfaceFrom ないしは、 SDL_CreateRGBSurface を
使用しようと、してるのですがなぜか
Fatal signal: Segmentation Fault (SDL Parachute Deployed)
といわれてしまいます。
少々ながいのですが、sample 乗せますので、どこがわるいのか
識者のかた、見ていただけないでしょうか?
------- cut here ----------------------------------------
#include <SDL.h>
#include <stdlib.h>
#include <string.h>
#define XXX (60)
int main( void )
{
int j;
Uint16 **data;
Uint32 rmask = 0x0000001f;
Uint32 gmask = 0x000007E0;
Uint32 bmask = 0x0000F800;
Uint32 amask = 0x00000000;
SDL_Surface * screen;

if ( 0 < SDL_Init( SDL_INIT_VIDEO|SDL_INIT_TIMER ) ) {
fprintf( stderr, "Colud not initialize: %s\n", SDL_GetError() );
exit(3);
}
atexit( SDL_Quit );
if ( NULL == SDL_SetVideoMode( 800, 600, 16, SDL_ANYFORMAT ) ) {
fprintf( stderr, "Could not set video mode... :%s\n", SDL_GetError() );
exit(4);
}
data = (Uint16 **)malloc(sizeof(Uint16) * XXX);
0756名前は開発中のものです。05/02/19 17:56:23ID:vHiopGBS
if ( NULL == data )
exit(10);
for (j = 0; j < XXX; ++j) {
data[ j ] = (Uint16 *)malloc(sizeof(Uint16) * 80 * 80 );
if ( NULL == data[ j ] )
exit(10);
memset( data[ j ], 0xff, sizeof(Uint16) * 80 * 80 );
}
screen = SDL_GetVideoSurface();
for ( j = 0; j < XXX; ++j ) {
int z;
SDL_Rect r = { 0, 0, 0, 0 };
printf("sprite index[%d] ...\n", j );
// SDL_Surface * surface = SDL_CreateRGBSurfaceFrom(data[ j ], 80, 80, 16, 80 * sizeof(Uint16),
// rmask, gmask, bmask, amask);
SDL_Surface * surface = SDL_CreateRGBSurface(SDL_SWSURFACE,
80, 80, 16, rmask, gmask, bmask, amask);

if ( SDL_MUSTLOCK( surface ) ) {
if ( 0 < SDL_LockSurface( surface ) ) {
fprintf( stderr, "Could not lock surface.: %s\n", SDL_GetError() );
return 0 ;
}
}
for ( z = 0; z < 80 * 80; ++z)
((Uint16*)(surface->pixels))[ z ] = data[ j ][ z ];
if ( SDL_MUSTLOCK( surface ) ) {
SDL_UnlockSurface( surface );
}
0757名前は開発中のものです。05/02/19 17:56:54ID:vHiopGBS
SDL_FillRect( screen, NULL, SDL_MapRGB( surface->format, 0x00, 0x00, 0x00) );
if ( NULL == surface ) {
fprintf( stderr, "Could not make surface...:%s\n", SDL_GetError() );
exit(1);
}
if ( j >= 10 ) {
int xx = j % 10;
int yy = j / 10;
r.x = xx * 80;
r.y = yy * 80;
} else {
r.x = j * 80;
r.y = 0;
}
SDL_BlitSurface( surface, NULL, screen, &r );
SDL_UpdateRect(screen, 0, 0, screen->w, screen->h);
SDL_Delay( 100 );
SDL_FreeSurface( surface );
}
return 0;
}
0758名前は開発中のものです。05/02/19 18:07:41ID:vHiopGBS
XXX の値は小さければ 10 以下であれば、問題ないようでした。
環境は、FreeBSD 5.3 STABLE です。
SDL は ports からインストールしました。
バックトレースは以下のようなものでした。

Program received signal SIGSEGV, Segmentation fault.
[Switching to Thread 1 (LWP 100099)]
0x08048b93 in main () at test.c:50
50 ((Uint16*)(surface->pixels))[ z ] = data[ j ][ z ];
上の SDL_CreateRGBSurfaceFrom を使用すると、
今度は、blit 中に落ちてしまいます。
回避方法がわからないので、メモリ中のイメージを 60 個程度q
surface にするにはどうすればいいのでしょうか?
0759名前は開発中のものです。05/02/19 18:17:41ID:La4+fv3Q
>>758
とりあえず
- data = (Uint16 **)malloc(sizeof(Uint16) * XXX);
+ data = (Uint16 **)malloc(sizeof(Uint16*) * XXX);
他にも何かあるかもしらんが、調べてない。

どうでもいいが、何でループ変数がいきなりjとかzなのか理解に苦しむな。
0760名前は開発中のものです。05/02/19 18:27:19ID:vHiopGBS
>>759
ビンゴです。ほんとにありがとうございました。
SDL スレ汚してごめんなさい。

>>どうでもいいが、何でループ変数がいきなりjとかzなのか理解に苦しむな。
精進します。。。
0761名前は開発中のものです。05/02/19 21:48:27ID:SeeIdQIF
次からはアップローダーにファイル置こうな……
0762名前は開発中のものです。05/02/21 23:59:34ID:kaKGM1be
sdl-fan-jpにspam投げてるヤツ、ウゼー!ヽ(`Д´)ノ
0763名前は開発中のものです。05/02/22 22:38:49ID:LwQOxQ0C
SDL-IM: IM(Input Method) support in SDL
http://sdl-im.csie.net/
0764名前は開発中のものです。05/02/23 23:34:20ID:w0AHRgcd
sakiwokosaretanokana?
0765名前は開発中のものです。05/02/24 12:36:00ID:cj7i1pZk
>>764
SDL-IMは昨年末にできたばかりみたい。
0766名前は開発中のものです。05/03/10 18:14:33ID:B6C7//HW
まともな動作実績もないのによくそんな適当なこと載せるよな(プゲラ
0767名前は開発中のものです。05/03/11 23:52:57ID:YMDZazr7
>>740
>>741
返答ありがとう。なるほど、やっぱり自分と同じようなこと試して知識得てる人って
いるんだな…流石だ。
741さんは更に上を行っているようですね。確かに、FILEポインタを使っているのであれば
SDL_RWopsを使うように変更するだけでいいから、確かに移植は楽だ。
0768名前は開発中のものです。05/03/13 18:25:40ID:YSxIy0RP
visual stdioNETでのこれの使い方おしえてください、

「初心者によるの」やり方ではコンパイラが通らないんですよ
なぜなんですか?
0769名前は開発中のものです。05/03/13 19:02:27ID:XjtKo/QE
なぜでしょうね。
0770名前は開発中のものです。05/03/13 20:04:03ID:TyhT8D4W
Visual Studio.NETで/MDオプションでビルドするとmsvcr71.dllと依存関係になっちゃうのはなんとかならんもんかね。
/MDじゃなくて/MTにするとリンクエラーが出るし。

このために.NET Frameworkインストールしてくださいって言うのもなんだし。
0771名前は開発中のものです。05/03/13 22:40:23ID:idmmnJMg
>768
コード生成のランタイムライブラリがマルチスレッドデバッグDLLになってなかったらコロヌ
ライブラリへのパスが通ってなかったらなおコロヌ
0772名前は開発中のものです。05/03/14 01:42:53ID:wCuLvh4G
>768
その原因は、SDLに付属のマニュアルに書いてあるよ。
君は.NETでDLLをコンパイルしたのかな?SDL for Beginersの掲示板ではそのことについてもきちんと書かれている。
よく読んでみるといいだろう。

>770

CランタイムのDLLをはずしたいなら、依存する全てのライブラリを/MTでコンパイルしなおさなきゃいけない。
それと、リンクエラーの意味は読めばわかる。
何が足りないのかは見当が付くけど、それの意味がわからない場合はそもそも力量が足りてない。

それと、MSVCRT*.DLLを入れればいいだけなのに、.NET Frameworkインストールしてくれというのは見当違いだよ。

0773名前は開発中のものです。05/03/14 01:44:48ID:wCuLvh4G
依存する->CランタイムライブラリDLLに依存するという意味ね。
0774名前は開発中のものです。05/03/14 02:19:56ID:VEcyrTnK
カリングとかどうなの?Java3Dより貧弱ってことはない?
0775名前は開発中のものです。05/03/15 19:37:17ID:Z609w/mR
mingwでsdl_ttf,sdl_net,sdl_image,sdl_mixer使うときはいちいち自分でコンパイルするより
vc用のインポートライブラリをreimpする方が楽だと今更気がついたのだった。
ははは
0776名前は開発中のものです。2005/04/02(土) 07:51:18ID:mMTwmK/8
なんか、VC++6.0でビルドしたやつ起動すると、
コマンドプロンプトも一緒に起動しちゃうんだけど、
これって仕様じゃないよね?

環境は
Windows2000
VC++6.0
SDL1.2.8

http://tokyo.cool.ne.jp/sdl/

2.導入から最初のプログラムまで SDLTutorial
に置いてある
SDLTutorialというソースなんだけど
0777名前は開発中のものです。2005/04/02(土) 08:41:42ID:6EJmuvmn
>>776
新規作成のウィザードでコンソールアプリケーションじゃなくて
windowsアプリケーションを選べ
0778名前は開発中のものです。2005/04/02(土) 16:44:19ID:mMTwmK/8
>>777
まじ感謝
0779名前は開発中のものです。2005/04/22(金) 00:07:43ID:Ae0Aozsn
SDL.NET って、SDL_imageFilter* 系は使えないのか…(´・ω・`)
07807792005/04/22(金) 00:09:58ID:Ae0Aozsn
嘘、Tao.Sdl から呼び出せた。なんでもない。
0781名前は開発中のものです。2005/05/07(土) 13:39:48ID:HNMZWJUh
はじめまして。早速ですが質問させてください。
現在がSDL_Surfaceに画像を読み込もうと次のようなコードを書いています。
FILE *fp = fopen( "pic/pic.bmp", "rb" );
if ( fp ) {
SDL_RWops *rwops = SDL_RWFromFP( fp, 0 );
SDL_Surface *surface = IMG_Load_RW( rwops, 1 );
}
ですがIMG_LoadRW()の部分でエラーが出てしまいます(ハンドルされていない
例外はsdltest.exe(NTDLL.DLL)にあります 0xC0000005Access Violation)。一方、
SDL_Surface *surface = IMG_Load_RW( SDL_RWFromFile( "pic/pic.bmp", "rb" ), 1 );
とした場合には正常に読み込めてその後画像を表示することも出来ました。
出来ればファイルポインタから読み込んで表示させたいのですがエラーの原因が
分かる方がいらしたら解決法を教えていただけないでしょうか?
開発環境はWindowsXP Pro、VC++6.0SP5、SDLのバージョンは1.2.8でSDL_imageの
バージョンは1.2.4です。よろしくお願いします。
0782名前は開発中のものです。2005/05/07(土) 16:26:55ID:tQ5vRoic
>>781

/src/file/SDL_rwops.cの230行あたりを見てるみと

#ifdef WIN32
 if ( ! in_sdl ) {
  SDL_SetError("You can't pass a FILE pointer to a DLL (?)");
  /*return(NULL);*/
 }
#endif

となっていてDLLではSDL_RWFromFPは使えないようです。
たぶんSDL_GetErrorでエラーが拾えると思います。
Static Linkすれば使えるのかもしれませんが、試したことはありません。
07837812005/05/07(土) 18:01:27ID:HNMZWJUh
>>782

うまく行かない時はSDL_GetError()を確認するべきだったのですね。
複数の画像ファイル等を一つのファイルにパックして、そこから
画像ファイルを読み込んで...ということをしようと思ってSDL_RWFromFP
を使ってみました。この方法がダメとなると何か他に良い方法があるでしょうか。
取りあえずSDL_RWFromMem()でできるかを試してみようと思います。
どうもありがとうございました。
07847822005/05/08(日) 19:51:26ID:ARUo6ShU
>>783

>この方法がダメとなると何か他に良い方法があるでしょうか。
>取りあえずSDL_RWFromMem()でできるかを試してみようと思います。

SDL_RWFromFileは内部でSDL_RWFromFPを呼び出しているだけなので、
SDL_RWFromFPで可能ならば、SDL_RWseekなどを使って同じような操作が
できると思います。もちろんSDL_RWFromMemでもかまいませんが。

ちなみにSDL_archiveというものもあります。
>>370
07857812005/05/08(日) 20:33:06ID:GW0v55yy
取りあえずSDL_RWFromMemを使って期待通りに動作させることが出来ました。
助言ありがとうございました。

質問ばかりで申し訳ないのですが今度はフォントの表示で行き詰ってしまい
ました。現在SDL+OpenGLでゲームを作ろうとしています。SDL_ttfでWindowsの
フォント(MSGothic.ttc)を読み込んで利用しているのですが、TTF_RenderUTF8_Solid()
で作ったSDL_Surfaceをどうやって描画してやればいいのかが分かりません。
glDrawPixelsでSDL_Surfaceのpixelsを描画すると文字は表示できたのですが、
背景が透明に出来なかったのでTTF_RenderUTF8_Solid()から作ったSDL_Surface
からテクスチャを作ろうとしたのですが幅と高さが2の累乗でないのでうまく行かず...
という状態です。もしうまいやり方をご存知の方がいらしたら是非ご教授ください。

...この質問はOpenGLスレでしたほうが良かったしょうか・・?
0786名前は開発中のものです。2005/05/09(月) 12:31:19ID:X842fXoJ
OpenGL使ってるなら、WGLにアウトラインフォントを描画する関数があったはず。それだとWin専用になってしまうけど。
ビットマップフォントでも良いならgl_kanjiがよろしいかと。
07877822005/05/09(月) 19:59:22ID:2WAlRLk2
>TTF_RenderUTF8_Solid() で作ったSDL_Surfaceを
>どうやって描画してやればいいのかが分かりません。
>幅と高さが2の累乗でないのでうまく行かず...

とりあえず、SDL_ttfのサンプルであるglfont.cが
SDL_ttfのソースと一緒にあるので、それを見ていただければ、
大体のことは分かると思います。

見てもよう分からんというときには、また聞いてください。
07887812005/05/09(月) 22:12:34ID:kc7J0Eit
>>787
そんなところにサンプルがあったのですね。全く気がつきませんでした。
早速サンプルを元にして試してみたら無事ttfからテクスチャを作って
描画することが出来ました(日本語は文字化けしてしまいますが)。

助言してくださった皆様、どうもありがとうございました。
0789名前は開発中のものです。2005/05/10(火) 03:45:21ID:iTBS7Jyy
>>788
OpenGL で TrueTypeフォント使って文字列描画したいなら SDL_ttf なんて使わずに
FTGL ( http://homepages.paradise.net.nz/henryj/code/index.html#FTGL )
を使うと幸せになれると思う.
outilne,texture,bitmap,pixmap とかの好きな方法でレンダリングできるよ

あと SDL_ttf で日本語が化けるのは使ってるフォントが bitmap フォントが
埋め込まれた TrueType フォントだとダメとかなかったっけ?
文字列がUTF8じゃないってことはさすがにないよなぁ...
07907812005/05/10(火) 11:15:14ID:/sZ8aOiM
>>789
そのまさかで文字列がUTFじゃないようです(Shift-JISなのかな?)。
TTF_RenderText_Solid()を使っているのですが他のを使えば良いのでしょうか。
それとも文字コードをUTF8に変換するプログラムを書けば良いのでしょうか。
0791名前は開発中のものです。2005/05/10(火) 19:58:16ID:iTBS7Jyy
>>790
なんてゆーか文字コード以前の問題だろ…
TTF_RenderText_Solid() はLATIN1なテキストしか通らんよ.
できたらマニュアルくらい読んでくれ.
http://jcatki.no-ip.org/SDL_ttf/SDL_ttf_35.html
07927822005/05/10(火) 20:14:19ID:c/mddx9W
>あと SDL_ttf で日本語が化けるのは使ってるフォントが bitmap フォントが
>埋め込まれた TrueType フォントだとダメとかなかったっけ?

msgothic.ttcの場合はSolidなら大丈夫、
ShadedやBlendedだと22pt以下はダメですね。
この問題だと化けるのは日本語だけではありませんが。

>それとも文字コードをUTF8に変換するプログラムを書けば良いのでしょうか。

UTF8かUnicodeに変換する必要があります。
フリーのフォントや文字コードについての話が
http://tokyo.cool.ne.jp/sdl/index.html
でも行われているので、お悩みなら参考になるでしょう。
0793名前は開発中のものです。2005/05/11(水) 01:00:39ID:irIlrbEI
msgothicでもTT_CONFIG_OPTION_EMBEDDED_BITMAPSをundefしてfreetype再コンパイルすれば22pt以下も表示できた気が
0794名前は開発中のものです。2005/05/11(水) 17:06:15ID:ChV6SFiM
SDL_ttf は埋め込みビットマップフォントのある TrueTypeFont を読むと、
埋め込みビットマップの存在するサイズを指定するだけで
アウトラインフォントを無視して強制的に埋め込みビットマップフォントの方を使うんだよ。
でもそのための処理は入ってない。だから化けてる。
>>793 は SDL_ttf が内部で使ってる freetype の埋め込みビットマップ処理そのものを潰して対処してる。
なんだかなー。俺も他のライブラリ使った方がいいと思う。
07957812005/05/12(木) 15:13:44ID:gBvQuFFy
皆様アドバイスありがとうございます。

mbstowcs()を使ってUNICODEに変換してTTL_RenderUNICODE_Blended()
を使うことで無事日本語を表示することが出来ました。
取りあえず22pt以下の場合はTTL_RenderUNICODE_Solid()を使って表示
することにしています。他にもライブラリがあるようなのでぼちぼち
調べてみようかと思います。どうもありがとうございました。
0796名前は開発中のものです。2005/06/25(土) 16:10:39ID:kpes39YP
軽めのGUIライブラリーってどれ?
多くてわかんない
0797名前は開発中のものです。2005/06/26(日) 17:35:22ID:zg82OFD2
今日(1時間前)からSDLを使い始めたものですが、
>>771の発言のおかげでttp://tokyo.cool.ne.jp/sdl/の一番雛形が通りました。
Thx!!
0798名前は開発中のものです。2005/06/26(日) 23:25:16ID:Expiz02r
>797
久しぶりにそこのぞいたけど、新しい記事とか解説はなかったな
カウンタが1000越えてるな
たしか>633が77ゲッツしてたんだよな、懐かしい
0799名前は開発中のものです。2005/06/27(月) 08:01:33ID:3Ab5ewvX
質問です。
2つあるんですが、
1個目、SDLの標準機能で2枚目のウインドウを作ることってできるんでしょうか?
2個目、SDLの標準機能でC言語標準のscanfやらfgets(from stdin)やらのように、ユーザーに要求を求めるようなことって可能でしょうか?

2個目は1個目ができればハードコードで作ることも可能そうですが、ちょっと面倒な気がします。
よろしくお願いします。
0800名前は開発中のものです。2005/06/27(月) 08:02:17ID:3Ab5ewvX
AGE!!
0801名前は開発中のものです。2005/06/27(月) 23:12:40ID:YfSmd5eY
>>749
GetAncestor(SDL_Window, GA_ROOT);
がとおらないのは
WINVER=0x0500とでも
C/C++ -> プリプロセッサ -> 定義
に入れると解決。

という遅レス

あとafxres.hなんてMFC入れればあるんじゃね?
08027992005/06/28(火) 01:25:30ID:xvJWzK7X
一日で一レスか。
こりゃ参ったなー。
作りたいものへのモチベーションも下がってきたし、一端とりさげるかな。
08038022005/06/28(火) 01:55:33ID:xvJWzK7X
再度検索してみたら、2000年の時点の話だが、対応してないというページを見つけた。
tp://risky-safety.org/~zinnia/sdl/watch/2000/10/
0804名前は開発中のものです。2005/06/28(火) 02:06:28ID:pKbCq+nM
>>799
1個目:
FAQだと思うが、改めてソースを見たところ、SDL_VideoInit()がcurrent_videoと言う
グローバル変数にビデオデバイス情報を格納していて、それを切り換えるAPIもない。
ロックせずに使用してるので、スレッド化も無理。
そもそもウィンドウという概念はない。

2個目:
コンソールを使いたいのか?だとすると開発環境によるだろうな。
俺は、MinGWを使ってるがこれだと無理っぽい。cygwinなら出来るだろうが、
cygwin上でSDLを動かしたことないんでよーわからん。
0805名前は開発中のものです。2005/06/28(火) 02:21:39ID:dyIcBP9c
>>799
どこかで既出だろう+試せば判るだろと思って黙ってたんだが。

ひとつめ、二つ以上のウィンドウは出せんとwebのどこかで読んだな。
ソースを見てもグローバル変数(Windows なら HWND SDL_Window)を
使ってそこらじゅうで使いまわしてるから、まず無理だろうと思う。

ふたつめ、起動した時にDOS窓(これも Windows の話だが)が出ているならできる。というかできた。
Windows の場合、設定によってはstdoutをstdout.txtにリダイレクトして、
DOS窓を出さないこともできるが、その場合はできなかった。
ソースは見てないが多分無理だろうな。
08068052005/06/28(火) 02:30:05ID:dyIcBP9c
と書いてる端から被ったか……。全く食いつきがいいよな俺ら。

>>804と俺で書いてることが微妙に違うが、
ひとつめの違いは>>804が機種独立の部分を見て、
俺が機種依存の部分を見て喋ってるせい。
ふたつめは環境の違いで、俺の環境(VC6)ではどちらも作れる。
MinGWとCygwinはどちらかができるんなら
両方できるんじゃないかと思うがどちらも知らんからわからんなあ。

と、聞かれてもいないが補足しとく。
0807名前は開発中のものです。2005/06/28(火) 04:03:09ID:xvJWzK7X
>>804-806
レスthx

1個目について、
なるほど、グローバル変数つかってるのか。
そりゃ、切り分けが大変そうだ。
明快な回答に感謝。

2個目に付いて、
えーっと、誤解を招いたようだけど、
要はscanfとか自体を使うのではなく、自前か何かで実装できないかって、話です。
それが、SDL標準であったら良かったんですけど、なさげですね。
2枚目のウインドウがでるなら、そっちのサーフェスとキー入力を捻って入力コンソールを作ることができたんでしょうけど・・・。

あと、
作りたいソフトを超えるソフトを見つけてしまったので一端引くことにしました。
それが、ちょうどイメージしてた物に近かったため、それでいいかなと思っています。
回答ありがとうございました。
0808名前は開発中のものです。2005/07/05(火) 04:30:00ID:zWniNiIr
640*480*32(bpp)の画像を1枚表示するだけで60FPS前後なんですが描画が遅いのは何が原因なんでしょう?
それともこれが限界ですか?

初期化は
SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_ANYFORMAT);
こんな感じでSDL_FillRect()せずにSDL_BlitSurface()してからSDL_Flip()。

環境は
Pentium4 2.4G
GeForce4 ti4400
08098082005/07/05(火) 04:38:10ID:zWniNiIr
補足です。
ウィンドウモードでリフレッシュレートは85Hzです。
画像を描画させなければ130FPSほどでますがFlipだけで130FPSってのはちょっと遅いですよね?
0810名前は開発中のものです。2005/07/05(火) 11:23:53ID:Arb1ZSmv
SDLってイイとか言われているけど
実は描画が遅いんだよね
0811名前は開発中のものです。2005/07/05(火) 14:08:42ID:1ZePfTMa
>>808
せめて実行可能なコードを出せよ…

SDL_Flipだけで130FPSってのは遅すぎるのでどこかが間違っていると思われ

とりあえず SDL_SetVideoMode()の戻り値のSDL_SurfaceとBlitしている画像
のSDL_Surfaceのflagsやformatをチェックして期待通りかどうかチェックしれ
08128112005/07/05(火) 14:24:14ID:1ZePfTMa
あとバカみたいだと思うだろうけどFPSの計算の仕方とかもチェック
08138082005/07/05(火) 14:53:21ID:zWniNiIr
>>811
>せめて実行可能なコードを出せよ…
あいすまんかった。

int main(int argc, char* argv[]) {
 SDL_Init(SDL_INIT_VIDEO);
 SDL_Surface* screen = SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE | SDL_ANYFORMAT);
 SDL_Surface* temp = SDL_LoadBMP("test.bmp");
 SDL_Surface* surface = SDL_ConvertSurface(temp, screen->format, SDL_HWSURFACE);

 while (1) {
  SDL_BlitSurface(surface, NULL, screen, NULL);
  SDL_Flip(screen);

  SDL_Event event;
  while (SDL_PollEvent(&event))
   if (event.type == SDL_QUIT)
    return 0;

  char buf[64];
  sprintf(buf, "%d fps", CalcFPS());
  SDL_WM_SetCaption(buf, NULL);
 }
 return 0;
}
08148082005/07/05(火) 14:53:54ID:zWniNiIr
>>813 の続き

int CalcFPS() {
 static Uint32 count, fps;
 static Uint32 btime;

 if (++count == 60) {
  Uint32 time = SDL_GetTicks();
  fps = 1000 / (float(time - btime) / 60);
  btime = time;
  count = 0;
 }
 return fps;
}
08158082005/07/05(火) 14:57:52ID:zWniNiIr
普通にDirectX(draw)でハードウェアサーフェイス作ると500FPSとか軽くでるので
ハードウェアやドライバがおかしいとも思えないし何ででしょうね。
皆さん上のコードでFPSいくつ位でます?
08168082005/07/05(火) 15:07:12ID:zWniNiIr
>>811
>のSDL_Surfaceのflagsやformatをチェックして期待通りかどうかチェックしれ
SDL_Surface.format_versionってのがscreenでは2、surfaceでは4になっている以外は同じです。
これが原因ですかね…?
んー。
08178112005/07/05(火) 18:34:24ID:1ZePfTMa
>>808
実行してみた.SDL_Flip()のみにして300fpsくらい出た…

CPU : PentiumM 1.1GHz
Video : i855GM (VRAM は Main Memory) の 16bpp

とりあえず毎フレームSDL_WM_SetCaption()するのは無駄なんで
CalcFPS()内のifの中に持って言ったら 400FPSくらいになった…
0818名前は開発中のものです。2005/07/05(火) 19:49:15ID:f1qgE5RI
試しました。確かに

WindowsXP
Pentium 4 2.4GHz
GeForce4 MX 420

ではSDL_Flip()だけで130FPSぐらいになります。
08198082005/07/05(火) 21:16:11ID:zWniNiIr
>>811, 818
テストありがとう。超ありがとう。
でもお気楽にハードウェアデバイスが使えると思ったんだが何やら環境依存でそうでもないみたいですね。
DirectXより環境に依存するなんて使う気無くしました。
他のクロスプラトフォームライブラリ探します。
レスありがとう。それに関しては感謝してます。
ありがとう。さようなら。
0820名前は開発中のものです。2005/07/05(火) 21:42:36ID:x9lRp/t3
>>819
他にいいのがあれば誰もSDLを使わないよ。
とりあえず、やりたいことが2Dなのか3Dなのか分からんが、
3Dの場合はOpenGLを使うことになるが、WindowsとLinuxでなんの
問題もなく使える。

しょーもないコード書いて勝手にSDLを悪者にするのだけはやめれ。
08218082005/07/05(火) 21:55:55ID:zWniNiIr
>>820
SDLを馬鹿にしているつもりはないよ。
それどころかSDLは初期化が簡単(ハードウェアを利用するライブラリとしては)なので初心者/入門者には最適だと思います。
また、さくっと作りたい場合は。
ただ、本家で掲載しているコードをほぼそのまんまの形で利用した場合、最低限バックバッファにコンパチブルな
オフスクリーンサーフェイスのフォーマットを選択してくれてもいいように思いました。
Simple directmedia layerのsimpleってなんでしょう?

>しょーもないコード書いて勝手にSDLを悪者にするのだけはやめれ
否定するなら根拠をまず述べるのが筋ってもんです。
0822名前は開発中のものです。2005/07/05(火) 22:59:46ID:LYpwtNFt
#pragma once
って、非ウィンドウず系でも使えるなりか?
0823名前は開発中のものです。2005/07/05(火) 23:16:04ID:zWniNiIr
>>822
少なくともgccでは#ifndefを使用したほうがいいかと。
そして激しくスレ違い。
0824名前は開発中のものです。2005/07/05(火) 23:16:34ID:iphFkIr5
たしかにそれだけ遅いとJava2Dより遅いってことだから
なんかわけがありそうな気がする・・・
0825名前は開発中のものです。2005/07/05(火) 23:29:28ID:l636Cdmy
DirectXもヘンテコなコード書けば、一部のマシンだけでしか動かないコードになると思うがな。
0826名前は開発中のものです。2005/07/05(火) 23:44:56ID:zWniNiIr
>>825
確かにコンパイラは嘘は付きませんからヘンテコはコードにはそれなりの挙動を見せます。
ですが、>>813がそれほど罪深きコードだとは思わないけどなぁ…。
それとも暗黙の了解的なコーディングがあるんでしょうか?
0827名前は開発中のものです。2005/07/06(水) 09:30:28ID:e9o9xwuh
>> 808
そのコードだとどちらのサーフェイスもシステムメモリに取られているだろう罠
811が言うように SDL_Surface の flags をチェックしてみ
08288182005/07/06(水) 20:18:02ID:mO4Tn2rF
確かに、/test/testvidinfo.cの
void PrintFlags(Uint32 flags)を使って

PrintFlags(screen->flags);
printf("\n");
PrintFlags(surface->flags);
printf("\n");
とやると

0x00000000 SDL_SWSURFACE
0x00000000 SDL_SWSURFACE
となります。


SDL_Surface* screen = SDL_SetVideoMode(640, 480, 32, SDL_FULLSCREEN | SDL_DOUBLEBUF);
にすると

0xc0000001 SDL_HWSURFACE | SDL_FULLSCREEN | SDL_DOUBLEBUF
0x00000001 SDL_HWSURFACE
となり、Blit & Flipで

30000 fps
になりました。(合ってるのかな?)
0829名前は開発中のものです。2005/07/18(月) 22:07:17ID:Tgmwb20q
Irrlicht初心者質問スレ
http://pc8.2ch.net/test/read.cgi/tech/1104179696/226
でも聞いてみたのですが、反応が無いのでこちらでも聞いてみます。マルチすいません。

Irrlichtで描画系、その他(音、入力関係とか)はSDLと組み合わせて使うことって可能でしょうか?
あと、もし可能なんだとしたら、サンプルとかあると嬉しいのですが、ご存じの方いませんか?
0830名前は開発中のものです。2005/07/20(水) 00:36:00ID:a4NCqugX
SDL_MixerでBGMのクロスフェードって可能でしょうか?
0831名前は開発中のものです。2005/07/20(水) 05:03:25ID:KNwpKu9v
Channelを1つBGMとして使えば行けるんで無いかしら。
0832名前は開発中のものです。2005/07/20(水) 19:24:07ID:oHYMFGyh
~~~~~~\   /~~~~~~
     \/
     /\
    /    \

じゃなくて

~~~~~~\        /~~~~~~
     \     /
      \   /
        \/
にする!
0833名前は開発中のものです。2005/07/20(水) 20:00:00ID:eQOHDI/N
SDL_Mixerはシンプルだけど、こまかいことは苦手
0834名前は開発中のものです。2005/07/20(水) 21:06:55ID:J6BwLsDL
~~~~~~\   /~~~~~~
     \/
     /\
    /    \
   ~~~~~~~~~~~~  ←この部分を合成
0835名前は開発中のものです。2005/07/25(月) 19:06:53ID:1zvi2dmP
SDLを使って、ゲームを作ろうと思うのですが、
Win上で使える入力補完機能のあるIDEはありませんか?
0836名前は開発中のものです。2005/07/25(月) 21:28:19ID:tBl8Lhba
入力補完のないIDEなんて, ほとんど存在しないだろw
好きなIDE使え
0837名前は開発中のものです。2005/07/26(火) 00:22:38ID:c4yZrU1p
>>835
VisualStudio.NETが一番おすすめ
0838名前は開発中のものです。2005/07/26(火) 03:30:17ID:fGo2aUYV
NetBeansでもEclipseでもいいぞ
■ このスレッドは過去ログ倉庫に格納されています