7.27.2008

SDL_gfx for Windows (and MinGW??)

SDL_gfxを試してみようかと思ったんだけど、いかんせん公式サイトじゃソースが配布されているだけで、Windows向けlibファイルとか、dllなんかが配布されていない。

で、みんなどうしてるのかと思って探してみたら、どうやらソースから自前でコンパイルしているらしい。
(なんて面倒なことを…)

きっと、ネット上にはそんな迷える私のために、コンパイル済みライブラリを配布してくれている親切な人がいるはずだと思って探してみるも、古いバージョンばかりが見つかる。

古いバージョンで我慢するかな・・・と思っていたところに、JessePなる人物が、2008/7/9付(ついこないだ!)で、最新と思しきSDL_gfxのコンパイル済みライブラリを作ったって、SDLのMLに投稿してた。

これを使わない手はないと思って、さっそくインストール。
(手順はSDL_imageなんかと同じ。)
で、入れたところで力尽きて、まだ試していない(笑)

時間があったら試そう。(どうやら、VC向けにコンパイルされたものらしいから、MinGWじゃだめかもしらんし。)

あと、そこで配布されていたものにはSDL_gfxのヘッダーファイルが含まれていなかったから、勝手に含ませてzipで固めて配布。
LGPLだし、問題ないよね?

(配布物に含まれているのは2.0.17のヘッダーだけど、DLLとlibがそれに対応していない可能性大。{←まだ試していないことに起因する}そんなわけで、もしうごかねーぞ、コンパイルとおらねーぞという問題が出たら教えてください。{&古いバージョンのSDL_gfxライブラリに切り替えればイケる可能性大なので、あきらめないでください})


# 以下、別文の機械翻訳

I need the SDL_gfx pre compiled library.

But, that library not distribute from the official SDL_gfx web site.

Today, I found the web, and I got that files.

