HYPERSPACE UNIVERSE NEWS

Linux、Ubuntu、ネタ、SF、海外のニュース、その他諸々を扱うBLOG

Allegro Libraryのライセンス形態

2010-08-26 12:26:14 | PC プログラミング
Allegro Libraryのライセンス形態。

Allegro 4.2系 gift-ware
Allegro 4.4系 gift-ware
Allegro 4.9系 zlib license

Allegro 4.2系は、主に2Dの処理が得意で、DOS/Vゲームなどが流行った90年代のようなのレトロ調のゲームを開発するなら、これしかないのではないかと思わせるほど優秀なライブラリとなっている。

Allegro 4.4系は、簡単に説明すればAllegro 4.2系+OpenGLとなる。
OpenGLだけではなく、4.2系用に配布しているいくつかのアドオンが、既に組み込まれた状態となっている。

Allegro 4.9系(もしくはAllegro 5系)は、全てがリニューアルされモダンな仕様になっている。
ライセンスは4.9.6(4.9系の6回目のアップデート)以降、gift-ware(giftware)からzlib licenseへ変更になった。
4.9系は、Allegro 5のpre版で、WIPとなる。(WIP=Work in progress=感想や意見を聞きつつ開発が進行されている。)

Allegro 4.4系は4.4.1.1が最新版。
Allegro 4.9系は4.9.21が最新版。
(2010年8月26日現在。)

4.4系も4.9系も同様の手順で、展開したディレクトリから、以下のようにすればexampleやdemoが作成される。(ubuntu 10.04で試しました。)
$ mkdir Build
$ cd Build
$ cmake ..
$ make

いままで使ったことがなく、今から使うなら4.9系がお薦め。
(但し、Allegro 5へと正式にアップデートされるまでは、仕様などが変更される場合あり。)
zlibライセンスの自由度も高いが、giftwareは自由度がより高いと思われるので、giftwareにこだわるなら4.2系や4.4系がお薦め。

zlibなどのライセンスの日本語訳は以下が、参考になります。

OSI承認オープンソースライセンス 日本語参考訳
http://sourceforge.jp/projects/opensource/wiki/licenses


