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

SDLスレ

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

とりあえず、本山
http://www.libsdl.org/
044143604/07/08 11:56ID:HbCYsiEE
LGPL部分を差し替え可能にする必要があるというのは当然として…

ちょっと聞きたいんだけど…
オブジェクトファイルだけあったら差し替え可能として認められるのかな?
この時オブジェクトファイルのフォーマットとかは問題にならんのかしら?
あ… 配布したスタティックリンクされた実行可能ファイルの元に
なった.oさえあればOKってことかな?
0442名前は開発中のものです。04/07/08 14:48ID:1+ItRMvE
>>441
オブジェクトファイルのフォーマットは、gcc の吐くような極一般的なものなら全然問題無いと思うよ。
>>440 の言う通り、君が作ったソフトウェアのオブジェクトファイルさえ入ってれば大丈夫だから、それで合ってるね。
0443名前は開発中のものです。04/07/10 20:51ID:21jpHlag
SDL-1.2.7+WinXP+VC+++.net2003で下のソースで落ちてしまいます。
誰か助けてください。
#include <SDL.h>
doubleax,ay;
int main(int argc, char** args) {
  SDL_Init(SDL_INIT_VIDEO);
SDL_Surface *screen;
screen = SDL_SetVideoMode(640, 480, 8, SDL_SWSURFACE);
  while(true) {
SDL_Event event;
  SDL_MouseMotionEvent mouse;
while(SDL_PollEvent(&event)) {
if(event.type==SDL_QUIT) {
return 0;
}
   if(event.type==SDL_MOUSEMOTION){
    ay += mouse.x;
    ax += mouse.y;
   }
  }
  SDL_Delay(10);
}
}
0444名前は開発中のものです。04/07/10 22:02ID:JmED2rrl
ax,ayがオーバーフローすんちゃうの?
0445名前は開発中のものです。04/07/10 22:45ID:MW3XWIRh
>>443
dx, dy を初期化してないのはC的にいいとして、mouse を初期化してねーじゃねーか。
ググったらこことか引っかかったから見てみれ。
http://www.pl-berichte.de/work/sdl/sdl-teil2.html
044644504/07/10 22:47ID:MW3XWIRh
「3. Input-Handling in der Praxis: Maus」
ってとこね。ってよく見たらドイツ語だ。すまん。でもソースは分かるよね。
0447名前は開発中のものです。04/07/10 22:53ID:DRUUao5j
終了する前にはSDL_Quitしてほしいと思います。
0448名前は開発中のものです。04/07/10 23:10ID:MW3XWIRh
あと SDL_Delay() が一回も呼ばれない気がするのは気のせいか?
0449名無しさん@そうだ選挙に行こう04/07/11 07:05ID:VqfcMOHH
>>455
ありがとうございます。
>>447
>>448
作りかけのソースを削ったのでおかしくなってしまいました。
0450名無しさん@そうだ選挙に行こう04/07/11 09:59ID:E7W22GHh
>455がどんな解決方法を示してくれるのか。気になって夜も眠れない。
0451N速に書き込めません。04/07/11 10:18ID:wvsVVX1k
N速に書き込めません。