Relation:
[I made below zip file include SDL_gfx header files]
[libsdl.org ML archives]
[JesseP's web site]
[SDL_gfx official web site]

7.26.2008

楽しいなぁ。SDLは。

プライベートで色々あって、相変わらずのお疲れモードだけれども、SDLは楽しいと感じる。
思えば、プログラミングを始めたきっかけというのが、「ゲームがやりたいけど買えない→よし作ろう」だったことを思い出した。

いつからツールやら実験データの変換フィルターやらばかり組むようになったのかなぁ。

そんな初心に還る思いがするからか、SDLでプログラムを組んでると、「あー。これとこれを組み合わせればこんなゲームになりそうだなぁー。」とか考えながら作ってる自分に気づく。
そしてこれが案外楽しい。

そんなわけでLesson10。
キーボードのどのキーが押されているかを判断するというプログラムなんだけど、我が家では2キー以上の同時押しに反応しなかったし、上下や左右といった反対キーの同時押しも反応してくれなかった。
アクションゲームやRPGつくるぐらいなら困らないだろうけど、格ゲーとなるとどうだろうか?
(後半にジョイパッドの取得があるから、それを応用するのかなぁ?)

これとスプライト処理を組み合わせれば、ダンスダンスレボリューションもどきぐらいは作れるんじゃないだろうかと思った。

例によって画像を複数くっつけようかと思ったけれど、各4キー+上右+上左+下左+下右という、合計8状態をキャプチャーしてくっつけるのは面倒だから、一枚にした。

最近2レッスン/日のペースで進めてるわけだけど、このペースなら、ひと月ぐらいで全部クリアできそう。
(理論値では36÷2=18なんだろうけど。そんなハイペースでやり続けるとは思えないので。)

ご冗談でしょうファインマンさんだか、ファインマンさん最後の手紙だかにあった、晩年彼が数学や物理学の問題を解くことを「楽しんでいた」という記述を思い出した。
確か彼は、初心に還ってそれらの問題に楽しみながら取り組んでいたというのが印象的だったなぁ。

まったりコーディング。

コーディングとはいえ、やっぱりやるのはSDL。
今回はLesson9、マウスイベントの処理。

久しぶりにC++に触ったなぁという気になった。
ここまでもC++で組んでたはずだけど、クラスとか意識しなかったし(作りもしなかったし)、今回ボタンイベントの処理において、久しぶりにC++でクラスを組んで動かしたわけで…。

ともあれ、マウスイベントをゲーム内で使うってことはそう無いんじゃないかなぁ?
(少なくとも、私が作るようなレベルのゲームではの話。ほとんど2Dのアクションゲームやパズルゲームなんかの、個人が趣味で作り捨て出来るようなタイプのゲームしか作らないし。)

でも、3D空間でキャラクターを動かすときに、マウスで操作できると便利だとか、2Dゲームでも、選択肢を選ぶときのカーソルの動きを、マウスである程度制御できると便利だとか(ノベルゲームなんかの場合ね)、役に立つことがあるのかもしれない。

画像は昨日と同じく、動きがないとわかりにくいタイプのプログラムだったことから、4つをくっつけてある。
重たいので、閲覧するときは注意。




# 最近毎日SDLのレッスンをこなしてるって記事書いてて思うんだけど、ソースもUPするべきかなぁ?
# でも、面倒なんだよね。ブログでそういう類のファイル扱うの…。

最近疲れてるのかな?

しばらくパソコンから離れて、のんびり農芸したり、本を読むのもいいかなと思った。
どうも、目の疲れやら体の疲れやらがとれないからなぁ。

まぁ、生活スタイルが不規則になってるっていうのもあるのかもしれないけど。

と、前置きはよしとして、Lesson8。
ここのところ、SDLが楽しくて、他の事をあんまりやってない。

トラ技の付録も、開けたきり手つかずだし。
接続してインストールして、五目並べゲームぐらい組めば満足するんだろうけど、まだそこまでいかないなぁ。
買っただけ満足なんて、そう無いのになぁ。
どうしたかなぁ。。。

そんなことは良しとして。
今回もみかちゃんフォントを使用。
前回、フォントがやや小さく感じたので、今回はポイント数を48にしてみた。


今回はループ内で押されたキーに対応する再描画が必要なんだけど、それをしてなかったり、7thのプログラムをだいぶ使いまわしたためにifの条件判定にミスがあったりして、15分ぐらいハマった。

gdbの使い方を覚えたいと思うと共に、クロスコンパイル環境だと、デバッグが難しいんじゃないだろうか?と思った。
Turbo debuggerとかでも、MinGWの吐き出すコードってデバッグできるんだろうか?
っつうか、大規模な環境を導入しなくてもさくさくMinGWの吐き出したコードをデバッグできるデバッガってないもんだろうか?(まさにgdbがそれなのかな?どうも、GNUファミリのコマンドをたくさん入れないと動かない気がするんだよなぁ。)

今回のプログラム、起動直後は背景画像が表示されてるだけだけど、矢印キーを押せば、押したキーに合わせてメッセージが表示される。
でも、キーを押していないからって、背景画像だけに戻ったりはしない。
そこをどうしたら背景画像だけに戻るか考えてみれば、キーが入力されている間だけXXするってコードはすぐに書けるようになると思う。

矢印キーの入力ができれば、ここまでのとあわせて、簡単なゲームぐらいなら作れそうな気がしなくもないけど、まだレッスンサイトの半分もいってないから、特別なにかを作ろうとは思わない。

あくまでゆっくりやってこう。

画像は、一枚だけだとわかりづらいかと思って、4枚くっつけてみた。
重たいから、クリックして見る人は注意。




# 追記
ということを書いたあとに調べてみたら、MinGWのGDBがあった。
解説サイトによれば、MSYSとかもダウンロードしろってなってたけど、GDBだけ落としてきて、展開→bin/フォルダからgdb.exeを取り出してみたけど、うまく動いてくれているみたい。
少なくとも、私が実行したいデバッグ作業(主としてブレークポイントの設定とステップ実行)はこなせそう。
これにprintfデバッグをつければ、小規模なデバッグ作業なら事足りるしね。
さ、gdbの勉強もはじめなきゃ。

7.25.2008

今日もきょうとてSDL(SDL_ttf で日本語を使う。)

そんなわけでLesson7。
SDL_ttfを利用して文字列を描画するっていうお話。

レッスンサイトでは、lazy.ttfってオリジナルのフォントを使っているけれど、私は使用条件のゆるいみかちゃんフォントを利用することにした。

そのほか、フリー(あるいはそれに近い条件)で使用できるフォントについては、このページがよくまとまってると思う
真面目なゲームとかじゃ、明朝やゴシックを使いたいこともあるだろうから、状況によっては参考にさせてもらおう。

さて、レッスンサイトのプログラムをそのまま使うと、実は日本語が表示できない。
以前に、今回構築したMinGWで日本語を通すにはソースをSJISにエンコする必要があるって書いたけれども、実はSDL_ttfに限って言えば、それも通用しない。

そのまま通しても、SJISにしても日本語が通らない。
じゃあどうするか?
レッスンサイトで
TTF_RenderText_Solid
となっているところを、
TTF_RenderUTF8_Solid
として、ソースコードをUTF8で保存→コンパイルを通せば、下の画面のように日本語を表示できる。

あとは、
mingw-c++ filename -lmingw32 -lSDLmain -lSDL -lSDL_image -lSDL_ttf -mwindows
としてコンパイルを通せばOK。
そうそう、SDL_ttf.hを#includeで指定するのも忘れずに。

これでSDL_ttfはdevel-VC8をもってきて、ヘッダーとライブラリをいつもの場所にコピーしておけば使えることがわかった。

追々調べてみると、どうやらfreetypeライブラリが必要なのは、*NIX上で文字を描画する場合だけらしい。
(Macだと必要なのかな?)今回の環境は、Windowsへのクロスコンパイル環境だから、freetypeのインストールは必要ないという結論になりそうな感じ。

文字が描画できると、またいろいろ出来そうなことの幅が広がる気がするよね。

7.24.2008

SDLの続き。

昔から、継続は力なりと申しまして(以下略

Lesson6。クリップというやつ。
たとえば、この例では一つのファイルに書かれた4つのボールをクリップして取り出しているけれど、実際のゲームだと、キャラクターのモーションパターンやマップチップ、魔法のエフェクトなんかでよく見る。

特にアニメーション系だと、ファイルオープンのオーバーヘッドが気になったりすることもあるから、あるていどの大きさの画像ファイルに、ある程度関連性のある画像をまとめて、クリップして取り出すような操作がいろんなところでテクニックとして扱われているみたい。

クリップまで出来たらから、たとえば適当なマップチップのセットから、マップを作りだすようなことも、ここまで学んだ内容でできるわけか…。



やらないけど。




眠れない。。。

ちょっとばかし、寝るタイミングを逃した感じ。

そんなわけで、SDLの続きをやる。Lesson5。

今回やるのはカラーキーを指定して、画像を重ねてみましょうというもの。
ゲームプログラミングでは必須?最近は違うのかな??
ミソは
Uint32 colorkey = SDL_MapRGB( optimizedImage->format, 0, 0xFF, 0xFF );
関数でカラーキーを指定するところで、ここのSDL_MapRGB関数の第2~第4引数は、抜きたいカラーをR,G,Bの順に16進数で指定しなくちゃいけない。
ショッキングピンク(#FF00FF)なら、0xFF, 0, 0xFFってな具合。

そんな調子で作ったのが以下。
キャラの画像出力するとき、キャラのまわりにアンチエイリアスかけちゃったから、微妙にピンクが残ってる(笑)
でもまぁ、一応うまくいったので良しとしよう。

# 追記
よく考えたら、キャラクターの光の当たり方がおかしい。
明らかにおかしい。
やっぱり深夜に作業するべきじゃないな。
生産性どころの問題じゃないや…。