余談。
$ grep -i lisence allegro-4.9.21/*
で、ライセンスが検索されない…。
Allegroをもう少しよく使ってみようかと思い、ライセンスを検索したが見つからない。
ライセンスがどこにも書いてない!?
でも”lisence”とライセンスの綴りを間違えて検索していて、ライセンス条項を見つけられなかっただけだった。

licenseもしくはlicence(英)と綴るんだね。
明らかにお馬鹿なミスだが、うっかりミスです、と言いたい。


Allegroのサイト:
Allegro - A game programming library -
http://www.liballeg.org/

2種類のAllegro(ゲームプログラミングライブラリー)

2010-05-28 03:02:24 | PC プログラミング
有名なゲームプログラミングライブラリーAllegroを、少しだけ触れてみた感想。

Allegroは、モダンなAllegro APIと、クラシカルなAllegro APIがある。

Allegro 4.9.x(Allegro 5)がモダンなAPI。
Allegro 4.2.xとAllegro 4.4.xがクラシカルなAPI。

4.2.xと、4.9.xを使ってみた。

Ubuntu 10.04のAllegroパッケージはAllegro 4.2.xだったので、それをインストール。
レトロな雰囲気の2Dゲームを作るならこのライブラリーは最適。
ビットマップにCPUが直接描画するタイプ。


4.9.xは、allegro-4.9.20.tar.gzをダウンロード。
readme_a5.txtに書いてある説明の通りに作成した。
(特殊な文字が入っていないパスで)適当な場所に展開。
$ mkdir Build
$ cd Build
cmakeでmakeの準備。(cmakeが入ってない場合は、まずcmakeをインストールして下さい。)
$ cmake ..
コンパイルとインストール。
$ make
$ sudo make install

examplesやdemosに様々なサンプルが作られたので、動作チェック。
グラフィックはお洒落で綺麗な雰囲気。
オーディオ再生は、今のところLinux環境ではwavファイルの再生のみ対応している模様。


http://www.talula.demon.co.uk/allegro/

Eclipse CDTの設定。freetype2の場合。 ついでにIrrlichtも。

2010-05-16 16:09:02 | PC プログラミング
Eclipse CDTの設定。
freetype2の場合のメモ。
(ついでにIrrlichtも。)

Projetc → Properties → C/C++ Build → Settings → Tool Settings で以下の操作を行う。

GCC C++ CompilerのDirectoriesへ/usr/include/freetype2/を追加。
GCC C CompilerのDirectoriesへも/usr/include/freetype2/を追加。
Irrlichtの場合も同様に、Irrlichtのincludeへのパスを通す。

GCC C++ LinkerのLibrariesのLibrariesへfreetypeを追加。
Irrlichtの場合、GLやIrrlichtなどを追加。
パスが通っていない場合、GCC C++ LinkerのLibrariesのLibrary search pathにパスを設定する。

Eclipseは分かりやすくていい。

Ubuntu 10.04の64ビット環境で、IrrlichtとirrKlangを組み合わせる方法

2010-05-13 20:09:58 | PC プログラミング
64ビット環境のLinuxでも、IrrlichtとirrKlangを組み合わせて使える。
私はUbuntu 10.04の64-bit versionを使っているのだが、今まで64ビット環境ではirrKlangが使えないと思っていた。

しかし、
http://www.ambiera.com/forum.php?t=944
を読んでみると、使える事が判明。

そのまま64ビットでコンパイルすると、
libIrrKlang.so: could not read symbols: File in wrong format

とエラーを出力する。
その時にどうすればいいのかを検索していたら、ちょうどirrKlangのフォーラムにぴったりの答えを見つけた。

作者のnikoによれば、
「irrKlangは64ビットライブラリではなく、それはまだ32ビット。1.3.0リリースは、64ビットシステムでも同じように使用する事が可能というだけ。おそらくあなたは64ビットでコンパイルしている?」
との事。

私も64ビットでコンパイルしていた。
32ビットオプションを付けてコンパイルしなおしたら、音楽の再生を確認出来た。
-m32オプションを使い、全てを32ビットでコンパイルすれば、64ビット版のUbuntuでもそのままirrKlangが使える。

日本語だと情報が少ないので、メモ書きと説明を残しておこう。
以下、64ビット環境でirrKlang-1.3.0/examples/01.HelloWorldのexampleをコンパイルするためのメモ。

準備。
$ sudo aptitude install g++ g++-multilib libglut3-dev libxft-dev libxxf86vm-dev

irrKlangのexampleをコンパイルするには、g++ g++-multilibが必要。
Irrlichtのデモのコンパイルには、OpenGLとXxf86vmとpthreadが必要。(pthread関連は既にインストールされてあった。)
※私はIrrlichtMLを使い、freetype2も使う予定で、(Irrlichtとは関係なく)GLUTも使う可能性もあるので、libglut3-dev libxft-devをインストールしている。

まずは、irrKlang-1.3.0を展開し、01.HelloWorldをそのままコンパイルしてみる。
$ make
g++ main.cpp -o example -I"../../include" -L"/usr/lib" ../../bin/linux-gcc/libIrrKlang.so -pthread
../../bin/linux-gcc/libIrrKlang.so: could not read symbols: File in wrong format
collect2: ld returned 1 exit status
make: *** [all] エラー 1


次にMakefileを編集、-m32オプションを追加。
そしてmakeする。
$ make
g++ main.cpp -o example -m32 -I"../../include" -L"/usr/lib" libIrrKlang.so -pthread
In file included from /usr/include/features.h:378,
                 from /usr/include/stdio.h:28,
                 from main.cpp:8:
/usr/include/gnu/stubs.h:7:27: error: gnu/stubs-32.h: No such file or directory
make: *** [all] エラー 1


上の原因は、g++-multilibをインストールしていないから。
しかしインストールしていても、以下のようになる。
$ make
g++ main.cpp -o example -m32 -I"../../include" -L"/usr/lib" libIrrKlang.so -pthread
/usr/bin/ld: skipping incompatible /usr/lib/libm.so when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib/libm.a when searching for -lm
/usr/bin/ld: skipping incompatible /usr/lib/libpthread.so when searching for -lpthread
/usr/bin/ld: skipping incompatible /usr/lib/libpthread.a when searching for -lpthread
/usr/bin/ld: skipping incompatible /usr/lib/libc.so when searching for -lc
/usr/bin/ld: skipping incompatible /usr/lib/libc.a when searching for -lc


再びMakefileを編集、-L"/usr/lib32"を削除。
もしくは/usr/libを/usr/lib32に書き換える。
OPTS = -m32 -I"../../include" ../../bin/linux-gcc/libIrrKlang.so -pthread


そしてmakeを行う。
問題無くコンパイルされた。
しかしexampleを実行してみると、
$ ./example 
irrKlang sound library version 1.3.0
Could not load libasound.so

Hello World!
Press any key to play some sound, press 'q' to quit.


今度は実行時にlibasound.soが無い。
原因はシンボリックリンクが無いだけなので、それを確認し、シンボリックリンクを作る。
$ ls /usr/lib32/libasound* -l
lrwxrwxrwx 1 root root     18 2010-05-01 09:53 /usr/lib32/libasound.so.2 -> libasound.so.2.0.0
-rw-r--r-- 1 root root 813116 2010-04-09 19:50 /usr/lib32/libasound.so.2.0.0

$ sudo ln -s libasound.so.2.0.0 /usr/lib32/libasound.so

$ ls /usr/lib32/libasound* -l
lrwxrwxrwx 1 root root     18 2010-05-13 00:00 /usr/lib32/libasound.so -> libasound.so.2.0.0
lrwxrwxrwx 1 root root     18 2010-05-01 09:53 /usr/lib32/libasound.so.2 -> libasound.so.2.0.0
-rw-r--r-- 1 root root 813116 2010-04-09 19:50 /usr/lib32/libasound.so.2.0.0


64ビット環境でもirrKlangを再生出来るようになった。

_/_/_/ _/_/_/ _/_/_/

次に、IrrlichtのDemoにirrKlangを組み合わせる場合の説明。
Irrlichtも32ビットでコンパイルすれば、irrKlangと組み合わせられる。

ディレクトリirrlicht-1.7.1/source/Irrlichtへ移動。
既に64ビットでコンパイルしてあるなら、まずそれを消す。
$ make clean

次に、32ビットオプションを付けてコンパイル。
$ CPPFLAGS=-m32 make


irrlicht-1.7.1/examples/Demo/Makefileを編集。
※irrKlangの存在するディレクトリは各自に合わせ変更の事。
(以下、原文を行頭に##を付けてコメントにした。付いていない方が追加した行。)
##CPPFLAGS = -I../../include -I/usr/X11R6/include
##CXXFLAGS = -Wall -O3 -ffast-math
CPPFLAGS = -I../../include -I/usr/X11R6/include -I../../../irrKlang-1.3.0/include
CXXFLAGS = -Wall -O3 -ffast-math -m32 -pthread

##all_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L../../lib/$(SYSTEM) -lIrrlicht -lGL -lXxf86vm -lXext -lX11
all_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L../../lib/$(SYSTEM) -lIrrlicht -lGL -lXxf86vm -lXext -lX11 ../../../irrKlang-1.3.0/bin/linux-gcc/libIrrKlang.so


ディレクトリirrKlang-1.3.0/bin/linux-gccから、ikpFlac.so ikpMP3.so libIrrKlang.soを、/usr/lib32へコピーすれば、
$ sudo cp * /usr/lib32

前述のMakefileは、以下のようにしてもOK。
all_linux: LDFLAGS = -L/usr/X11R6/lib$(LIBSELECT) -L../../lib/$(SYSTEM) -lIrrlicht -lGL -lXxf86vm -lXext -lX11 -lIrrKlang


他のexampleのMakefileの場合、USERCXXFLAGSに-m32を追記する。
##USERCXXFLAGS = -O3 -ffast-math
USERCXXFLAGS = -O3 -ffast-math -m32

もしくは、
##USERCXXFLAGS = -g -Wall
USERCXXFLAGS = -g -Wall -m32

とした。

みんなに、良いプログラミングライフを。(>w<)b

Ubuntu(64-bit)でirrlicht

2010-04-17 10:02:16 | PC プログラミング
日本語表示が出来ると何かと便利そうなので、irrlichtにirrlichtMLを上書き。
Linux(Ubuntu)用にちょっとだけ書き換えればLinuxに対応するので、そのメモ。
※バージョンは irrlicht 1.7.1 と irrlichtML を想定した、メモ。

irrklangの替わりに、SDL_mixerを使ったDemoのコンパイルのメモもついでに書いておこう。

_/_/_/_/ _/_/_/_/ _/_/_/_/

ファイル include/IrrCompileConfig.h の変更。

#define _IRR_USE_INPUT_METHOD

#ifdef _IRR_WINDOWS_
#define _IRR_USE_INPUT_METHOD
#endif

_/_/_/_/ _/_/_/_/ _/_/_/_/

◆ IMETestの Makefile を作る。
example/IMETestのディレクトリ名をexample/29.IMETestに変更する。
そのディレクトリに、example/01.HelloWorldからMakefileをコピーして持ってくる。
数ヶ所、変更する。

Target := 01.HelloWorld

Target := 29.IMETest

Sources := main.cpp

Sources := CGUITTFont.cpp main.cpp

CPPFLAGS = -I$(IrrlichtHome)/include -I/usr/X11R6/include $(USERCPPFLAGS)

CPPFLAGS = -I$(IrrlichtHome)/include -I/usr/X11R6/include $(USERCPPFLAGS) -I/usr/include/freetype2/

all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lXxf86vm -lXext -lX11

all_linux: LDFLAGS += -L/usr/X11R6/lib$(LIBSELECT) -lGL -lXxf86vm -lXext -lX11 -lfreetype

◆ IMETestの irrUString.h の修正
1883行を #ifdef _IRR_WINDOWS_
1899行を #endif
にする。
※Windows以外では replace(uchar32_t toReplace, uchar32_t replaceWith) 関数が消える事になる。(コンパイル時にエラーが出るので、激しく適当な応急処置。)

◆ IMETestの main.cpp へのLinux(ubuntu)対応の追記
197行あたりに、1行を追加。
// Load fonts
#ifdef _IRR_WINDOWS_ //←この行を追加
wchar_t windir[512];

230行あたりに、9行を追加。
fonts[5] = CGUITTFont::createTTFont(env, tmp, 24);
#endif
#else /*_IRR_WINDOWS_*/ //←この行
#define FONTPATH L"/usr/share/fonts/truetype" //←この行
fonts[0] = CGUITTFont::createTTFont(env, FONTPATH L"/freefont/FreeSans.ttf", 12); //←この行
fonts[1] = CGUITTFont::createTTFont(env, FONTPATH L"/freefont/FreeSans.ttf", 24); //←この行
fonts[2] = CGUITTFont::createTTFont(env, FONTPATH L"/freefont/FreeSerif.ttf", 12); //←この行
fonts[3] = CGUITTFont::createTTFont(env, FONTPATH L"/freefont/FreeSerif.ttf", 24); //←この行
fonts[4] = CGUITTFont::createTTFont(env, FONTPATH L"/ttf-japanese-gothic.ttf", 12); //←この行
fonts[5] = CGUITTFont::createTTFont(env, FONTPATH L"/ttf-japanese-gothic.ttf", 24); //←この行
#endif /*_IRR_WINDOWS_*/ //←この行
font = fonts[0];
font2 = fonts[1];