何とかしてください
0452名無しさん@そうだ選挙に行こう04/07/11 12:11ID:/yFc1fy2
>>452
そんなときはあれだよ。 あれ。
0453名前は開発中のものです。04/07/12 00:37ID:A2nXW2No
SDL_Surfaceをクラス化してるんですが、例えば SDL_kanji の Kanji_PutText()
みたいに SDL_Surface* を引数に取る関数を呼ぶときに楽しようと思って、
    class CSDLSurface {
        ...
        operator SDL_Surface*() { return surface; }  // surface は SDL_Surface*
などとクラス内に書いたんです。でも
    Kanji_PutText( ... , screen, ... );  // screen は CSDLSurface
とやっても、VC.NETに
    引数を 'CSDLSurface *' から 'SDL_Surface *' に変換できません
と怒られるし、(SDL_Surface*)screen とやってキャストして渡しても、クラスのアドレスが
そのまんま渡ってるみたいでうまくいきません。そもそもなんで operator をオーバーロード
してるのに型変換してくれないんでしゅか。
045445304/07/12 00:39ID:A2nXW2No
s/しゅか/しょうか/; # ○| ̄|_
0455名前は開発中のものです。04/07/12 01:05ID:1R+yHQE6
>>453
>     Kanji_PutText( ... , screen, ... );  // screen は CSDLSurface
Kanji_PutText( ... , screen(), ... );
じゃないかい?
045645304/07/12 01:29ID:A2nXW2No
>>455
screen()とやると、"関数には評価されません" と言われてしまいます、、
それと453に間違いがもう一つ
>    Kanji_PutText( ... , screen, ... );  // screen は CSDLSurface
screenは CSDLSurface* です
0457名前は開発中のものです。04/07/12 09:21ID:d4JCqMcp
>>456
> screenは CSDLSurface* です
じゃ、
Kanji_PutText( ... , (*screen)(), ... );
Kanji_PutText( ... , screen->operator(), ... );
のどっちかじゃない?
045845304/07/12 23:23ID:A2nXW2No
>>457
どうもお手数かけてしまってすみませんでした。
    Kanji_PutText(..., screen->operator SDL_Surface*(), ...);
でコンパイルは通ったんですが、よく考えてみるとどうやらscreenがポインタ
であることが原因だったようで、
    CSDLSurface screen; // ポインタにするのをやめた
    ...
    Kanji_PutText(..., screen, ...);
みたいに、普通にクラスを渡せばちゃんと SDL_Surface* に変換してくれるんですね。
これってC++の基本ですか? 恥ずかしいかも。

でもなんか、クラスをポインタでなく保持するのはよろしくない、みたいな文章をどこかで
読んだ気がして、それが引っかかってなんか気が進まないです、、
0459名前は開発中のものです。04/07/13 00:35ID:yFmAkR9z
gcc version 3.2 (mingw special 20020817-1)で実験してみた。
大体予想通りの結果?長文スマソ。

#include <iostream>
using namespace std;

class Foo {};
class Bar {
Foo foo;
public:
operator Foo*() {return &(this->foo);}
};

void hoge(Foo* p_foo_)
{
cout << p_foo_ << endl;
}
int main(int argc,char* argv[])
{
Bar bar;
Bar* p_bar = &bar;

hoge(bar);
// hoge(bar()); // no match for call to `(Bar) ()'
// hoge(p_bar); // cannot convert `Bar*' to `Foo*' for argument `1' to `void hoge(Foo*)'
hoge(*p_bar);
// hoge((*p_bar)()); // no match for call to `(Bar) ()'
// hoge(p_bar->operator()); // `class Bar' has no member named `operator()'

return 0;
}
0460名前は開発中のものです。04/07/13 03:32ID:P6ImUkzN
foo* operator() と operator foo*() は違う
0461名前は開発中のものです。04/07/13 03:58ID:szTJAEHM
>453
ポインタなら単純に参照を外すだけでいい
Kanji_PutText( ... , *screen, ... );

ただ、暗黙のキャストは怖いから、
楽しようと考えている程度なら、素直にGetterを作った方が良いと思う。
046245304/07/13 23:44ID:KSTvEm7j
ポインタの参照先を渡したらうまくキャストしてくれました。でも、仰るとおり
暗黙の型変換を故意に狙うのはよくないですね。それに、*screen で返って
くるのがポインタってのも直感的でないですし。結局
    SDL_Surface* GetSurface() const { return surface; }
を加えました。
0463名前は開発中のものです。04/07/21 22:14ID:yROlyeHQ
概念の質問になって申し訳無いんだが

surfaceって、オブジェクト毎に作って良いんだろうか?
今まで俗に言うスプライトみたいな扱い方してたんだが。

背景なら背景で、画像合成させて1つのsurfaceにするのが普通なんだろうか?
0464名前は開発中のものです。04/07/22 01:54ID:OPZjuMp0
>>463

とりあえず質問の意味がさっぱりわからん…
0465名前は開発中のものです。04/07/22 12:31ID:sx+OGorQ
分からないなら黙っててください。
0466名前は開発中のものです。04/07/22 14:51ID:xASuzJAT
煽りキター
0467名前は開発中のものです。04/07/22 17:39ID:mpU5Xpvs
普通かどうかはベンチマークで決めればいい
0468名前は開発中のものです。04/07/22 20:26ID:jpCxn5GA
>>463
漏れも何を聞いとるのかよう判らんのだが取り敢えず、
喪前さんの考える「Surface を一つにまとめることの長所」を教えてくれんかいの。

察するに割とどっちでもいいような気がするんだが……。
0469名前は開発中のものです。04/07/22 21:25ID:NOi9FMd0
>>463ではないが、複数の領域をバラバラに確保/解放することによる
オーバーヘッドやメモリの断片化による効率低下などがあるのか?
ってところじゃないんですかね。
0470名前は開発中のものです。04/07/22 21:27ID:mpU5Xpvs
Photoshopでレイヤーを統合するかしないかくらいの意味合いだろ
047146304/07/22 22:21ID:mBKaU+OV
試してみますた。

スクロールする背景部品3つを自分で合成したのと
そのままほっといて普通に処理させた方で試してみた。

結果、そのままほっといて普通に処理させたほうが早かった…
つまり、俺の書い処理の方がヘッポコでした。

メモリ使用量・動作速度でのメリットは全く無し、またsurfaceの数が
多すぎて判らなくなるなら、管理体制そのものを見直す方が良いっぽいです。
0472名前は開発中のものです。04/07/22 22:42ID:xASuzJAT
>スクロールする背景部品3つを自分で合成したのと
人間ダブルバッファをしたってこと?
0473名前は開発中のものです。04/07/23 01:31ID:k28imbO0
サーフェイス毎にヘッダとか余計な情報が入るだろうから
なるべく種類ごとぐらいにまとめておいた方がいんでないの
とSDL使ったこと無いやつが言ってみるテスト。
0474名前は開発中のものです。04/07/26 13:45ID:cbiqvpsK
SDLの入門のHPない?
0475名前は開発中のものです。04/07/26 15:46ID:Z8i+sT7Z
サンプルを物凄い勢いで弄るのがいいらしいよ。
0476名前は開発中のものです。04/07/29 02:24ID:kbrPCy1U
結局SDLは元々使うのがそんなに難しいライブラリじゃないし、
標準で付いてくるサンプルも充実してて解かりやすいから、
入門ページをわざわざ作る人があまりいないのかな、とオモタ。
0477名前は開発中のものです。04/08/02 11:44ID:uIIM7zIN
みなさんはキーリピートってどう実装してますか?
落ちものゲーとか作るときって結構これがUIに関わってきますよね。
キーが押された時刻を覚えておいて、押されっぱなしのままX_秒経ったら
キーがまた押されたことにする、とかするんでしょうか。
SDL_EnableKeyRepeat()みたいなのもあったんですがうまく動いてくれないんですよね・・
0478名前は開発中のものです。04/08/02 21:19ID:1kimllXS
>>477
> キーが押された時刻を覚えておいて、押されっぱなしのままX_秒経ったら
> キーがまた押されたことにする、とかするんでしょうか。
うん。
0479名前は開発中のものです。04/08/02 23:13ID:5gOr47iA
>>477
自前で処理、に一票。
どっちみちキーボードとジョイスティックの両方で操作可能にしたいから、
自分で適当にラッパー書くのが楽だと思う。
0480名前は開発中のものです。04/08/06 12:10ID:fX1V4XLW
SDL_mixerのMix_OpenAudioのバッファ値少なくすると
環境によっては激しく音質悪化するね…
だからといってバッファ多くすると遅延が・゚・(ノД`)・゚・。
0481名前は開発中のものです。04/08/07 17:44ID:wc7qHVar
SDL_mixerが性能面でイマイチなのは、わりと周知の事実なのかも。

そんなわけで、いっそSDL_sound + OpenALとかでシステム組んで
公開してくれたりすると嬉しいです(と、人まかせ)。
0482名前は開発中のものです。04/08/07 18:00ID:sO/xVe9h
SDL_sound 2.0 の草案が出たらしいね。
http://zinnia.dyndns.org/~zinnia/sdl/watch2/?date=20040730#p02
草案の本体がどこにあるのかちょっとわからなかったんだけど、
やるとしたら2.0の様子を見た方がいいんじゃないかな。
0483名前は開発中のものです。04/08/08 12:36ID:n15LlEy5
>>482
まだ草案段階なんだったら、待つ必要ないんじゃない?
これから、

細部の詰め -> α -> β -> リリース

と行くと何年後になるやら。
0484名前は開発中のものです。04/08/09 19:20ID:lqi/7vlX
Ruby/SDLでメモリ上にある任意のフォーマットの画像データ表示するにはどうしたらいい?
Rubyで生成した画像データをGUIに表示したいんだけどdraw〜なメソッドで描いていたらやたら時間がかかりそうだし
Surface.loadはファイルしかロードできないし…
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は結局アプリケーション作る人次第な気がするので…
■ このスレッドは過去ログ倉庫に格納されています