※gccの場合、swprintf()などでwchar_tの文字列を使うときは、%sではなく%lsになるので注意。例 swprintf(tmp, 511, L"%ls/freefont/FreeSans.ttf", windir);

_/_/_/_/ _/_/_/_/ _/_/_/_/

サンプルのDemoで、irrklangの替わりにSDL_mixerを使う方法。

◆ examples/Demo/Makefile で、1行追加。
all_linux: LDFLAGS += -lSDL_mixer -lSDL

◆ examples/Demo/CDemo.h で、2行書き換え。
#define USE_IRRKLANG
//#define USE_SDL_MIXER

//#define USE_IRRKLANG
#define USE_SDL_MIXER

◆ examples/Demo/CDemo.cpp で、1行書き換え。
if (Mix_OpenAudio(22050, AUDIO_S16, 2, 128))

if (Mix_OpenAudio(22050, AUDIO_S16, 2, 1280))

※前はバッファを1024にしていたが、自分の一部のPC環境では長時間使っているとたまに無音になる不具合が発生したので、若干増やして1280にして様子見。

_/_/_/_/ _/_/_/_/ _/_/_/_/

各々のコンパイルと、サンプルの実行。

◆ 本体のコンパイル(デフォだとデバッグ用設定になっていて、最適化されていない)
$ cd source/Irrlicht
$ make

◆ サンプルのコンパイル
$ cd ../../examples
$ make

◆ サンプルのお試し
$ cd ../bin/Linux
$ ./29.IMETest


ttf-japanese-gothic.ttf(VLフォント)って綺麗ですな~。
ファイル名はIMETestだが、LinuxではIME制御のコードを一切書いていないっす…。
表示だけ対応させたのみ。
誰か書いて。
お願いエロい人。

irrlichtで日本語表示

2010-04-16 07:31:43 | PC プログラミング
Linuxでもirrlichtで日本語表示が出来るではないか。
¡Tachán! (ジャジャーン!)

※IPAモナーフォント(ゴシック)を読み込ませました。

楽勝で出来た。
こんなの昼飯前ですわ。
…。
嘘っす。
irrlichtMLを使った。
ちょっと手直しすればLinuxでも動くっす。
(つか、どこを手直しすればいいか、整理してブログに書くようですな。)

なんで実行時に
Segmentation fault
というエラーで落ちたのか?

原因:NULLのポインタにアクセスしてたから…。

オレ、アホなの?
アホす。

irrlichtのirrUString.hがエラーを吐くのでorz

2010-04-15 01:32:07 | PC プログラミング
ubuntu 9.10(64-bit)で、irrlichtを使ってみた。

freetype2を使おうと、コメントになっていたdefine行を
//#define _IRR_COMPILE_WITH_CGUITTFONT_

#define _IRR_COMPILE_WITH_CGUITTFONT_
と、有効にしコンパイル。

irrUString.hの方でエラーが出る。
エラーが出た関数を/* */で囲み、コメントにして(…。)、とりあえずコンパイルを通してみた。

試しに実行、
Segmentation fault


どこから直していいのか分からんす。

http://www.zgock-lab.net/irrlicht/
http://lesson.ifdef.jp/
http://f30.aaa.livedoor.jp/~kimkim/VC/DirectX3D/irrlicht_etc.html
http://etwas.wolfish.org/Irrlicht/irrlichtml.html
上記のサイトを参考に、Linux上でもがんばってみる。

FreeType2での太字、斜体

2010-02-10 10:40:31 | PC プログラミング
日本語で書いてあるFreeType2に関する情報が少ない。

FreeType2のヘッダを見てみたら、便利な関数を発見。
(アルファコードだけど。)
freetype/ftsynth.hにある、FT_GlyphSlot_EmboldenとFT_GlyphSlot_Oblique

FT_GlyphSlot_Emboldenは、太字に変換する関数。(アウトラインとビットマップ両方に対応。)
FT_GlyphSlot_Obliqueは、斜体に変換する関数。

例えば、
FT_Load_Glyph( face , glyph_index , load_flags );
の後、
FT_GlyphSlot_Embolden( face->glyph );
とすれば、それ一発で太字に変換してくれて、かなり楽。


キャッシュや太字や斜体に関する情報を検索し、とても参考になるサイトを発見。

http://higambana.ashigaru.jp/doblog/200610.html#id2620702
http://hp.vector.co.jp/authors/VA028002/freetype.html

SDL_mixerを大きなバッファサイズで使うのは、ゲームに不向き

2009-12-18 04:02:48 | PC プログラミング
音楽再生だけなら安定して再生させるためにバッファサイズが4096バイトでもいいけど、ゲームとなるとそれじゃダメ!
全く同期が取れていない~~~。
バッファが大きすぎて、遅延して効果音が出るっす~。
めっちゃ、まぬけだ~~。
付属のexampleのソースコードが4096バイトだったのでそのまま使ってた。(言い訳…)

256バイトだとバッファが小さすぎて、まともに再生されない。
512バイトでも、たまにおかしくなる。
自分の環境だと1024バイトから安定する。

レスポンスを良くするために周波数(frequency)を倍にし、バッファを半分の2048バイトにした。
これで前の4倍のレスポンスになる。(ぎりぎりゲームに使えるレベルと思われる)
Mix_OpenAudio( 44100 , MIX_DEFAULT_FORMAT , 2 , 2048 )

周波数デフォルト(22050Hz)で、バッファ1024バイトでも同じく分解能4倍。
Mix_OpenAudio( MIX_DEFAULT_FREQUENCY , MIX_DEFAULT_FORMAT , 2 , 1024 )

簡単にSDL-mixerを使うためのメモ

2009-12-14 00:00:18 | PC プログラミング
ローカルにインストールされたSDL-mixerのサンプルソースの場所。
/usr/share/doc/libsdl-mixer1.2-dev/examples

BGMのマスターボリューム設定。
int bgm_master_volume = MIX_MAX_VOLUME;
Mix_VolumeMusic( bgm_master_volume );

効果音のマスターボリューム設定。※-1で全てのチャンネルIDが対象になる。
int se_master_volume = MIX_MAX_VOLUME;
Mix_Volume( -1 , se_master_volume );

0~num-1のチャンネルIDの予約。
仮に引数を10を指定すると、0~9のチャンネルIDが予約され、自動割り当てされないように考慮される。
つまり"Mix_PlayChannel( -1 , wave , loops );"などとチャンネルIDに-1を指定し自動割り当てを行うと、チャンネルIDには10以降の空いているチャンネルIDが割り当てられるようになる。
int num = 10;
Mix_ReserveChannels( num );

int ch_id = 0;

音の方向と距離(音の強弱)を設定する。※Mix_SetPositionとMix_SetPanningは共に、後から設定した関数により設定が上書きされる。
Sint16 angle = 0; // 90:right 270:left
Uint8 distance = 0; // 0:near 255:far
Mix_SetPosition( ch_id , angle , distance );

音の左右のバランスを設定する。※Mix_SetPositionとMix_SetPanningは共に、後から設定した関数により設定が上書きされる。
Uint8 leftvol = 255; // 0:min 255:max
Uint8 rightvol = 255; // 0:min 255:max
Mix_SetPanning( ch_id , leftvol , rightvol );

音の方向もしくは左右のバランスを保ちながら、距離(音の強弱)のみを変更する。
Uint8 dist = 0; // 0:near 255:far
Mix_SetDistance( ch_id , dist );

効果音のパン設定(方向と距離、左右バランス)は、同じチャンネルIDだからといって設定は反映されないので、新たに再生する度に設定しなおす、もしくは再生しながら設定する。

BGMと全ての効果音を一時停止する。
Mix_PauseMusic();
Mix_Pause( -1 );

一時停止を解除する。
Mix_ResumeMusic();
Mix_Resume( -1 );

一時停止状態かどうかは Mix_PausedMusic() や Mix_Paused( channel_id ) でチェックできる。



FPSなどで自プレイヤーが絶えず移動、方向転換している場合、聴こえてくるエネミーの咆哮などの効果音も相対的に絶えず変化することになる。
簡単なチャンネルIDの管理のメモ。

//チャンネルID変数へのポインタ配列
#define CHANNEL_ID_MAX 128
int *channel_id_ptr[CHANNEL_ID_MAX] = {NULL};

//効果音の再生終了時に呼び出されるコールバック関数
void channel_finished( int channel )
{
	if ((unsigned int)(channel) < CHANNEL_ID_MAX)
	{
		if (channel_id_ptr[channel])
		{
			//再生が終了したので-1を書き込む。ポインタは初期化する
			*channel_id_ptr[channel] = -1;
			channel_id_ptr[channel] = NULL;
		}
	}
}

//効果音の再生終了時のコールバック関数の登録
Mix_ChannelFinished( channel_finished );

↑以上は初期設定。
↓以下は毎回のメインループの中で行う処理。

//効果音再生&ポインタ更新
id = Mix_PlayChannel( -1 , enemy_wave , 0 );
channel_id_ptr[id] = &id;

//再生が終わっていないなら効果音の位置を更新
int i = id;
if (-1 != i) Mix_SetPosition( i , angle , distance );