OpenLayerはAllegroから派生したC++言語のライブラリで、高速な2D表示にOpenGLを使用しており、TTFとPNGもオプションで対応しています。ライセンスは GNU Lesser General Public License (LGPL)
C++で書かれたライブラリなので、Xcodeから使うには、main.c ソースを main.mm (ObjectiveC++ )として扱います。
配布元
SVNアーカイブ
リファレンス(英語)
OepnLayer 2.0 はOSXでビルドできないので SVNリポジトリ内の OpenLayer 2.0.1を使う。
必要なライブラリは Allegro4.2.0、AllegroGL 0.4.0(とOpenGL)、GlyphKeeper(とFreeType)と、loadPNG(とlibpng)、Zlib。
OpenLayer 2.0.1 をビルドするには makefileではなく 同梱されているcbuild を使う。
インストール
ターミナルから
./cbuild.c
wish to drop〜support?
〜のサポートを止めたいですか?と聞いてきます。
Seting up for macosx environment
Do you wish to drop PNG support? [y/N](PNG読込み)
n
Do you wish to drop TTF support? [y/N](TrueTypeフォント)
n
Do you wish to drop old API Support? [y/N](旧verとの互換性)
n
Do you wish to drop State Changes? [y/N]
y...yes / n...no の意味。
yかnで答えるとビルドが進行します。
./cbuild.c install
インストールがうまく行かない場合はビルドディレクトリからファイルのコピーを手動で行う。
OpenLayerを解凍した場所の Include ディレクトリ内にある OpenLayer.hpp とOpenLayer ディレクトリを丸ごと/usr/local/include/にコピー。
同じく、lib ディレクトリの内に生成された、 libopenlayer.a を/usr/local/lib/にコピー。
アンインストールするには ./cbuild.c uninstall
最初の状態に戻すには、./cbuild.c clean
リンカフラグには、ライブラリのファイル名に対応するフラグを与えます。
TTFフォントをサポートするなら -lglyph-allegrogl -lfreetype
PNGファイルをサポートするなら -lpng , -lloadpng -lz
ただし、インストール時に、PNGサポートをやめる"y"を選択したのに、PNG画像を使うソースをコンパイルするとエラーが出たりします。また、cpp ファイルをコンパイルするのにg++ を使わず gcc を使ったりするとエラーがでます。
サンプルプログラムのコンパイルと実行。
TrueType フォントの表示
cd demos/textdemo
g++ Main.cpp -o textdemo -I/usr/local/Include/ -L/usr/local/lib/ -lopenlayer -lglyph-allegrogl -lfreetype -lloadpng -lz -lpng -lagl `allegro-config --libs` -framework OpenGL -framework Carbon
フォントを読み込み Hello world と表示。
コリジョン(衝突判定)デモ
cd demos/collisiondemo
g++ Main.cpp -o collisiondemo -I/usr/local/Include/ -L/usr/local/lib/ -lopenlayer -lglyph-allegrogl -lfreetype -lloadpng -lz -lagl `allegro-config --libs` -framework OpenGL -framework Carbon
ESCで終了 カーソルキーで操作。スペースキーでポーズ。
バウンドする四角形を操作し、体当たりで小さな四角形の弾を赤い領域に入れれば勝利。自分が赤い領域に入ったり、画面外に飛ばされたら負け。
不明
cd demos/gamedemo
g++ Demo.cpp -o gamedemo -I/usr/local/Include/ -L/usr/local/lib/ -lopenlayer -lglyph-allegrogl -lfreetype -lloadpng -lz -lagl `allegro-config --libs` -framework OpenGL -framework Carbon
(古いバージョンの関数が使われているので、過去バージョンの互換性をサポートしなかった場合は、コンパイルに失敗します)
マウスカーソル
cd demos/shapedemo
g++ Main.cpp -o shapedemo -I/usr/local/Include/ -L/usr/local/lib/ -lopenlayer -lglyph-allegrogl -lfreetype -lloadpng -lpng -lz -lagl `allegro-config --libs` -framework OpenGL -framework Carbon
カーソルが変化し、スクリーン上にマウスで、線を引くデモ。
PNG画像を使っているので、インストール時に、PNGサポートをやめるで"y"を選択したした場合は無理です。
画像表示のデモ
cd demos/renderdemo
g++ Main.cpp -o renderdemo -I/usr/local/Include/ -L/usr/local/lib/ -lopenlayer -lglyph-allegrogl -lfreetype -lloadpng -lpng -lz -lagl `allegro-config --libs` -framework OpenGL -framework Carbon
画像を読み込み表示する。
ラインストリップのデモ
cd demos/linestripdemo
g++ Main.cpp -o linestripdemo -I/usr/local/Include/ -L/usr/local/lib/ -lopenlayer -lglyph-allegrogl -lfreetype -lloadpng -lz -lagl `allegro-config --libs` -framework OpenGL -framework Carbon
PNGを使わない場合は、コメントアウトしておく。
/* #include */
メッセージ表示にTTFフォントを使っているので、Fonts ディレクトリを作って、フォントを入れる。
稲妻のようなグニャグニャした線が引かれるデモ。Cキ−で、2色のグラデーション。Rキ−で始点と終端グラデーションが逆転、 ESCキーで終了。
翻訳 私家版。
([タイトル] や、メンバ関数・メソッド名 をクリックすることで詳細を表示できます。)
[カテゴリを全て開く/閉じる]
[Bitmap] ビットマップデータの保持、スクリーン描画処理。
それぞれのオブジェクト名が異なることに注意してください。
Bitmap ... OpenLayerのビットマップオブジェクト
BITMAP....Allegroのビットマップオブジェクト
Bitmap( const char *filename, int flags = [NONE] );
画像ファイルを読み込んでbitmapオブジェクトを構築する。読み込むファイルは、アルファチャンネルを含んでいても
構わない。Load method と似たような機能。 int flags に、MAKE_COLLISION_POLY を 指定すると 当たり判定(コリジョン)ポリゴンを生成する
Bitmap( const char *rgbFilename, const char *alphaFilename,
int flags = [NONE] );
透過情報と色情報に分かれた8bit形式のビットマップファイルを読み込む。
Load method と似たような機能。
Bitmap( BITMAP *allegroBmp, int conversionMode, int flags = [NONE] );
Allegro bitmap からビットマップを構築する。 ConversionMode には次のものを指定する。
HAS_ALPHA_CHANNEL - ビットマップはアルファチャンネルを持っていることを伝える。
CONVERT_MAGIC_PINK - 透過色 magic pink
両方適用する場合は 論理演算子OR 「|」で区切る。
もしOpenLayerが Bitmap オブジェクトを破棄しても AllegroのBITMAPオブジェクトは開放されない。
Bitmap( int width, int height, Rgba fillColor );
指定した色 で塗られた ビットマップを作成する。
Bitmap( const Bitmap &other, const Rect &area );
指定したビットマップからサブビットマップを生成する。
template < class Functor > Bitmap( int width, int height, Functor functor );
各ピクセルの'Rgba operator()(int x, int y)'オブジェクトを呼び出して新しいビットマップを生成する。
もし、ビットマップの透過 または 半透明 部分を必要とするなら、アルファチャンネルをもった画像が必要です。このピクセルのアルファ値は、0.0(透明) 〜1.0(不透明) の間を指定します。
あらゆるビットマップのレンダリング関数は、スクリーン描画時に、 Tinted( 色調 ), Clipped (クリッピング) Flipped(反転)等の RenderMode パラメータによる効果を反映させることができます。
ピクセルデータは、ビットマップがdestroyed(破棄)された時に、自動的にメモりから開放されます。またDestroy()-メソッドを呼び出して、手動でメモリを開放することもできます。
現在PNG画像については、グローバルビットマップの生成と破棄が自動化されている。もし、あなたが動的に割り当てられたビットマップを有していた場合は、それを自動に任せるか、プログラムの終了時に自分でUseAutoDelete() -メソッドを呼ぶかを選択することができます。
コピーコンストラクタについての 注記: これは、イメージデータのコピーを作るのではありません。
ビットマップのコピーを作成する代わりに、同じイメージデータへのメモリへ参照するというものです。
例;
// どんな画像を読込む場合も、事前に Setup::SetupProgram と Setup::SetupScreen を呼び出しておくことを忘れてはいけない。 //
// 画像ファイルを読み込んで Bitmapオブジェクトを構築する //
Bitmap myBmp( "gfx/picture.png" );
// Bitmapオブジェクトの内容をスクリーン上の(top,left)の位置に描画する。 //
// この場合は、ビットマップが スクリーンの角 から x = 200, y = 100 の位置に描画される//
myBmp.Blit( 200, 100 );
// Bitmapオブジェクトは、Allegro のBITMAPオブジェクトのアルファチャンネルや透過色 を使って構築することもできる。//
BITMAP *allegroBmp = create_bitmap(...);
Bitmap myBmp( allegroBmp, HAS_ALPHA_CHANNEL | CONVERT_MAGIC_PINK );
// 色情報と透過情報が分かれている形式の画像ファイルを //
// 使ってBitmapオブジェクトを構築します //
// 注意;画像の透明度は8-bit形式のビットマップでなければいけません!! //
Bitmap myBmp( "gfx/picture.bmp", "gfx/pictureOpacity.bmp" );
Member functions
■Load (画像ファイルからビットマップに読込む)
bool Load( const char *filename );
画像ファイルを読込む。アルファチャンネルを含んでいても構わない。読込みに成功した場合はtrue を返す。
bool Load( const char *rgbFilename, const char *alphaFilename );
色情報 と 透明度に関する 8-bit アルファチャンネル、2つに分かれた形式の画像ファイルを読込む。読込みに成功した場合はtrue を返す。
bool Load( BITMAP *allegroBmp, bool hasAlphaChannel = false,bool convertMagicPink = false );
Allegro bitmap からビットマップを構築する。 もし convertMagicPink が true なら 透過色として反映される。
もしOpenLayerが Bitmap オブジェクトを破棄しても AllegroのBITMAPオブジェクトは開放されない。
bool Load( BITMAP *allegroBmp, int conversionMode );
上のものと同じですが、パラメータを、HAS_ALPHA_CHANNEL と CONVERT_MAGIC_PINK という記述で設定できる。
両方適用する場合は 論理演算子OR 「|」で区切る。
ビットマップ画像(bmp, pcx, tga)の読込みはAllegro が担当します。もしPNGやJPEG を読込む場合は、Allegroの拡張ライブラリもインストールしておくとよいでしょう。
PNG形式は TGA形式よりも圧縮効率が優れ透過/半透明 ピクセル情報のアルファチャンネルを含むPNG形式のファイルを扱えます。
既に、最新の OpenLayerのパッケージには、PNG形式のファイルを読込むのに必要な loadpng, libpng, libzライブラリ が最初から含まれています。
画像を読み込む場合は、読込みが成功したかどうかチェックするのがベストです。 ファイルが見つからなかったりサポートされないファイル形式かもしれないからです。 OpenLayer では エラーはすべて、Allegro.log に記録されるので、ローディングの失敗をチェックするには、このファイルを調べると分かります。しかし、作ったプログラムをエラーによって突然クラッシュさせるよりは、エンドユーザーにエラーメッセージを表示させたほうが、より良いフィードバックが得られるでしょう:)
注意:関数の外にある global bitmaps は Setup::SetupProgram や Setup::SetupScreen 呼び出す前に、読込むことはできません。 また、どのようなglobal bitmapsも プログラムが終了( メイン関数が return や exit を呼んだ時 )する前に Destroy()メソッド を呼び出しメモリを開放しなければいけません。さもなければプログラムはクラッシュします。
PNG形式に関する重要事項:LoadPNG 拡張ライブラリは PNGファイル形式を 登録する関数が 欠けているとクラッシュするようです。そこでプログラムにこれを書いておいて下さい。
register_bitmap_file_type( "png", load_png, 0 );
PNG形式の画像ファイルを読込む前にこの一行を書いておけば、あとはうまく動作するでしょう。
例:
// どんな画像を読込む場合も、事前に Setup::SetupProgram と Setup::SetupScreen を呼び出しておくことを忘れてはいけない。 //
//Load メソッドを使って、gfx/Bitmap.png を myBmp オブジェクトに読込む //
Bitmap myBmp;
myBmp.Load( "gfx/Bitmap.png" );
// 読込みが成功したかどうかチェックするのがベスト(ファイルが本当に存在するか) //
Bitmap myBmp;
if( myBmp.Load( "gfx/Bitmap.png" ) == false ) {
// エラーメッセージの表示 //
allegro_message( "Bitmap couldn't be loaded!" );
// プログラムを終了させる //
exit(-1);
}
// もし、色情報と 半透明情報を含む8bitアルファチャンネルが分かれているタイプの //
// BitmapColor.bmp を読込む場合 //
Bitmap myBmp;
myBmp.Load( "gfx/BitmapColor.bmp", "gfx/BitmapAlpha.bmp" );
■Blit (ビットマップの描画)
void Blit( float x, float y, float opacity = 1.0 ) const;
左上隅 から指定した位置にビットマップを描画する。不透明度(opacity)は 0.0(透明) 〜1.0(不透明) の間を指定します。
void Blit( float x, float y, const RenderMode &mode, float opacity = 1.0 ) const;
上のメソッドと同じように描画するが、RenderModeの影響が加味されます。
これら頂点は ピクセル単位で指定されます。
注意: もし不透明度(opacity)パラメータを指定しなければビットマップは完全に不透明で表示されます。 また、 FlippedMode(反転モード) が実行された時に画面の書き換えがなされます。
Blit他のビットマップ描画関数では、アルファチャンネルをとり得ます。 デフォルトのブレンダーではアルファチャンネルはピクセル毎に不透明度が設定され、値が大きいほど不透明になります。
アルファチャンネルの詳細については Bitmapの定義を読んで下さい。
例;
// 画像ファイルを読込み bitmapオブジェクトを生成 //
Bitmap playerBmp( "Player.png" );
// ビットマップをスクリーンの左上隅から x = 200.0, y = 100.0 の位置に描画 //
playerBmp.Blit( 200.0, 100.0 );
// ビットマップを同じ位置に50%の不透明度で描画 //
// (透き通った幻影のようなビットマップ効果が得られます。) //
playerBmp.Blit( 200.0, 100.0, 0.5 );
// ビットマップを同じ位置に 30%の赤み を加えて描画します。//
playerBmp.Blit( 200.0, 100.0, TintMode( Rgba( 1.0, 0.0, 0.0, 0.30 )));
// ビットマップを同じ位置に、今度は 垂直反転 して描画します//
playerBmp.Blit( 200.0, 100.0, FlippedMode( HORIZONTAL ));
■BlitRotated (ビットマップの回転)
void BlitRotated( float x, float y, float angle, float opacity = 1.0 ) const;
ビットマップの中心を基準に反時計回りに回転させたものを描画します。ビットマップの中心は与えられた座標( x , y)となります。
void BlitRotated(
float x, float y, float angle,
const RenderMode &mode, float opacity = 1.0 ) const;
上と同じようですが、指定したRenderMode の影響が加味されます。
void BlitRotated(
float x, float y, float pivotX, float pivotY,
float angle, float opacity = 1.0 ) const;
ビットマップの座標(pivotX, pivotY) を中心に時計回りに回転させたものを描画します。回転の中心はスクリーン上に与えられた座標( x , y)となります。
void BlitRotated(
float x, float y, float pivotX, float pivotY,
float angle, const RenderMode &mode,
float opacity = 1.0 ) const;
上と同じようですが、指定したRenderMode の影響が加味されます。
座標はピクセル単位で、角度はラジアンで指定します。 不透明度(opacity)は 0.0(透明) 〜1.0(不透明) の間を指定します。 もし不透明度(opacity)パラメータを指定しなければビットマップは完全に不透明で表示されます。
もし スクリーンを horizontallyFlipped を true にした場合、 screen horizontally に描画されます。
注意:ビットマップは bitmap が 反転されても、常に指定された座標のまま配置されます。
回転のような変形処理では、デフォルトですべてアンチエイリアスが有効になっています。もしアンチエイリアスをかけたくなければ設定を変えて下さい。
Blit他のビットマップ描画関数では、アルファチャンネルをとり得ます。 デフォルトのブレンダーではアルファチャンネルはピクセル毎に不透明度が設定され、値が大きいほど不透明になります。
アルファチャンネルの詳細については Bitmapの定義を読んで下さい。
例:
// 画像ファイルを読込む。//
Bitmap playerBmp( "Player.png" );
// スクリーンの左上隅から x = 200.0, y = 100.0 の位置に //
// ビットマップを描画し 反時計回りに pi/4 radians (90°) 回転させます //
playerBmp.BlitRotated( 200.0, 100.0, AL_PI/4.0 );
// 同じ位置に、同じ回転で描画します。//
//しかし今度は、ビットマップの左上を中心に回転します。//
playerBmp.BlitRotated( 200.0, 100.0, 0.0, 0.0, AL_PI/4.0 );
// 最初の例と同じ位置にビットマップを描画し同じように回転させます。 //
// しかし今度は ビットマップを同じ位置に70%の不透明度で描画しています//
// (透き通った幻影のようなビットマップ効果が得られます。) //
playerBmp.BlitRotated( 200.0, 100.0, AL_PI/4.0, 0.70 );
■BlitStretched (ビットマップの伸張、縮小)
void BlitStretched(
float x, float y, float width, float height,
float opacity = 1.0 ) const;
ビットマップを指定した 左上座標から縦横 width 、 height ピクセル拡大し表示する。
void BlitStretched(
float x, float y, float width, float height,
const RenderMode &mode,
float opacity = 1.0 ) const;
上と同じようですが、指定したRenderMode の影響が加味されます。
座標と寸法は、ピクセル単位で指定します。 不透明度(opacity)は 0.0(透明) 〜1.0(不透明) の間を指定します。 もし不透明度(opacity)パラメータを指定しなければビットマップは完全に不透明で表示されます。また、horizontallyFlipped が実行された時に 水平反転 がなされます。
これら変形処理では、デフォルトですべてアンチエイリアスが有効になっています。もしアンチエイリアスをかけたくなければ設定を変えて下さい。
BlitRotatedのように他のビットマップ描画関数では、アルファチャンネルをとり得ます。 デフォルトのブレンダーではアルファチャンネルはピクセル毎に不透明度が設定され、値が大きいほど不透明になります。アルファチャンネルの詳細については Bitmapの定義を読んで下さい。
例:
// 画像ファイルを読込む。 //
Bitmap playerBmp( "Player.png" );
// スクリーンの左上隅から x = 200.0, y = 100.0 の位置にビットマップを描画し //
// 高さ、幅それぞれ width = 70.0 、 height = 50.0 ピクセル 拡大する //
playerBmp.BlitStretched( 200.0, 100.0, 70.0, 50.0 );
// 同じ位置に、ビットマップを描画します。 //
// しかし今度は、 縦横サイズ をそれぞれ2倍に拡大します。 //
playerBmp.BlitStretched( 200.0, 100.0, 2.0 * playerBmp.Width(), 2.0 * playerBmp.Height() );
■BlitTransformed (ビットマップの 拡大縮小+回転)
void BlitTransformed(
float x, float y, float width, float height,
float angle, float opacity = 1.0 ) const;
ビットマップ を 拡大/縮小、回転(ビットマップ中心時計回り)したものを描画する。ビットマップの中心はスクリーン上の座標(x, y)を指定する。
void BlitTransformed(
float x, float y, float width, float height,
float angle, const RenderMode &mode,
float opacity = 1.0 ) const;
上と同じようですが、指定したRenderMode の影響が加味されます。
void BlitTransformed(
float x, float y, float width, float height,
float pivotX, float pivotY, float angle,
float opacity = 1.0 ) const;
ビットマップの座標(pivotX, pivotY) を中心に時計回りに回転させ縦横 width 、 height ピクセル拡大したものを描画します。回転の中心はスクリーン上に与えられた座標( x , y)となります。
void BlitTransformed(
float x, float y, float width, float height,
float pivotX, float pivotY, float angle,
const RenderMode &mode,
float opacity = 1.0 ) const;
上と同じようですが、指定したRenderMode の影響が加味されます。
座標と寸法は、ピクセル単位で指定します。 不透明度(opacity)は 0.0(透明) 〜1.0(不透明) の間を指定します。 もし不透明度(opacity)パラメータを指定しなければビットマップは完全に不透明で表示されます。
もし スクリーンを horizontallyFlipped (垂直反転) を true にした場合、 screen horizontally に描画されます。
注意:ビットマップは bitmap が 反転 されても、常に指定された座標、回転のまま配置されます。
これら変形処理では、デフォルトですべてアンチエイリアスが有効になっています。もしアンチエイリアスをかけたくなければ設定を変えて下さい。
これら他のビットマップ描画関数では、アルファチャンネルをとり得ます。 デフォルトのブレンダーではアルファチャンネルはピクセル毎に不透明度が設定され、値が大きいほど不透明になります。アルファチャンネルの詳細については Bitmapの定義を読んで下さい。
例:
// 画像ファイルを読込む。//
Bitmap playerBmp( "Player.png" );
// スクリーンの左上隅から x = 200.0, y = 100.0 の位置に//
// ビットマップを描画し、大きさをオリジナルのサイズの半分に縮小し //
// 反時計回りに pi/4 radians (90°) 回転させます //
playerBmp.BlitTransformed( 200.0, 100.0, playerBmp.Width()/2, playerBmp.Height()/2, AL_PI/4.0 );
■BlitDistorted (ビットマップの自由変形)
void BlitDistorted(
float x1, float y1, float x2, float y2,
float x3, float y3, float x4, float y4,
float opacity = 1.0 ) const;
スクリーン上に、ビットマップの4隅の頂点を自由に指定し、変形したものを描画する。
座標は左上の座標から始まって右回りの順序で指定されます。 ビットマップは各頂点座標の位置に従って自由に引き伸ばされます。
void BlitDistorted(
float x1, float y1, float x2, float y2,
float x3, float y3, float x4, float y4,
float opacity = 1.0,
const RenderMode &mode ) const;
上と同じようですが、指定したRenderMode の影響が加味されます。
座標は、ピクセル単位で指定します。 不透明度(opacity)は 0.0(透明) 〜1.0(不透明) の間を指定します。 もし不透明度(opacity)パラメータを指定しなければビットマップは完全に不透明で表示されます。また、horizontallyFlipped が実行された時に垂直反転 がなされます。
これら変形処理では、デフォルトですべてアンチエイリアスが有効になっています。もしアンチエイリアスをかけたくなければ設定を変えて下さい。
BlitDistortedのように他のビットマップ描画関数では、アルファチャンネルをとり得ます。 デフォルトのブレンダーではアルファチャンネルはピクセル毎に不透明度が設定され、値が大きいほど不透明になります。アルファチャンネルの詳細については Bitmapの定義を読んで下さい。
例;
// 画像ファイルを読込む。//
Bitmap playerBmp( "Player.png" );
// スクリーンの左上隅から x = 200.0, y = 100.0 の位置に //
// ビットマップの右上頂点の座標が x = 300, y = 100 //
// ビットマップの右下頂点の座標が x = 330, y = 200//
// ビットマップの左下頂点の座標が x = 170, y = 200 //
// ビットマップは 右に傾いた平行四辺形状に表示されます。 //
playerBmp.BlitDistorted( 200.0, 100.0, 300.0, 100.0, 330.0, 200.0, 170.0, 200.0 );
■Width (横幅取得)
int Width() const;
ビットマップの横幅を返します。寸法は、ピクセル単位です。
例;
// ビットマップオブジェクトを用意する。//
Bitmap myBmp( ... );
// ビットマップの横幅をピクセル値で得る//
int width = myBmp.Width();
■Height (縦幅取得)
int Height() const;
ビットマップの縦幅を返します。寸法は、ピクセル単位です。
例;
// ビットマップオブジェクトを用意する。//
Bitmap myBmp( ... );
// ビットマップの縦幅をピクセル値で得る//
int height = myBmp.Height();
■LoadListOfBitmaps (連番画像ファイルの読込み)
static std::vector < Bitmap *>
LoadListOfBitmaps(
std::string filenameBegin,
std::string extension,
int numNumbers = 2 );
filenameBegin01.extension, つまり 【文字列】+ 【 02 (連番)】. 【拡張子】.. といったファイル名の書式で 格納されたピットマップのリストを読込みます。numNumbers は 、ファイル名の連番フォーマットの桁数を表します。
numNumbersは連番ファイル名に付随するゼロの数で、例えば numNumbersが3ならファイル名は animation015.png のように 少なくとも 三桁の連番形式で存在し、numNumbersが5ならファイル名は animation00015.png のように5桁の連番で表現されます。もし付随するゼロを必要としなければnumNumbers に 1を渡すことができます。
例;
// gfxフォルダに入っている全ての画像ファイルを読込みます //
// ファイル名は 「tile」で始まり 3桁の連番、拡張子は「bmp」です//
// tile001.bmp, tile002.bmp, tile003.bmp 等..... //
std::vector< Bitmap *> tileBitmaps = Bitmap::LoadListOfBitmaps( "gfx/tile", "bmp", 3 );
// ビットマップが読込まれたかどうかここでチェックします。 //
if( tileBitmaps.empty() ) {
allegro_message( "No tile bitmaps could've been loaded!" );
exit( -1 );
}
// スクリーンの左上から(200, 100)の位置に、ビットマップの最初の画像を描画します //
tileBitmaps[0].Blit( 200.0, 100.0 );
■GetPixel (ピクセルの色情報を調べる)
inline Rgba GetPixel( int x, int y ) const;
指定したピクセルの Rgba色データの値を返す
ただしこの関数は、指定したピクセルの位置が、ビットマップ内に実際に存在するかどうかまではチェックしていないので、
もしビットマップデータの外の座標にあるピクセルを調べてしまった場合にはクラッシュする恐れがあります。
例;
Bitmap myBmp( ... );
// このビットマップ内の x = 7, y = 5 にあるピクセルを読みます //
Rgba color = myBmp.GetPixel( 7, 5 );
// しかし、もしこのビットマップのサイズが 8 x 6 より小さい画像なら //
// (7 , 5 )の位置のピクセルを調べようとすると クラッシュするでしょう。 //
// これを回避する方法: //
Rgba color;
int x = 7, y = 8;
if( x >= 0 && x < myBmp.Width() &&
y >= 0 && y < myBmp.Height() ) {
color = myBmp.GetPixel( 7, 5 );
}
■Destroy ( global bitmaps をGFXとメモリから破棄)
void Destroy();
GFXカードとメモリー両方からビットマップデータを破棄します。
関数の外にある global bitmaps があればプログラムが終了する前にそれらをこの関数を使って手動で破棄しなければいけません。
一方、関数の中にある Local Bitmaps の場合は スコープから外れた時に自動的に破棄されます。また動的に割り当てられたビットマップもそれらが削除された時に破棄されます。
注意:この関数を呼び出してビットマップを破棄した場合、そのビットマップはもう使うことができないことに注目して下さい。もし破棄されたビットマップを描画させようとすると未定義のふるまいを行うかもしれません。たいていはそれらビットマップは真っ白な四角形としてスクリーンに表示されるでしょう。
例;
// global bitmap //
Bitmap globalBitmap;
int main() {
Setup::SetupProgram( ... );
Setup::SetupScreen( ... );
// ビットマップはグラフィックモードが指定される前に読込むことはできません! //
// Setupクラス に詳細があります。 //
globalBitmap.Load( ... );
/*
* メイン関数で実行される他のコードをここに書きます。
*/
// global bitmap は、プログラムが終了される前に 破棄しなければいけません。//
globalBitmap.Destroy();
return 0;
}
END_OF_MAIN()
■IsValid (ビットマップの読込判定)
bool IsValid() const;
そのビットマップが使用できる準備ができている場合は true を返します。
もし、そのビットマップが既に破棄されていたり、読込みに失敗したりして ビットマップがまだ読込されていなければ、 false を返します。
例;
Bitmap myBmp( "Gfx/Picture.png" );
if( !myBmp.IsValid() ) {
allegro_message( "Couldn't load Picture.png!" );
exit( -1 );
}
2■save (ビットマップの保存)
void Save(const char *filename ) const
指定したファイル名でビットマップをディスクに保存します。
ファイル形式は、ファイル名の拡張子によって決まります
この関数は、、 CopyFromScreen 関数を使ってスクリーンショットを保存することができます。どのようにするかは次の例を見て下さい。
例;
Bitmap bmp( ... );
// ビットマップを、 mybmp.png という名前で保存する場合//
bmp.Save( "mybmp.png" );
//プログラムの スクリーンショットを screenshot.png という名前で保存する場合 //
Bitmap screenImage( SCREEN_W, SCREEN_H );
screenImage.CopyFromScreen( 0, 0 );
screenImage.Save( "screenshot.png" );
2■CopyFromScreen (スクリーンショット)
void CopyFromScreen( int x, int y )
ゲームウインドウ内の内容を ビットマップにコピーします。
指定された座標(x,y)はスクリーンの左上 を起点にしています。ビットマップの大きさは、オブジェクトに依存します。
この関数は、、 CopyFromScreen 関数を使ってスクリーンショットを保存することができます。どのようにするかは次の例を見て下さい。
例;
// 300 x 150 の大きさのビットマップを作成//
Bitmap bmp( 300, 150 );
// スクリーンから 300 x 100 の領域をビットマップ にコピーします。 //
// スクリーンの左上から、(200,1000)の位置を起点としてコピーします。 //
bmp.CopyFromScreen( 200.0, 100.0 );
2■GetMemoryBitmap (Allegro ← penLayer間の メモリビットマップ取扱い)
BITMAP *GetMemoryBitmap() const
ビットマップのコピーを、メモリビットマップとして返します。
BITMAP *GetMemoryBitmap(int x, int y, int width, int height ) const
指定された領域の内容を メモリビットマップとして返します。
メモリから、変更されたイメージデータを取り出して、描画したい時に使います。Allegro←→OpenLayer間のビットマップデータを取り扱います。
例;
Bitmap bmp( ... );
// OpenLayerのビットマップBitmap を、Allegro ビットマップ BITMAPに、コピーする //
BITMAP *allegroBmp = bmp.GetMemoryBitmap();
// OpenLayerのビットマップ左上から0,0を起点に 20 x 10 ピクセルの領域を //
// Allegro ビットマップ BITMAPへコピーする //
BITMAP *anotherAllegroBmp = bmp.GetMemoryBitmap( 0, 0, 20, 10 );
2■GetCollisionPoly (コリジョン属性をもったポリゴンを得る)
CollisionPoly *GetCollisionPoly()
ビットマップから、コリジョン属性をもったポリゴンを得ます。
返り値は、コリジョン属性をもったポリゴンがコンストラクタで作成されなかった場合は null を返します。
コンストラクタでビットマップを作る際には、CREATE_COLLISION_POLY を 追加フラグとして渡すことで、コリジョン属性をもったポリゴンを作成するもできます。
例;
// ビットマップに画像を読込み、コリジョン属性をもったポリゴンを得る場合。 //
Bitmap bmp( "mybmp.png", CREATE_COLLISION_POLY );
// 既存のビットマップから コリジョン属性をもったポリゴンを得る場合。 //
CollisionPoly *collisionPolygon = bmp.GetCollisionPoly();
2.01■SetDefaultPivot (ビットマップの指定した座標を回転の中心点に設定する)
void SetDefaultPivot( Vec2D point )
ビットマップの任意の座標をデフォルト回転の中心点(default pivot point)に設定します。
BlitRotated や BlitTransformedを使って回転させる場合に、この中心点を基準に回転します。
ビットマップの回転の中心点は、初期値ではビットマップの中央に設定されています。
例;
Bitmap myBmp( ... );
// ビットマップmyBmpの x = 30.0, y = 20.0 をデフォルトの回転の中心点にセットする//
myBmp.SetDefaultPivot( Vec2D( 30.0, 20.0 ));
2.01■GetDefaultPivot (ビットマップに指定された、回転の中心点を取得する)
Vec2D GetDefaultPivot()
ビットマップに設定された回転の中心点(default pivot point)を、ベクトルで返します。
BlitRotated や BlitTransformedを使って回転させる場合に、この中心点を基準に回転します。
ビットマップの回転の中心点は、初期値ではビットマップの中央に設定されています。
例;
Bitmap myBmp( ... );
// ビットマップmyBmpの回転の中心点を取得する//
Vec2D defaultPivot = myBmp.GetDefaultPivot();
Advanced functions
2■GetPixelPacked (指定したピクセルの色データを32bit整数値で返す。)
inline int GetPixelPacked( int x, int y )
指定したピクセルの色データを32bit整数値 で返す。
例;
Bitmap myBmp( ... );
// ビットマップ上の座標 x = 7, y = 5 に存在するピクセル の色データを取得 //
int color = myBmp.GetPixelPacked( 7, 5 );
// 例えば ビットマップ 大きさ 8x6 の時に、領域をはずれた場所のピクセルを取得しようとすると、クラッシュするかもしれない。 //
// 安全なやり方: //
int color;
int x = 7, y = 8;
if( x >= 0 && x < myBmp.Width() &&
y >= 0 && y < myBmp.Height() ) {
color = myBmp.GetPixelPacked( 7, 5 );
}
2■SendToGPU (グラフィックカードにビットマップデータをアップロードする)
OpenLayer 1.9 以来、Settings::StoreMemoryBitmaps が 有効( Turned on )になったか、または、UnloadToMemory関数 によってビデオカードからビットマップがアンロード
されなかったならば、この関数は、何もしないでしょう。
(もし、この関数がメモリビットマップを格納しないまま使われた場合は、エラーが、 allegro.log に記録されます。)
void SendToGPU();
グラフィックカードに、ビットマップデータを転送します。これは、loading 関連の関数によって自動機に呼び出されます。
もし、グラフィックカードに転送するタイミングをユーザー側でコントロールしたい場合は、この SendToGPUとUnloadFromGPUを使って制御できます。
しかし OpenLayer はユーザーのために、テクスチャの アップロードと破棄を扱うので、通常、ユーザーはこの機能を呼ぶ必要はないでしょう。
例;
// メモリビットマップ を有効にする //
Settings::StoreMemoryBitmaps( true );
// ビットマップデータは自動的にグラフィックカードにアップロードされる //
Bitmap myBmp( ... );
// ... しかし 手動でアンロードする。 //
myBmp.UnloadFromGPU();
// 手動でグラフィックカードにビットマップデータを送る //
myBmp.SendToGPU();
2■UnloadFromGPU (グラフィックカードからビットマップデータをアンロードし、データを破棄する。)
OpenLayer1.9以降からは、 Settings::StoreMemoryBitmaps が 無効になっている場合に、この関数を使うべきではありません。
void UnloadFromGPU();
グラフィックカードからビットマップデータをアンロードします。自動的に、デストラクタ と Destroy()-メソッドが 適用されます。
OpenLayer はユーザーのために、テクスチャの アップロードと破棄を扱うので、通常、ユーザーはこの機能を呼ぶ必要はないでしょう。
しかし、もしユーザー側でより多くの制御を行いたければ SendToGPU() と UnloadFromGPU() 関数を使うことができます。
例;
Bitmap myBmp( ... );
// グラフィックカードから、ビットマップのテクスチャ情報をアンロードする。 //
myBmp.UnloadFromGPU();
2■Select (OpenGL のアクティブなテクスチャとして、ビットマップを選択する。)
inline void Select() const;
OpenGL のアクティブテクスチャとして、ビットマップを選択する。
OpenLayerの関数を使用すると、この選択が自動的に行われるので、ユーザーがこの関数を呼ぶ必要はないでしょう。
しかしユーザーがOpenGL のプラグインを書く場合は、この関数を使うかもしれません。
呼び出すときの注意:テクスチャマッピングが無効にされた場合は、この関数によって有効にすることはできません。OpenLayer が どのように変更を通知したり、テクスチャマッピングを有効にするか、 設定をチェックしてください。
例;
Bitmap myBmp( ... );
// ビットマップを アクティブテクスチャとして選択する。 //
myBmp.Select();
2■UseAutoDelete (選択したビットマップをプログラム終了時に自動的に破棄されるようにする)
void UseAutoDelete()
選択したビットマップがプログラム終了時に自動的に破棄されるようにする。
ユーザーが何らかのビットマップを動的に割り当てたものがあって、プログラム終了時に自動的にそれらを破棄させることができます。動的にビットマップを割り当てた場合のみ、この関数をよばなければいけないことに注意してください。
例;
Examples
// ビットマップ を 動的に割り当てた //
Bitmap *myBmp = new Bitmap( ... );
// 選択したビットマップを プログラム終了時に 自動的に破棄されるようにする //
myBmp->UseAutoDelete();
2■HasAlphaChannel (ビットマップにアルファチャンネルが含まれているか調べる)
inline int GetPixelPacked( int x, int y )
ビットマップにアルファチャンネルが含まれていれば True を返します。
例;
Bitmap bmp("gfx/myBmp.png");
// ビットマップにアルファチャンネルが含まれているか調べる //
if( bmp.HasAlphaChannel() ) {
allegro_message( "Yes it does!" );
}
2■StartFastBlitting (高速描画モードを設定する)
static void StartFastBlitting( float opacity = 1.0 )
この関数は、FastBlit を使う前に呼びます。ここで指定した不透明度(opacity)パラメータは、 FastBlit に通知されます。
この関数を呼び出したあとは、ユーザーはいくらでもFastBlit を呼び出すことができます。しかし FinishFastBlittingを呼び出して高速描画モードを終了
しない限りは、どんな レンダリング関数を呼ぶこと(または、OpenGL の状態を変更すること )はできません。
例;
// 高速描画モードを設定//
Bitmap::StartFastBlitting();
// この間で、FastBlit を使うことができます。 //
// 高速描画モードを終了 //
Bitmap::FinishFastBlitting();
2■FastBlit (高速描画モードで描画する。)
inline void FastBlit( float x, float y ) const
Blit の 高速版、ただし StartFastBlitting 関数を呼び出して 高速描画モードを設定しないと機能しません。
FastBlit 関数を呼び出し終えたら、必ずFinishFastBlitting 関数を呼んで、高速描画モードを終了させてください。
例;
// もし500枚以上のビットマップをレンダリングしたいと思ったら、以下の方法が使えます。//
Bitmap bitmaps[500] = { ... };
// 高速描画モードを設定 //
Bitmap::StartFastBlitting();
// 全ビットマップをスクリーン上へランダムに配置する //
for( int i = 0; i < 500; i++ ) {
bitmaps[i].FastBlit( rand()%SCREEN_W, rand()%SCREEN_H );
}
// 高速描画モードを終了//
Bitmap::FinishFastBlitting();
2■FinishFastBlitting (高速描画モードを終了する。)
static void FinishFastBlitting()
FastBlit 関数を呼び出し終えたら、必ずFinishFastBlitting 関数を呼んで、高速描画モードを終了させてください。
FinishFastBlittingを呼び出した後は、ユーザーはいくらでもFastBlit を呼び出すことができます。しかし この関数FinishFastBlittingを呼んで 高速描画モードを終了
しない限りは、どんな レンダリング関数を呼ぶこと(または、OpenGL の状態を変更すること )はできません。
例;
// 高速描画モードを設定//
Bitmap::StartFastBlitting();
// この間で、FastBlit を使うことができます。 //
// 高速描画モードを終了 //
Bitmap::FinishFastBlitting();
2■UnloadToMemory (グラフィックカードからビットマップデータをアンロードする)
void UnloadToMemory()
グラフィックカードに保持されている からイメージデータを、アンロードします。アンロードされたデータは、 SendToGPU 関数を使えば再びグラフィックカード
にアップロードできます。
例;
2■TexturedQuad (ビデオカードにテクスチャの生データをQUAD出力します)
void TexturedQuad( float w, float h, float fact ) const
ビデオカードにテクスチャの生データを出力します。
void TexturedQuad( float w, float h, float fact, const RenderMode &mode ) const
上と同じですが、レンダーモードによって変更が加えられます。
ユーザー自身がサブクラスを作成することで、ビットマップを拡張したければ、最終的にビデオカードにQUAD出力する場合にこの関数を使って新しいレンダリング関数を実行できます。
例;
// ビットマップサブクラスを作る //
class MyExtendedBitmap : public Bitmap {
public:
void MySpecialRenderingFunction() {
// まず最初に、好きなようにOpenGLの状態はセットしました。
// ビデオカードにイメージを出力します
TexturedQuad( Width(), Height(), opacity );
// ここで元の OpenGL の状態を復帰します。
}
};
[Blenders] 2つの色を混色(ブレンド)させる処理
Set
static void Set( Blender blender );
指定したブレンド機能を有効する。
static void Set( GLenum sourceFactor, GLenum destFactor )
カスタムブレンダーを選択する。(2)
※現在使用しているブレンダーを、アクティブ-ブレンダーと呼びます。
ALPHA_BLENDER (デフォルトのブレンド機能)
ソースとなるピクセルのアルファ値によって、ピクセルの透明度が決まる。アルファ値が高ければ、ピクセルは見える
もしピクセルがアルファチャンネルを持っていたら半透明に表示される。
ADDITIVE_BLENDER
加算ブレンダー。 下になっているピクセルの明度を増やして表示する。アルファ値は照明効果を指定する。
爆発した粒子やスポットライト効果などに活用できます。また、暗い背景に浮かび上がったコンピュータモニタ上のテキスト
を表現することもできます。
SUBTRACTIVE_BLENDER
減算ブレンダー。下になっているピクセルの明るさを減じて表示します。アルファ値が高ければより暗くなる。
これは(ALPHA_BLENDERを利用するのと同じく)影 をつけたり、より暗いエリアに使うことができる。
カスタムブレンダー( glBlendFunc ) について
カスタムブレンダーはOpenGLのブレンド定数を指定できます。詳細についてはOpenGL のリファレンスの glBlendFunc の項目を見て下さい。
例;
// 加算ブレンダーを選択 //
Blenders::Set( ADDITIVE_BLENDER );
// アルファブレンダーを選択 (デフォルト) //
Blenders::Set( ALPHA_BLENDER );
//ALPHA_BLENDER を invert した、 カスタムブレンダーを選択。 //
Blenders::Set( GL_ONE_MINUS_SRC_ALPHA, GL_SRC_ALPHA );
Advanced functions
2.01■Push (スタックに、アクティブ-ブレンダーを収容します)
inline static void Push()
スタックに、アクティブ-ブレンダーを収容します。なお、現在使われているアクティブ-ブレンダーはそのまま保たれます。
スタックに収容したブレンダーは、Popメソッドを使ってスタックから取り出して用いることができます。
例;
// これまで使っていたブレンダーを、スタックに収容し、新しいものを選択する//
Blenders::Push();
Blenders::Set(...);
// ここでなにか処理をして...
// 前回のブレンダーを再び取り出す //
Blenders::Pop();
2.01■Pop (スタックから、アクティブ-ブレンダーを取り出します)
static void Pop();
スタックから、アクティブ-ブレンダーを取り出します(一番最後にスタックに入れたブレンダーを取り出します)。
Pushメソッドによって、スタックにいれたブレンダーは、このPopメソッドによって取り出す事ができます。
例;
// これまで使っていたブレンダーを、スタックに収容し、新しいものを選択する//
Blenders::Push();
Blenders::Set(...);
// ここでなにか処理をして...
// 前回のブレンダーを再び取り出す //
Blenders::Pop();
[Canvas] カンバスは、描画対象となるサーフェスの情報を保持しています。**
カンバスは、描画対象となるサーフェスの情報を保持しています。サーフェスは、スクリーン/メモリ上のオフスクリーン、または 選択されたビットマップが、相当します。
OpenLayer 2.0 未満、(Canvas クラスが存在していなかった時)では、スクリーンを新しく書き換える方法はGfxRend:: RefreshScreen () を呼ぶことでした。
但し、RefreshScreen はレンダリングサーフェスをサポートしていなかったため、2.0 では Canvas クラスが追加されることになりました。
Member functions
2■SetTo(アクティブカンバスを指定する )
もし、アクティブなサーフェスがビットマップであれば、この関数を呼び出すことで、サーフェスが書き換えられます。
static void SetTo( const Bitmap &buffer )
ビットマップを、アクティブレンダリングサーフェスにセットします。
static void SetTo( OlRenderTarget buffer )
OpenGLのバッファイメージを、アクティブレンダリングサーフェスにセットします。
現在唯一可能な設定は、SCREEN_BACKBUF (スクリーンのバックバッファ)です。
あなたは、スクリーンバックバッファが、デフォルトのレンダリングサーフェスだと推測するかもしれません。
警告:ビットマップがアクティブサーフェスとして選択される前には、バックバッファに対して、何も描画してはいけません。さもなければ、プログラムは古いハードウェアでは正しく動作しないかもしれません。また、ビットマップ自身へのレンダリングは、不確定な結果を引き起こすかもしれません。その多くは灰色のピクセルが表示されて意図した表示には見えないでしょう。
例;
Bitmap myBmp( ... );
// アクティブカンバスとして、 myBmp をセットする //
Canvas::SetTo( myBmp );
// アクティブカンバスとして、スクリーンをセットする。 //
Canvas::SetTo( SCREEN_BACKBUF );
2■Refresh (アクティブカンバスの内容を書き換える )
static void Refresh()
アクティブレンダリングサーフェスの内容を書き換えます。
OpenLayer 2.0 未満、(Canvas クラスが存在していなかった時)では、スクリーンを新しく書き換える方法はGfxRend:: RefreshScreen () を呼ぶことでした。
但し、RefreshScreen はレンダリングサーフェスをサポートしていなかったため、2.0 では Canvas クラスが追加されることになりました。
GfxRend:: RefreshScreen は 後方互換性を図るために、まだ使用できますが使用は推奨しません。Canvas クラスと併用するとコードはうまく動かない可能性が高いです。
Canvas クラスだけを使用して、GfxRend:: RefreshScreen () を使用しないのが最も良い方法です。
例;
// アクティブカンバスの内容を書き換える //
Canvas::Refresh();
2■Fill(アクティブカンバス全体を指定した色で塗ります。)
static void Fill( Rgba fillColor )
アクティブカンバス全体を指定した色で塗ります。
アルファ値はこの関数では引数として取りません。
例;
// アクティブカンバス全体を青く塗る //
Canvas::Fill( Rgba::BLUE );
2■SetClipping (アクティブカンバスにクリッピング領域を作成)
static void SetClipping( int x, int y, int w, int h );
アクティブカンバスにクリッピング領域を作成します
この領域から外れたオブジェクトは描画されません。この関数は、例えばミップマップやスクリーン分割を実装するのに利用することができます。
例;
// スクリーンの、右上から、 100 x 100 の領域を割り当てる //
Transforms::SetClipping( SCREEN_W - 100, 0, 100, 100 );
//スクリーンの もう半分を 割り当てます //
Transforms::SetClipping( 0, 0, SCREEN_W/2, SCREEN_H );
2■DisableClipping ( クリッピングをやめる )
static void DisableClipping();
クリッピングを無効にして、やめます。
Transforms::SetClipping で呼び出した クリッピング領域を無効にするために、この関数を呼び出すことができます。そして再びスクリーン全体が描画されるようになります。
例;
// クリッピングを無効にします//
Transforms::DisableClipping();
2■GetClippingRegion( クリッピング領域を取得 )
static Rect GetClippingRegion()
アクティブなクリッピング領域を返します。
例;
// Get the active clipping region //
Rect clippingRegion = Canvas::GetClippingRegion();
2■Width( アクティブレンダリングサーフェスの幅を取得 )
inline static int Width()
アクティブレンダリングサーフェスの幅を取得します。
例;
//カンバスの幅を得る //
int width = Canvas::Width();
2■Height( アクティブレンダリングサーフェスの高さを取得 )
inline static int Height()
アクティブレンダリングサーフェスの高さを返します。
例;
// カンバスの高さを得る //
int height = Canvas::Height();
Advanced functions
2■SetPixelWriteMode (どの色がレンダリング 関数の影響を受けるのか指定する。)
static void SetPixelWriteMode( PixelWriteMode mode )
どの色がレンダリング 関数の影響を受けるのか指定する。
以下の指定から選べます:
COLOR_AND_ALPHA - カンバスの カラーチャンネルと、アルファチャンネル 両方とも影響を受ける
COLOR_ONLY - カラーチャンネル だけ影響を受ける (デフォルト)
ALPHA_ONLY - アルファチャンネルだけ影響を受ける。
I
例えば、ユーザーがビットマップのアルファチャンネルを変えたければ、アクティブ カンバス として ビットマップをセットし、 ピクセル書込みモードを ALPHA_ONLY に指定する。
例;
// アクティブカンバス にビットマップを指定する。 //
Bitmap bmp( ... );
Canvas::SetTo( bmp );
//以降、レンダリング関数は、ビットマップの アルファチャンネルに影響を与える //
Canvas::SetPixelWriteMode( ALPHA_ONLY );
//以降、 レンダリング関数は、ビットマップの、アルファチャンネル、カラーチャンネルに影響を与える (デフォルトの状態) //
Canvas::SetPixelWriteMode( COLOR_ONLY );
2.01■GetMemoryBitmap (カンバスをAllegroメモリビットマップに返す。)
BITMAP *GetMemoryBitmap()
返されたイメージは、元のカンバスのコピーです。従ってコピーを変更してもカンバス上のオリジナルの内容は変更されません。
例;
// カンバスの内容を Allegro BITMAP に返します //
BITMAP *canvasImage = Canvas::GetMemoryBitmap();
2.01■Push (アクティブ-カンバスをスタックに収容する。)
static void Push();
アクティブ-カンバスをスタックに収容します。これは、Canvas::Pop() することでスタックから取り出せます。
例;
// 今まで使っていたアクティブ-カンバスをスタックに収容して、新しいカンバスを作る //
Canvas::Push();
Canvas::SetTo( ... );
// なにかレンダリングする..
// 前回のアクティブ-カンバスを取り出す。 //
Canvas::Pop();
2.01■Pop (スタックからアクティブ-カンバスを取り出す。)
static void Pop();
一番最後に収容したアクティブ-カンバスをスタックを取り出します。
例;
// 今まで使っていたアクティブ-カンバスをスタックに収容して、新しいカンバスを作る //
Canvas::Push();
Canvas::SetTo( ... );
// なにかレンダリングする..
// 前回のアクティブ-カンバスを取り出す。 //
Canvas::Pop();
[Collision](コリジョン: 衝突判定)**
Collision(const Line &aSegment, const Line &bSegment )
コリジョンオブジェクトを作成、それぞれライン・セグメントを指定する。
Collision()
このような デフォルトのコンストラクタの使用は、衝突が発生しないことを意味しています。
Member functions
2■ GetPoint ( 衝突判定の厳密な位置を返す )
Vec2D GetPoint()
衝突判定の厳密な位置を返す
2■ GetSegment ( 指定衝突のライン・セグメントを返します )
Line GetSegment( CollidingObject objectID )
指定衝突のライン・セグメントを返します。
ObjectIDはこれらのどちらかを指定する:
OBJ_A: 1番目の衝突オブジェクト
OBJ_B: 2番目の衝突オブジェクト
2■ IsCollision ( 衝突 が発生したらtrueを返す )
IsCollision()
衝突 が発生したらtrueを返します。
衝突 が発生したらtrueを返すので、これを利用して衝突判定することができます。どのようにするかは、次の例をみてください。
例:
Collision collision = ...;
// 本当に衝突が発生しているのかをテストする。 //
if( collision.IsCollision() ) {
allegro_message( "Collision! 衝突した! " );
}
// 上のと同じものを、ブール演算を使って 判別する方法。 //
if( collision ) {
allegro_message( "Collision! 衝突した! " );
}
2.01■GetNormal ( 衝突 が発生したobjectの法線ベクトルを返す )
Vec2D GetNormal(CollidingObject objectID )
衝突 が発生したobjectの法線ベクトルを返します。
この関数は、GetSegment( objectID ).GetNormal() と同じものを返します。
しかし、セグメント情報が意味の無い(線セグメントから構成されない場合)時には高速に働くかもしれない。
This function returns the same as GetSegment( objectID ).GetNormal().
ObjectID に指定する定数:
- OBJ_A: 最初に衝突したobject
- OBJ_B: 2番目に衝突したobject
例:
Collision collision = ...;
// 最初に衝突したobjectの法線ベクトルを返す //
Vec2D objANormal = collision.GetNormal( OBJ_A );
2.01■GetAllPoints ( すべてのコリジョン-ポイント(衝突地点)を返す )
const std::vector< Vec2D > &GetAllPoints() const
いくつかの場合、複数のコリジョン-ポイント(衝突地点)を設定している場合があります。それらのポイントに対して同時に衝突が発生したかを検出したい時に使います。
この関数は、GetSegment( objectID ).GetNormal() と同じものを返します。
しかし、セグメント情報が意味の無い(線セグメントから構成されない場合)時には高速に働くかもしれない。
例:
Collision collision = ...;
// すべてのコリジョン-ポイントを取得//
const std::vector< Vec2D > &collisionPoints = collision.GetAllPoints();
2.01■GetAllSegments( すべてのコリジョン-セグメントを返す )
const std::vector< std::pair< Line, Line > *> &GetAllSegments()
すべてのコリジョン-セグメントの1組を返します。 各組の第1ラインは、組の第2ラインと衝突しています。
objectに、同時に複数のものが衝突する場合、衝突地点が複数現れることになります。
例:
Collision collision = ...;
// すべてのコリジョン-セグメントを取得//
const std::vector< std::pair< Line, Line > *> &segments = collision.GetAllSegments();
// それぞれのコリジョン-セグメントを描画 //
// (Object Aのコリジョンセグメントは緑で、Object Bのは赤で表示される) //
for( std::vector< std::pair< Line, Line > *> ::const_iterator iter = segments.begin(); iter != segments.end(); iter++ ) {
(*iter)->first.Draw( Rgba::GREEN );
(*iter)->second.Draw( Rgba::RED );
}
[FpsCounter](Fps による 実行速度調整)
これは 1秒間に何回画面を書き換えているか Fps を(カウントし)計算し、違った環境でも
プログラムが同じスピードで実行させるようにする助けとなるものです。
この機能を有効にするには、ゲームのループが開始する前に、FpsCounterによって実行速度を調節する必要があります。
まず、各ループの最初で FpsCounter::NewFrameStarted() を呼び、
FpsCounter::GetDeltaTime() を使って Delta time( 画面書き換え処理からの間隔 )を取得します。
適切な描画タイミングを行いたければ、この Delta time を利用して描画処理を行う必要があります。
例;
// どのようなFPSでも同じ速度で動かす //
float playerX, playerY;
float playerSpeedX, playerSpeedY;
float playerAccelerationX, playerAccelerationY;
// この例では、デフォルトの FPS が 70.0 になるよう指定している //
FpsCounter::Start( 70.0 );
while( gameRunning ) {
// OpenLayer に 新規ゲームのフレームが始まったことを通知する。 //
FpsCounter::NewFrameStarted();
// FPSの差分(DeltaTime)を得る //
float deltaTime = FpsCounter::GetDeltaTime();
// 自キャラのスピードに DeltaTime を加味ることで、調整している //
playerSpeedX += deltaTime * playerAccelerationX;
playerSpeedY += deltaTime * playerAccelerationY;
// 自キャラを動かす (ここでも同じく) //
playerX += deltaTime * playerSpeedX;
playerY += deltaTime * playerSpeedY;
// ゲーム の他のループ処理 をここに //
}
Member functions
■Start
static void Start( float defaultFps );
fps counterを開始します。defaultFps には、あなたが実行させたい値を指定してください。
この関数は、ゲームのループが始まる前に呼ばれるべきです。 回転及び移動速度は Delta time( 画面書き換え処理からの時間差分 )ぶん増加し、影響を受けます。
例については、FpsCounterクラス の定義を見てください。
注意:あなたが得る実際のfps値が、defaultFps と比べて大幅に違ってくる場合があります。デフォルトの値は 70.0 を指定していても、 500 fps の結果を得るかもしれません。
しかし、ゲームが実行時の実際のfpsではなく、デフォルトのfps に合わせることで、ゲームキャラのスピードと加速について簡単に設計、計画しやすくなります。
例
// この例では、デフォルトの FPS が 70.0 になるよう指定している //
// (実際のfps値はより大きい場合があるが、オブジェクトが同じ速度でより、はるかに正確に動作する)//
FpsCounter::Start( 70.0 );
■NewFrameStarted
static float NewFrameStarted();
OpenLayerに 新規フレームが開始されたことを告知します。
ゲーム実行速度の調整をしたければ、ゲームのループの初めにこの関数を呼び出して下さい。
この関数は GetDeltaTime関数 のように、delta time (時間間隔)を返します。
例
while( gameRunning ) {
// OpenLayerに新規フレームが開始されたことを告知します。 //
FpsCounter::NewFrameStarted();
// その他コードを書く //
}
■GetDeltaTime
static float GetDeltaTime();
前フレームとの経過時間の差分を取得します
スピード調節 するには、全ての回転や移動スピードに対して delta time を乗算させなければいけません。
この関数を使うには、ゲームのループが始まる前に FpsCounter を有効にし、
また、 ループ毎各フレームの最初でNewFrameStarted ()を呼ばなければいけません。
注意: fps counter は、この関数を呼び出す前に有効にしておく必要があります。
例
float playerX, playerY;
float playerSpeedX, playerSpeedY;
float playerAccelerationX, playerAccelerationY;
// デフォルト fps は 70.0 //
FpsCounter::Start( 70.0 );
while( gameRunning ) {
// OpenLayerに新規フレームが開始されたことを告知します。 //
FpsCounter::NewFrameStarted();
// delta time を取得 //
float deltaTime = FpsCounter::GetDeltaTime();
// delta time を使って移動スピードを増やします。 //
playerSpeedX += deltaTime * playerAccelerationX;
playerSpeedY += deltaTime * playerAccelerationY;
// キャラクタを動かす //
playerX += deltaTime * playerSpeedX;
playerY += deltaTime * playerSpeedY;
// 他のコードを書く //
}
■GetFps
static float GetFps();
プログラム動作スピードを fps( frames per second )の値で 返します。
この関数を使うには、ゲームのループが始まる前に FpsCounter を有効にし、
また、 ループ毎各フレームの最初でNewFrameStarted ()を呼ばなければいけません。
例
// fps を得る //
float fps = FpsCounter::GetFps();
2■Pause(fps カウンタを一時停止する。)
static void Pause();
fps カウンタを一時停止する。
もし、fps カウンタを一時停止しなければいけなくなった時、あるいは、fpsの値が総じて間違っていてゲーム実行速度が通常より高くなっていた時に使います。
fpsカウンタを復帰させるには、FpsCounter::Resume(). を呼びます。
例
if( gamePaused ) {
// FPSカウンタを一時停止//
FpsCounter::Pause();
// ゲームが続くまで待機
// FPSカウンタを復帰 //
FpsCounter::Resume();
}
2■Resume(fps カウンタを復帰する。)
static void Resume();
fps カウンタを復帰する。
この関数の 旧称は Continue
例
if( gamePaused ) {
// FPSカウンタを一時停止//
FpsCounter::Pause();
// ゲームが続くまで待機
// FPSカウンタを復帰 //
FpsCounter::Resume();
}
[Placement](オブジェクトの位置・回転・伸張を司る、配置オブジェクト)**
Placement( Vec2D position,
float rotation = 0.0,
Vec2D stretch = Vec2D( 1.0, 1.0 ))
新規に、オブジェクトの位置・回転・伸張を司る 配置(プレイスメント)オブジェクトを作成する。
(スプライトのようなものか?)
例:
// 座標(200,100) に配置オブジェクトを作成する。 //
Placement myPlacement( Vec2D( 200.0, 100.0 ));
// 同じように、時計回りに90°回転させたものを作成する。 //
Placement myPlacement2( Vec2D( 200.0, 100.0 ), 0.5 * AL_PI );
// 同じように、今度は、 オリジナルの2倍の大きさにオブジェクトを拡大する //
Placement myPlacement3( Vec2D( 200.0, 100.0 ), 0.5 * AL_PI, 2.0 );
Member functions
2■ MoveBy( 配置オブジェクトの移動 )
void MoveBy( Vec2D value )
配置オブジェクトを指定した位置に移動する。
例:
Placement myPlacement( Vec2D( 250.0, 100.0 ), 0.5 * AL_PI );
// myPlacement を 20 ピクセル右に、 10 ピクセル下に移動する。 //
myPlacement.MoveBy( Vec2D( 20.0, 10.0 ));
2■ RotateBy( 配置オブジェクトの回転 )
void RotateBy( float value )
配置オブジェクトを指定した角度に従い回転させる。
例:
Placement myPlacement( Vec2D( 250.0, 100.0 ), 0.5 * AL_PI );
// myPlacement を時計回りに 90 ° 回転 //
myPlacement.RotateBy( 0.5 * AL_PI );
2■ StretchBy( 配置オブジェクト位置の伸張 )
void StretchBy( float factor )
配置オブジェクトの位置を指定した量に従い伸張させる。
例:
Placement myPlacement( Vec2D( 250.0, 100.0 ), 0.5 * AL_PI );
//位置を 1.5 倍 に伸張//
myPlacement.StretchBy( 1.5 );
2■ GetDistance( 指定した配置オブジェクトとの距離 )
float GetDistance( const Placement &other )
指定した配置オブジェクトとの距離を返します。
2■ SetPosition( 配置オブジェクトの位置をセットする。 )
void SetPosition( Vec2D position )
配置オブジェクトの位置をセットする。
例:
// 配置オブジェクトの位置を、 x = 200.0, y = 100.0 にセットする。//
myPlacement.SetPosition( Vec2D( 200.0, 100.0 ));
2■ GetPosition()( 配置オブジェクトとの位置を取得します。 )
Vec2D GetPosition()
指定した配置オブジェクトとの位置を取得します。
例:
// myPlacement の位置を取得 //
Vec2D position = myPlacement.GetPosition();
2■ SetRotation()( 配置オブジェクトの回転角度をセット。 )
void SetRotation( float rotation )
指定した配置オブジェクトの回転角度をセット。
2■ GetRotation()( 指定した配置オブジェクトを回転角度を取得。 )
float GetRotation()
指定した配置オブジェクトを回転角度を取得。
2■ SetStretch()( 配置オブジェクトの伸張係数を指定。 )
void SetStretch( float stretch )
配置オブジェクトの伸張係数を指定。
2■ GetStretch()( 配置オブジェクトの伸張係数を取得。 )
float GetStretch()
配置オブジェクトの伸張係数を取得。
[GfxRend]基本図形を描画する関数 OpenLayer 2.0 で 廃止、Shape クラスへ移行
与えられた座標と寸法は、常にピクセル単位で描画される。
すべての基本図形を描画する関数は、アルファ値を持ち、この値が大きいほど図形の色が不透明になる。
色指定についての詳細情報は、Rgba の項目を参照してください。
OpenLayer 1.82.から GfxRend オブジェクト を作成する必要がなくなりました。
例:
// スクリーンの左上隅からx = 200.0, y = 100.0 の位置に //
// width=70.0, height = 50.0 の 黒色の長方形を描画する。 //
GfxRend::Rect( 200.0, 100.0, 70.0, 50.0, Rgba::BLACK );
Member functions
■Rect ( )
void Rect(float x, float y, float width, float height, Rgba color );
スクリーンの左上角から (x,y)の位置に、color の色に塗られた、高さ height、幅 width ピクセルの 長方形を描画します。
ヒント:指定色でスクリーンいっぱいに色を塗ることもできます。
例:
// 高さ70、幅 50 の黒く塗られた四角形を //
// スクリーンの左上角から (x=200 ,y=100)の位置に描画する //
GfxRend::Rect( 200.0, 100.0, 70.0, 50.0, Rgba::BLACK );
// 同じく、今度は黄緑色に塗られた四角形 を描画 //
GfxRend::Rect( 200.0, 100.0, 70.0, 50.0, Rgba( 0.5, 1.0, 0.0 ));
// 同じような黄緑色の四角形を、今度は75%の不透明度 で描画 //
GfxRend::Rect( 200.0, 100.0, 70.0, 50.0, Rgba( 0.5, 1.0, 0.0, 0.75 ));
// 今度は、スクリーンいっぱいに、濃度 25% の黒い四角形を描画 //
GfxRend::Rect( 0.0, 0.0, SCREEN_W, SCREEN_H, Rgba( 0.0, 0.0, 0.0, 0.25 ));
//絶えず色の不透明度を変化させることで、スクリーンにフェード効果をかけることができます。 //
■RectOutline ( )
void RectOutline( float x, float y, float width, float height,
Rgba color, float lineWidth = 1.0 );
スクリーンの左上角から (x,y)の位置に、color の色の枠で、高さ height、幅 width ピクセルの 長方形を描画します。
例:
// 高さ70、幅 50 の黒枠 四角形を //
//スクリーンの左上角から (x=200 ,y=100)の位置に描画する //
GfxRend::RectOutline( 200.0, 100.0, 70.0, 50.0, Rgba::BLACK );
// 同じく、今度は黄緑色の枠の四角形 を描画 //
GfxRend::RectOutline( 200.0, 100.0, 70.0, 50.0, Rgba( 0.5, 1.0, 0.0 );
// 同じような黄緑色の枠の四角形を、今度は75%の不透明度 で描画 //
GfxRend::RectOutline( 200.0, 100.0, 70.0, 50.0, Rgba( 0.5, 1.0, 0.0, 0.75 );
// 今度は 黒枠の太さが 3.5 pixels の四角形を描画 //
GfxRend::RectOutline( 200.0, 100.0, 70.0, 50.0, Rgba::BLACK, 3.5 );
■RectGradient ( )
void RectGradient(
float x, float y,
float width, float height,
Rgba *colors );
長方形の各頂点に色が与えることができ、それらを中心にグラデーションが引き起こされます。
グラデーションの元となる四つの色は、 配列 colors への参照渡しで指定し、color[0] が左上角、color[1]が右上角というふうに時計回りで指定されます。
例:
// グラデーションのための 4つの色のリストを作ります //
// 左上は、黒、右上は白、右下は赤、左下は透明色 //
Rgba colors[] = { Rgba::BLACK, Rgba::WHITE, Rgba::RED, Rgba::INVISIBLE };
// 上の色リストをもとに、高さ70、幅 50 の グラデーションがかかった 四角形を //
//スクリーンの左上角から (x=200 ,y=100)の位置に描画する //
GfxRend::Rect( 200.0, 100.0, 70.0, 50.0, colors );
■Line ( )
void Line(float x1, float y1, float x2, float y2,
Rgba col, float lineWidth = 1.0 );
スクリーン上の 座標 (x1, y1) から (x2, y2)へ直線をひきます。
例:
// 黒い直線を、 x = 200.0, y = 100.0 から x = 300.0, y = 400.0 へ引きます //
GfxRend::Line( 200.0, 100.0, 300.0, 400.0, Rgba::BLACK );
// 同じく、黒い直線を、今度は 不透明度75%で引きます。 //
GfxRend::Line( 200.0, 100.0, 300.0, 400.0, Rgba( 0.0, 0.0, 0.0, 0.75 ));
■LineGradient ( )
void LineGradient(
float x1, float y1, float x2, float y2,
Rgba color1, Rgba color2, float lineWidth = 1.0 );
スクリーン上の 座標 (x1, y1) から (x2, y2)へ直線をひきます。
線の色は、座標 (x1, y1)は color1 、 座標(x2, y2) は color2 、その間が2つの色のグラデーションとなります。
例:
// グラデーションのかかった直線を、 x = 200.0, y = 100.0 から x = 300.0, y = 400.0 へ引きます //
// 黒から白へとスムーズに色が変化しています //
GfxRend::LineGradient( 200.0, 100.0, 300.0, 400.0, Rgba::BLACK, Rgba::WHITE );
// 同じように今度は、黄色から、透明色へ変化するグラデーションの直線を引きます //
// ( レーザーや 弾とかの効果) //
GfxRend::LineGradient( 200.0, 100.0, 300.0, 400.0, Rgba::YELLOW, Rgba::TRANSPARENT );
■Circle ( )
void Circle(float x, float y, float radius,
Rgba col, float accuracy = [default] );
与えられた座標を中心に塗られた円を描画します。
円の精度は、0.0〜1.0 で 0を指定してはいけません。精度についての詳細については、SetCircleAccuracy関数を参照してください。
すべての円の描画関数と同じようにデフォルトの精度は通常十分な値になってます。従って精度に関しては変数を渡す必要はありません。
もしより精度を求めたければ、 Settings::SetCircleAccuracy関数を利用して下さい。
例:
// 座標、 x = 200.0, y = 100.0 を中心に、 半径50.0 の青く塗られた円を描画します。 //
GfxRend::Circle( 200.0, 100.0, 50.0, Rgba::BLUE );
// 上と同じ半径と位置ですが、茶色の円を不透明度60%で描画します。 //
GfxRend::Circle( 200.0, 100.0, 50.0, Rgba( 0.7, 0.4, 0.2, 0.60 ));
// 上と同じ半径と位置ですが、精度の低い青い円をスクリーンに描画します。/
GfxRend::Circle( 200.0, 100.0, 50.0, Rgba::BLUE, 0.1 );
■CircleOutline ( )
void CircleOutline(float x, float y, float radius,
Rgba col, float lineWidth = 1.0,
float accuracy = [default] );
与えられた座標を中心に 円を描画します。
円の精度は、0.0〜1.0 で 0を指定してはいけません。精度についての詳細については、SetCircleAccuracy関数を参照してください。
すべての円の描画関数と同じようにデフォルトの精度は通常十分な値になってます。従って精度に関しては変数を渡す必要はありません。
もしより 円の精度( accuracy )を求めたければ、 Settings::SetCircleAccuracy関数を利用して下さい。
例:
// Create a primitive renderer (You need to do this only once in your program) //
GfxRend gfx;
// 座標、 x = 200.0, y = 100.0 を中心に、 半径50.0 の青い円を描画します。 //
gfx.Circle( 200.0, 100.0, 50.0, Rgba::BLUE );
// 上と同じ半径と位置ですが、茶色の円を不透明度60%で描画します。 //
gfx.Circle( 200.0, 100.0, 50.0, Rgba( 0.7, 0.4, 0.2, 0.60 ));
//上と同じ半径と位置ですが、 精度の低い青い円をスクリーンに描画します。/
gfx.Circle( 200.0, 100.0, 50.0, Rgba::BLUE, 0.1 );
■CircleGradient ( )
void CircleGradient(
float x, float y, float radius,
Rgba innerColor, Rgba outerColor,
float accuracy = [default] );
与えられた座標を中心に 円を描画します。
この円の中心にあたる innerColor から半径 radius 離れた 円の周りにあたる outerColor まで、2色を使ったグラデーションを描きます。
円の精度( accuracy )は、0.0〜1.0 で 0を指定してはいけません。精度についての詳細については、SetCircleAccuracy関数を参照してください。
グラデーションのスムーズさは半径により変化します。
すべての円の描画関数と同じようにデフォルトの精度は通常十分な値になってます。従って精度に関しては変数を渡す必要はありません。
もしより精度( accuracy )を求めたければ、 Settings::SetCircleAccuracy関数を利用して下さい。
例:
// Create a primitive renderer (You need to do this only once in your program) //
GfxRend gfx;
// 座標、 x = 200.0, y = 100.0 を中心に、 半径50.0 の青い円を描画します。 //
// 円の中心、青色から外側に向かって 赤色 に変化するグラデーションを描きます。//
gfx.CircleGradient( 200.0, 100.0, 50.0, Rgba::BLUE, Rgba::RED );
// 中心色 がオレンジで、外側にかけて 透明になるような円を描きます。 //
gfx.CircleGradient( 200.0, 100.0, 50.0, Rgba( 1.0, 0.7, 0.0 ), Rgba::INVISIBLE );
■Disk ( ドーナツ型円盤 )
void Disk(
float x, float y, float innerRadius, float outerRadius,
Rgba color, float accuracy = [default] );
座標(x,y)中心に、中央に穴が開いた塗られた円盤を描画します。穴の半径は innerRadiusで、円の半径はouterRadiusです。円の中心は(x,y)と同一です。
円の精度( accuracy )は、0.0〜1.0 で 0を指定してはいけません。精度についての詳細については、SetCircleAccuracy関数を参照してください。
すべての円の描画関数と同じようにデフォルトの精度は通常十分な値になってます。従って精度に関しては変数を渡す必要はありません。
もしより精度を求めたければ、 Settings::SetCircleAccuracy関数を利用して下さい。
例:
//座標 x = 200.0, y = 100.0 を中心に、青く塗られた円盤を描画します. //
//穴の半径は30.0、 円の半径は70.0 です。 //
GfxRend::Disk( 200.0, 100.0, 30.0, 70.0, Rgba::BLUE );
// 今度は、茶色の円盤を不透明度60%でスクリーンに描画 //
// with the same inner and outer radius and position //
GfxRend::Disk( 200.0, 100.0, 30.0, 70.0, Rgba( 0.7, 0.4, 0.2, 0.60 ));
■DiskGradient ( )
void DiskGradient(
float x, float y, float innerRadius, float outerRadius, Rgba innerColor, Rgba outerColor, float accuracy = [default] );
座標(x,y)中心に、グラデーションのかかっている、中央に穴が開いた円盤を描画します。穴の半径は innerRadiusで、円の半径はouterRadiusです。円の中心は(x,y)と同一です。
穴の付近は innerColor で、半径方向に 円の周りに近づくにつれ outerColor に変化します。グラデーションのスムーズさは半径により変化します。グラデーションのスムーズさは半径により変化します。
すべての円の描画関数と同じようにデフォルトの精度は通常十分な値になってます。従って精度に関しては変数を渡す必要はありません。
もしより精度を求めたければ、 Settings::SetCircleAccuracy関数を利用して下さい。
例:
//座標 x = 200.0, y = 100.0 を中心に、 円盤を描画します. //
// 穴の半径は30.0、 円の半径は70.0 で 中心から周りに従って //
// 青から赤にグラデーションしています //
GfxRend::DiskGradient( 200.0, 100.0, 30.0, 70.0, Rgba::BLUE, Rgba::RED );
// 今度は同じ位置と半径の場所に、鮮やかな黄色から、透明色に変わる円盤を 描画します //
GfxRend::DiskGradient( 200.0, 100.0, 30.0, 70.0, Rgba( 1.0, 1.0, 0.5 ), Rgba::INVISIBLE );
// 2つの円盤をつなげて、すてきな効果を作り出します。 //
// ( 中央が黄色で、透明色の端がついている2つの面を持つ円盤のようにみえます。 //
// ちょうど核爆発の円のような効果を得ます。) //
Rgba brightYellow = Rgba( 1.0, 1.0, 0.5 );
GfxRend::DiskGradient( 200.0, 100.0, 10.0, 40.0, Rgba::INVISIBLE, brightYellow );
GfxRend::DiskGradient( 200.0, 100.0, 40.0, 70.0, brightYellow, Rgba::INVISIBLE );
■Triangle ( )
void Triangle(
float x1, float y1, float x2,
float y2, float x3, float y3, Rgba color );
スクリーンに塗られた三角形を描画します。三角形の各頂点は、与えられた座標に位置します。
例:
// (200.0, 100.0), (300.0, 150.0) , (70.0, 200.0) を頂点とした白い三角形を描画//
GfxRend::Triangle( 200.0, 100.0, 300.0, 150.0, 70.0, 200.0, Rgba::WHITE );
■TriangleOutline ( )
void TriangleOutline(
float x1, float y1, float x2, float y2,
float x3, float y3,
Rgba color, float lineWidth = 1.0 );
内部が塗られていない三角形を描画します。三角形の各頂点は、与えられた座標に位置します。
例:
// (200.0, 100.0), (300.0, 150.0) , (70.0, 200.0) を頂点とした黒枠の三角形を描画//
GfxRend::TriangleOutline( 200.0, 100.0, 300.0, 150.0, 70.0, 200.0, Rgba::BLACK );
■Polygon ( )
void Polygon(
float *xCoordinates, float *yCoordinates,
int numVertices, Rgba color );
内部が塗られたポリゴンを描画します。頂点の数は、 numVertices と、x,y座標それぞれ 与えられた2つの配列の値によって指定されます。
最初の頂点は、(xCoordinates[0], yCoordinates[0]) 二番目は、(xCoordinates[1], yCoordinates[1]).....という形式です。
注意:xCoordinates および yCoordinates 配列の要素数は、同じでなければいけません。
例:
const int numVertices = 4;
// numVertices に注目 //
float xCoordinates[numVertices] = { 0.0, 200.0, 200.0, 0.0 };
float yCoordinates[numVertices] = { 0.0, 0.0, 100.0, 100.0 };
// 内部が塗られたポリゴンをスクリーンに描画。 //
// これは対角を (0.0, 0.0) と (200.0, 100.0)に持つ、塗られた長方形に見える) //
GfxRend::Polygon( xCoordinates, yCoordinates, numVertices, Rgba::RED );
■PolygonOutline ( )
void PolygonOutline( float *xCoordinates, float *yCoordinates,
int numVertices, Rgba color,
float lineWidth = 1.0 );
内部が塗られていないポリゴンを描画します。頂点の数は、 numVertices と、x,y座標それぞれ 与えられた2つの配列の値によって指定されます。
最初の頂点は、(xCoordinates[0], yCoordinates[0]) 二番目は、(xCoordinates[1], yCoordinates[1]).....という形式です。
注意:xCoordinates および yCoordinates 配列の要素数は、同じでなければいけません。
例:
const int numVertices = 4;
float xCoordinates[numVertices] = { 0.0, 200.0, 200.0, 0.0 };
float yCoordinates[numVertices] = { 0.0, 0.0, 100.0, 100.0 };
// 内部が塗られていないポリゴンをスクリーンに描画。 //
// これは対角を (0.0, 0.0) と (200.0, 100.0)に持つ、 長方形に見える) //
GfxRend::PolygonOutline( xCoordinates, yCoordinates, numVertices, Rgba::RED );
■PolygonGradient ( )
void PolygonGradient( float *xCoordinates, float *yCoordinates,
int numCoordinates, Rgba *colors );
内部が塗られたポリゴンを描画します。多角形の各頂点のピクセルに割り当てられた色が中間で、それぞれ混じり合うようなグラデーションを描画します。
頂点の数は、 numVertices と、x,y座標それぞれ 与えられた2つの配列の値によって指定されます。
最初の頂点は、(xCoordinates[0], yCoordinates[0]) 二番目は、(xCoordinates[1], yCoordinates[1]).....という形式です。
注意:xCoordinates および yCoordinates 配列の要素数は、同じでなければいけません。
例:
const int numVertices = 4;
float xCoordinates[numVertices] = { 0.0, 200.0, 200.0, 0.0 };
float yCoordinates[numVertices] = { 0.0, 0.0, 100.0, 100.0 };
// グラデーションの色 //
Rgba colors[numVertices] = { Rgba::BLACK, Rgba::INVISIBLE,
Rgba( 1.0, 0.4, 0.45 ), Rgba( 0.0, 1.0, 0.2, 0.30 ) };
// 内部がグラデーションになっているポリゴンをスクリーンに描画。 //
// これは対角を (0.0, 0.0) と (200.0, 100.0)に持つ、 長方形に見える) //
GfxRend::PolygonGradient( xCoordinates, yCoordinates, numVertices, colors );
■Point ( 点 )
void Point( float x, float y, Rgba color );
スクリーンの指定した座標に、点を描く。
例:
// 座標 x = 200.0, y = 100.0 の位置に、点を描く。 //
GfxRend::Point( 200.0, 100.0, Rgba( 0.7, 0.0, 1.0 ));
■FillScreen ( 塗り )
void FillScreen( Rgba color );
指定色で全体のスクリーンを満たします。 色のアルファ値は無視されます。
色のアルファ値は無視されると同時にこの関数がスクリーンを染めるのに使えないことに注意して下さい。
もしスクリーン全体を染めたい場合は、Transforms::SetTintColor を使って下さい。
例:
// スクリーンを黒く塗る //
GfxRend::FillScreen( Rgba::BLACK );
■RefreshScreen ( )
void RefreshScreen();
スクリーンの内容を新たにRefreshes させ、スクリーンが最後に書き換えた内容を更新する。
描画を終えてから、この関数を呼び出して下さい。
例:
// 最初になにか描画する //
// スクリーンにオブジェクトを描画する //
GfxRend::RefreshScreen();
■LineStrip ( 連続した線(折れ線等) )
static void LineStrip( float *xCoordinates, float *yCoordinates,
int numCoordinates, Rgba color,
float lineWidth = 1.0 );
連続した 2つの座標 (xCoordinates[i], yCoodrinates[i])と、 (xCoordinates[i+1], yCoodrinates[i+1])の間に直線を引く。
座標のx、y 両方の値が入った配列xCoordinatesと、yCoordinates の配列数は、少なくとも、 LineStrip の numCoordinates パラメータで指定された値以上なくてはいけません。
Line 関数を何度も呼んで線分を引くかわりに、この関数を使えば、線幅が同一の直線を引き続けることができます。
例:
// 指定した座標値を格納した配列 //
float xCoords[] = { 100.0, 200.0, 300.0, 400.0 };
float yCoords[] = { 100.0, 150.0, 70.0, 100.0 };
// 線幅 3.0 で、それぞれの座標を通る連続した線を引きます。 //
GfxRend::LineStrip( xCoords, yCoords, 4, 3.0 );
■LineStripGradient ( )
static void LineStripGradient(
float *xCoordinates, float *yCoordinates,
int numCoordinates, Rgba startCol,
Rgba endCol, float lineWidth = 1.0 );
各座標間を繋ぐ、連続した線分を引きますが、線の色は、startCol から endCol に変化します 。
線の幅は同一で、 線の途中、ちょうど真ん中の色は、startCol から endCol の中間色になります。
例:
// 座標を格納した配列 //
float xCoords[] = { 100.0, 200.0, 300.0, 400.0 };
float yCoords[] = { 100.0, 150.0, 70.0, 100.0 };
// 線幅 3.0 の直線を引きます。 線は 白から黒に変化します //
GfxRend::LineStrip( xCoords, yCoords, 4, Rgba::WHITE, Rgba::BLACK, 3.0 );
// 最初のものと似ていますが、線は白から黒へ、途中からさらにグレーから青に変わります。//
GfxRend::LineStrip( xCoords, yCoords, 4, Rgba::WHITE, Rgba::BLACK, Rgba::BLUE, Rgba::BLUE, 3.0 );
// 4つの色を配列に入れて指定して います。 //
Rgba colors[] = { Rgba::BLUE, Rgba( 1.0, 0.7, 0.5, 0.2 ), Rgba::WHITE, Rgba::RED };
// 上とにた直線を 引きます。 一方の頂点から頂点までの色がそれぞれグラデーションします。 //
GfxRend::LineStrip( xCoords, yCoords, 4, colors, 3.0 );
■Ellipse ( 楕円。塗り。 )
static void Ellipse(
float x, float y, float xRadius, float yRadius,
Rgba col, float angle = 0.0,
float accuracy = [default] );
塗られた楕円を描きます。
与えられた座標(x,y)が楕円の中心になります。水平半径をxRadius 、垂直半径をyRadiusで指定します。angle は楕円を反時計回りに回転させます。
例:
// x = 200.0, y = 100.0 を中心に、水平半径が 70.0 垂直半径が50.0 の赤色の楕円を描きます//
GfxRend::Ellipse( 200.0, 100.0, 70.0, 50.0, Rgba::WHITE );
// 白い楕円を今度は、45° 反時計回りに回転させます。 //
GfxRend::Ellipse( 200.0, 100.0, 70.0, 50.0, Rgba::WHITE, AL_PI/8 );
■EllipseOutline ( 楕円。線のみ )
static void EllipseOutline(
float x, float y, float xRadius, float yRadius,
Rgba col, float angle = 0.0,
float lineWidth = 1.0,
float accuracy = [default] );
中味が塗られていない楕円を描きます。
与えられた座標(x,y)が楕円の中心になります。水平半径をxRadius 、垂直半径をyRadiusで指定します。angle は楕円を反時計回りに回転させます。
例:
// x = 200.0, y = 100.0 を中心に、水平半径が 70.0 垂直半径が50.0 の 円周が白色の楕円を描画//
GfxRend::EllipseOutline( 200.0, 100.0, 70.0, 50.0, Rgba::WHITE );
// 同じ楕円を今度は 45° 反時計回りに回転させます。//
GfxRend::EllipseOutline( 200.0, 100.0, 70.0, 50.0, Rgba::WHITE, AL_PI/8 );
■EllipseGradient ( 楕円。グラデーションあり )
static void EllipseGradient(
float x, float y, float xRadius, float yRadius,
Rgba innerCol, Rgba outerCol,
float angle = 0.0, float accuracy = [default] );
グラデーションのかかった楕円を描きます。中心( innerColor)から、円周( outerColor )にかけて半径方向に従って色が変化します。
与えられた座標(x,y)が楕円の中心になります。水平半径をxRadius 、垂直半径をyRadiusで指定します。angle は楕円を反時計回りに回転させます。
例:
//x = 200.0, y = 100.0 を中心に、水平半径が 70.0 垂直半径が50.0 の グラデーションがかかった楕円を描画 //
// グラデーションは、楕円の中心から外側にかけて半径方向に従って、白から透明色に変化します。 //
GfxRend::EllipseGradient( 200.0, 100.0, 70.0, 50.0, Rgba::WHITE, Rgba( 1.0, 1.0, 1.0, 0.0 ));
// 同じように、楕円を今度は 45° 反時計回りに回転させます。 //
GfxRend::EllipseGradient( 200.0, 100.0, 70.0, 50.0, Rgba::WHITE, Rgba( 1.0, 1.0, 1.0, 0.0 ), AL_PI/8 );
■Slice ( 円を分割した扇形。 塗り。 )
static void Slice(
float x, float y, float radius,
float startAngle, float sweepAngle,
Rgba color, float accuracy = [default] );
分割された円を描きます。
与えられた座標(x,y)が楕円の中心になります。 startAngle から startAngle + sweepAngl まで、角度 radial で分割されます。
例:
// 角度70.0 で、内部が塗られた扇形で分割します。 //
GfxRend::Slice( 200.0, 100.0, 70.0, 0.0, AL_PI/4, Rgba::WHITE );
// 半径7.0で、内部が塗られた扇形(ちょうど円の 90°〜 60°の領域) //
GfxRend::Slice( 200.0, 100.0, 70.0, AL_PI/2, AL_PI/4, Rgba::WHITE );
■SliceGradient ( 円を分割した扇形。グラデーションあり )
static void SliceGradient(
float x, float y, float radius,
float startAngle, float sweepAngle,
Rgba innerColor, Rgba outerColor,
float accuracy = [default] );
内部がグラデーションで塗られた、分割された円(扇形など)を描画。中心( innerColor)から、円周( outerColor )にかけて半径方向に従って色が変化します。
与えられた座標(x,y)が楕円の中心になります。startAngle から startAngle + sweepAngl まで、角度 radial で分割されます。
例:
//135〜45° 半径 70.0 の白〜黒のグラデーションがかかった扇形 //
GfxRend::SliceGradient( 200.0, 100.0, 70.0, 3 * AL_PI/4, AL_PI/4, Rgba::WHITE, Rgba::BLACK );
■EllipseSlice ( 楕円を分割した扇形。塗り。 )
static void EllipseSlice(
float x, float y, float xRad, float yRad,
Rgba col,
float startAngle, float sweepAngle,
float angle = 0.0, float accuracy = [default] );
楕円を分割した扇形。
与えられた座標(x,y)が楕円の中心になります。 startAngle から startAngle + sweepAngl まで、角度 radial で分割されます。
例:
// 円の 1/4を切り取った扇形 水平半径 70.0 、垂直半径 50.0 //
GfxRend::EllipseSlice( 200.0, 100.0, 70.0, 50.0, 0.0, AL_PI/4, Rgba::WHITE );
■EllipseSliceGradient ( 楕円を分割した扇形。グラデーションあり )
void EllipseSliceGradient(
float x, float y,
float xRad, float yRad,
Rgba innerColor, Rgba outerColor,
float startAngle, float sweepAngle,
float angle = 0.0, float accuracy = [default] );
グラデーションのかかった楕円から分割された扇形を描きます。中心( innerColor)から、円周( outerColor )にかけて半径方向に従って色が変化します。
与えられた座標(x,y)が楕円の中心になります。 startAngle から startAngle + sweepAngl まで、角度 radial で分割されます。
例:
// 円の 1/4を切り取った扇形 //
// 水平半径 70.0 、垂直半径 50.0 、半径方向に従って 白から黒へグラデーション //
// along the radius //
GfxRend::EllipseSliceGradient( 200.0, 100.0, 70.0, 50.0, 0.0, AL_PI/4, Rgba::WHITE, Rgba::BLACK );
■Arc ( ドーナツ型円盤から分割された円弧。塗り。 )
static void Arc(
float x, float y, float innerRad, float outerRad,
float startAngle, float sweepAngle,
Rgba color, float accuracy = [default] );
塗られた円盤の弧を描きます。
与えられた座標(x,y)が円盤の中心になります。 startAngle から startAngle + sweepAngl まで、角度 radial で分割されます。
例:
// 1/4πで 内径 30.0、外径 70.0 の円盤の弧を描画します。//
GfxRend::Arc( 200.0, 100.0, 30.0, 70.0, 0.0, AL_PI/4, Rgba::WHITE );
■ArcGradient ( ドーナツ型円盤から分割された円弧。グラデーションつき。 )
static void ArcGradient(
float x, float y, float innerRad, float outerRad,
float startAngle, float sweepAngle,
Rgba innerCol, Rgba outerCol,
float accuracy = [default] );
塗られた円盤の弧を描きます。グラデーションつきです。
与えられた座標(x,y)が円盤の中心になります。 startAngle から startAngle + sweepAngl まで、角度 radial で分割されます。
例:
// 内径 30.0、外径 70.0 の円盤の弧を描画します。 //
// 半径方向に、白から透明色グラデーションしています。 //
GfxRend::ArcGradient( 200.0, 100.0, 30.0, 70.0, 0.0, AL_PI/4,
Rgba::WHITE, Rgba( 1.0, 1.0, 1.0, 0.0 ));
Advanced functions
ErrorString
[RenderMode] すべてのビットマップ描画モードの 基本クラス。
これらは、複数の描画モードを統合、結合するのに使われます。2.0でほとんどの名称が変更されました。
例;
// OpenLayerのビットマップを作成します //
Bitmap myBmp( ... );
// スクリーンの左上角から、 x = 200.0, y = 100.0 の位置に ビットマップを描画します。 //
// このビットマップは、 アルファ値 35% の赤色 をしています。 //
myBmp.Blit( 200.0, 100.0, Tinted( Rgba( 1.0, 0.0, 0.0, 0.35 )));
// ビットマップ を vertically flippedで描画し、100 x 100 の領域をクリッピングし、赤のアルファ値を30%に変更する //
myBmp.Blit( 200.0, 100.0, Flipped( VERTICAL ) +
Clipped( 0.0, 0.0, 100.0, 100.0 ) +
Tinted( Rgba( 1.0, 1.0, 1.0, 0.30 )));
Member functions
■Tinted(色合いモード)
Tinted( Rgba color );
ビットマップは、指定した色に染まります。このとき色のアルファ値は影響を受ける度合いになります。
他のRenderModeと同じく、Tintedのインスタンスは描画関数に引数として渡されたあとに削除されます。これは、オブジェクトの破棄を心配しないで、描画関数のための新しいオブジェクトを渡すことができます。これがどのように動作するか次の例を見て下さい。
もしあなたがTintedを使用後にそれを破棄したくなければ、先にNoAutoDestroy()メソッドを呼び出しておくこともできます。
注意:Tinted が一度だけ行われることに注意して下さい。
例;
// 画像を読む //
Bitmap myBmp( ... );
// スクリーンの左上から(200, 100)の位置に、ビットマップを描画します //
// そのビットマップは 濃度 35% の 赤みを帯びています //
myBmp.Blit( 200.0, 100.0, Tinted( Rgba( 1.0, 0.0, 0.0, 0.35 )));
■Flipped( 反転モード)
Flipped( OlFlippingChoise mode );
指定した方法で、ビットマップを反転(flipped)させます。モードは3種類: HORIZONTAL(水平), VERTICAL(垂直) , BOTH(鏡像).
他のRenderModes の効果にかかわらず、その後に反転が起きることに注意して下さい。
例;
Bitmap bmp( ... );
// 垂直反転させて描画 //
bmp.Blit( 200.0, 100.0, Flipped( HORIZONTAL ));
■Clipped(クリッピング )
Clipped(float x, float y, float w, float h );
クリッピングされた指定領域のみ描画されます。
Clipped( Rect clipArea );
指定したRect オブジェクトによる指定
ビットマップのクリッピングされた領域以外の部分は見えなくなるでしょう。クリッピング領域の左上角は、新しく描画されたビットマップの左上角とみなされます。
例;
Bitmap bmp( ... );
// ビットマップの幅70.0 高さ 50.0 を切り抜いて描画 //
bmp.Blit( 200.0, 100.0, Clipped( 0.0, 0.0, 70.0, 50.0 ));
// 同じようにみえますが、今度はクリッピング座標の左上が20.0, 10.0 //
// から始まっていることに注意して下さい //
bmp.Blit( 200.0, 100.0, Clipped( 20.0, 10.0, 70.0, 50.0 ));
■AlphaFrom(アルファチャンネル)
AlphaFrom(
const Bitmap &alphaFrom, float anchorX = 0.0,
float anchorY = 0.0 );
Bitmapが別のBitmapの追加アルファチャンネルでレンダリングされる。
アルファチャンネルの値が、最終的な値を得るために一緒に乗算されます。
結果は、両方のビットマップが重ねられた領域が切り取られます。この効果はビットマップの外の部分が透明とみなされることを意味します。
注意:1つの AlphaFrom効果につき1回だけ効きます!
例;
Bitmap myBmp( ... ), alphaBmp( ... );
// alphaBmp のアルファチャンネルを myBmp に描画します //
// アルファチャンネルの内容は myBmp の x=20.0、y=10.0 に配置されます。 //
myBmp.Blit( 200.0, 100.0, AlphaFrom( alphaBmp, 20.0, 10.0 );
■SliceExpanded( )
SliceExpanded(
float slicePos, OlSlicingChoise mode );
ビットマップの1ピクセルの幅を伸ばしてビットマップいっぱいに広げます。
モードは次のいずれかです: HORIZONTAL_SLICE or VERTICAL_SLICE.
例;
Bitmap myBmp( ... );
// ビットマップの5列目でビットマップを一杯にするように、スクリーンにビットマップを描画します。 //
myBmp.Blit( 200.0, 100.0, SliceExpanded( 5.0, VERTICAL ));
■MultiMode( )
MultiMode(
const RenderMode &mode1, const RenderMode &mode2 );
2つの RenderModesを 一つに結合させます。
2つのRenderModesからMultiModeを容易に作成するのに、sum( + )演算子を使った記述も使えます。
これは、どういうふうにするのかは例をみて下さい。
例;
Bitmap bmp( ... );
// ビットマップを水平反転し、30%赤みを帯びさせます。 //
bmp.Blit( 200.0, 100.0, MultiMode( Flipped( HORIZONTAL ), Tinted( Rgba( 1.0, 1.0, 1.0, 0.30 ))));
// 同じように 今度は sum 演算子 を使って シンプルにします。 //
// これで2つの blending modes を 1つに結合することができました。 //
bmp.Blit( 200.0, 100.0, Flipped( HORIZONTAL ) + Tinted( Rgba( 1.0, 1.0, 1.0, 0.30 )));
2■Gradient ( グラデーション )
Gradient(
float topLeftOpacity, float topRightOpacity,
float bottomRightOpacity, float bottomLeftOpacity )
ビットマップのそれぞれの角に対して異なった不透明度のグラデーションを作成する。
Gradient(
Rgba topLeft, Rgba topRight,
Rgba bottomRight, Rgba bottomLeft )
ビットマップのそれぞれの角に対して異なったカラーチャンネル係数に従った グラデーションを作成する。
例;
//ビットマップの読込み //
Bitmap myBmp( ... );
// ビットマップをスクリーンの左上からx = 200.0, y = 100.0 の位置に描画する//
// ビットマップの透明度は、 上(不透明)から下(透明)へ 変化します。 //
myBmp.Blit( 200.0, 100.0, Gradient( 1.0, 1.0, 0.0, 0.0 ));
// 同じ位置に、ビットマップの明度を変化させるグラデーションを描画します。 //
// ビットマップの明度は、 左下角(暗みがかかった灰色)から右上角(鮮やかな表示)へ 変化します。 //
Rgba lightnessInDark( 0.3, 0.3, 0.3 );
Rgba lightnessInBright( 1.0, 1.0, 1.0 );
// 暗闇と、鮮やかさの係数を組み合わせたものを作ります //
Rgba lightnessInMiddle = lightnessInDark.MixWith( lightnessInBright, 0.5 );
myBmp.Blit( 200.0, 100.0, Gradient( lightnessInMiddle, lightnessInBright, lightnessInMiddle, lightnessInDark ));
[Rgba] 4つの部分から構成される色データ: 赤、緑、青およびアルファチャンネル。
Rgba( float r, float g, float b, float a = 1.0 );
色を浮動小数点型で指定する。それぞれの値は、0.0〜1.0 の間を指定する。
Rgba( double r, double g, double b, double a = 1.0 );
色を倍精度浮動小数点数型 で指定する。それぞれの値は、0.0〜1.0 の間を指定する。
Rgba( int r, int g, int b, int a = 255 );
色を整数型 で指定する。それぞれの値は、0 〜255の間を指定する。
Rgba( int col, int a );
24bit で格納された色データ及び、整数値のアルファ値を決めて色を指定する。アルファ値は0 〜255の間を指定する。
デフォルトで設定されたブレンダーにより アルファ値 から不透明度が反映される。このようにして半透明色を設定する。
アルファ値が高ければ高いほど不透明になる。0 (透明)〜255(不透明)
注意:不透明で描画する場合は、ほとんどのコンストラクタに アルファ値を渡す必要はありません。
色の定数を指定できます:
static Rgba BLACK, WHITE, RED, YELLOW, GREEN, BLUE, INVISIBLE;
これらのうち Rgba::INVISIBLE を除いて、そのほとんどの色が不透明で描画される。Rgba::INVISIBLE は透明である。(TRANSPARENTは予約語なのでこの名前が使用される。代わりとなる良い名前があればぜひ教えて欲しい)
例:
// 白 を 浮動小数点型で指定する//
// ( Rgba::WHITE と同じ) //
Rgba white( 1.0, 1.0, 1.0 );
// 白 を 整数型 で指定 //
// ( Rgba::WHITE と同じ) //
Rgba white( 255, 255, 255 );
//黒を 指定する (Rgba::BLACK と同じ) //
Rgba black( 0.0, 0.0, 0.0 );
// 中程度のグレー //
Rgba gray( 0.5, 0.5, 0.5 );
// 赤色 ( Rgba::RED と同じ) //
Rgba red( 1.0, 0.0, 0.0 );
// 緑色 ( Rgba::GREEN と同じ) //
Rgba green( 0.0, 1.0, 0.0 );
// 青色 (same as Rgba::BLUEと同じ) //
Rgba blue( 0.0, 0.0, 1.0 );
// 黄色( Rgba::YELLOWと同じ) //
Rgba yellow( 1.0, 1.0, 0.0 );
// 暗い黄色 //
Rgba yellowDark( 0.3, 0.3, 0.0 )
// 不透明度 50% の鮮やかな 黄色 //
Rgba yellowTranslucent( 1.0, 1.0, 0.0, 0.50 );
// 不透明度 20% (ほとんど透明 ) のシアン//
Rgba cyanTranslucent( 0.0, 1.0, 1.0, 0.20 );
// 透明色 (Rgba::INVISIBLEと同じ) //
// 全く透明になるので、赤緑および青のパラメータは重要ではなくなる //
Rgba transparentColor( 1.0, 1.0, 1.0, 0.0 );
Member functions
■MixWith ( 混合色 を得る )
Rgba MixWith(
const Rgba &otherColor, float factor ) const;
thisColor と otherColor に対して、 与えられたfactor によって混色した色を返します。
factor は 0.0( thisColor )〜1.0( otherColor ) の値をとります。その間の値は、2色が混じった色が返ります。
例:
// 赤と青の 間の 中間色 magnetaを得ます //
Rgba magneta = Rgba::RED.MixWith( Rgba::BLUE, 0.5 );
// 黒みがかった 濃い青darkerBlueを得ます //
Rgba darkerBlue = Rgba::BLUE.MixWith( Rgba::BLACK, 0.2 );
// magneta と darkerBlue の 中間 0.6 割の混色を得ます //
Rgba mixedColor = magneta.MixWith( darkerBlue, 0.6 );
2■WithAlpha ( 元の色から alpha値の違った色 を得る )
inline Rgba WithAlpha( float newAlpha ) const;
同じ色から違ったアルファ値の色を新規に作成します。
この関数は、不透明色からその透明色を作成するのに有用な場合があります。また、色のアルファ値が変更されたコピーを得る時にも使えるかもしれない。
例:
// 不透明度 30%の赤色を得る //
Rgba color = Rgba::RED.WithAlpha( 0.30 );
// 不透明度 70% の赤色を得る //
Rgba otherColor = color.WithAlpha( 0.70 );
Advanced functions
2■Packed ( 色データを 32bit 整数で 返します。Allegro のものと同じ形式)
int Packed() const;
色データを 32bit 整数で 返します。
この色データの形式はAllegro のものと同じです。
色のデータ形式は通常、各バイトが AA|RR|GG|BB で配列されています。しかし 現在のスクリーンモードおよび他の複数の要因によって左右されます。
そのため 、整数形式で格納するのが最も良い方法です。Allegro の関数を使えば 色成分を取得することができます。
例;
// Allegro の色データ形式、 Rgba ストラクチャに変換する //
Rgba color( ... );
int colorPacked = color.Packed();
2■Select ( アクティブなOpenGL color として色を選択する。)
inline void Select();
アクティブなOpenGL color として色を選択する。
OpenLayerの機能だけを使用するなら、この関数を呼ぶ必要はありません。 この関数を呼んだり、または glColor を呼ぶことで、てOpenGLのアクティブ カラーを変更しても、
OpenLayerの機能に影響を与えることはありません。
例;
// active OpenGL color として黒を選択 //
Rgba black( 0.0, 0.0, 0.0 );
black.Select();
// 色定数を使って同じように選択する //
Rgba::BLACK.Select();
// また、次のように書くこともできます: //
Rgba( 0.0, 0.0, 0.0 ).Select();
[Settings]OpenLayer の設定に関するクラス。アンチエイリアシングやテクスチャ等
アンチエイリアシングや、テクスチャマッピング の初期設定、プロジェクションモードなど のような共通の設定を変更するには
これらの静的メンバ関数を使う。
Member functions
■SetAntialiasing ( アンチエイリアス )
static void SetAntialiasing(
bool turnedOn );
アンチエイリアスの ON/OFF切り換え。デフォルトではONになっています。
アンチエイリアシング はなめらかな描画を実現しますが、描画速度が低下します。
例:
// アンチエイリアシングをOFF //
Settings::SetAntialiasing( false );
■SetCircleAccuracy ( 円の精度 )
static void SetCircleAccuracy(
float accuracy );
円を描く関数における円の精度設定します。 値は0.0〜1.0の間を取り、決して0 にしてはいけません。
一般的に精度を高くするほど、円はきれいに見えますが描画スピードは遅くなるでしょう。
円を描く関数に値を渡す事によってこの設定を上書きすることができます。
例:
// 低い精度の円を描く設定 //
Settings::SetCircleAccuracy( 0.2 );
// 高い精度の円を描く設定 //
Settings::SetCircleAccuracy( 0.7 );
2.01■SetCollisionPolyAccuracy (コリジョン-ポリゴンの精度を設定 )デフォルトは0.8
static void SetCollisionPolyAccuracy( float accuracy )
衝突判定を検出するコリジョン-ポリゴンの精度を設定します。設定値は、常に正の数でなければいけません。最大値は1.0、デフォルトでは0.8に設定されています。
例:
// ポリゴンの衝突判定の制度を 10%に下げる //
Settings::SetCollisionPolyAccuracy( 0.1 );
2.01■SetCollisionPolyAlphaLimit (コリジョン-ポリゴンの透明度の制限 )デフォルトは0.5
static void SetCollisionPolyAlphaLimit( float alpha )
発生する衝突の世代によって、考慮される透明度の制限値を設定。
この設定の変更が行われた場合、既に生成されたコリジョン-ポリゴンには何の影響も与えません。
例:
// 透明度の制限を0.3にしてから、コリジョン-ポリゴンによってビットマップを作成する。 //
Settings::SetCollisionPolyAlphaLimit( 0.3 );
Bitmap myBmp( "gfx/MyImage.png", CREATE_COLLISION_POLY );
Advanced functions
2■SetTextureMapping (OpenGL テクスチャの設定を有効/無効に切り替える。デフォルトではON)
static void SetTextureMapping( bool turnedOn );
OpenGL テクスチャの設定を切り替える。デフォルトでは 有効(on)になっている。
この関数は、OpenLayerの関数に影響を与えませんが、もしユーザーがOpenGLを直接使っていた場合、好きなようにテクスチャマッピングを切り替えることができます。
OpenLayerにテクスチャマッピングされたテクスチャが変更されたことを通知させるには、glEnable( GL_TEXTURE_2D ) , glDisable( GL_TEXTURE_2D ) の
代わりに、この関数を使わなければいけません。 そうしなければ、OpenLayerかユーザーのOpenGLコードは意図したように動作しないかもしれません、。
例;
Examples
// OpenGLのテクスチャマッピングを無効にする //
Settings::SetTextureMapping( false );
2■TextureMappingUsed ( テクスチャマッピングが有効なら True を返します。)
static bool TextureMappingUsed();
テクスチャマッピングが有効なら True を返します。
この関数は、OpenLayerの関数に影響を与えませんが、もしユーザーがOpenGLを直接使っていた場合、テクスチャマッピングの状態を調べることができます。
例;
// テクスチャマッピングが有効になっているか調べる //
if( Settings::TextureMappingUsed() ) {
// テクスチャマッピングが使われている//
}
2■SetOrthographicProjection ( 投射モードを正投影 モード で設定する。デフォルト状態。 )
static void SetOrthographicProjection(
int screenWidth = SCREEN_W,
int screenHeight = SCREEN_H );
アクティブな OpenGLの投射モードを、正投影に指定する。正投影 モードはデフォルトで使用されています。
プログラム中で、OpenGL の別の投射モードに変更していて、元の投射モードに戻したい時はこの関数を呼び出してください。
前の投射モードはスタック行列に格納されます。もし前の投射モードに復帰させたい場合はRestoreOldProjection()を呼び出してください。
スクリーンの幅と高さを指定した値と実際のウインドウ幅・高さが異なっていれば、スクリーンの大きさにあわせて描画内容が伸張されます。
注: OpenLayerの過去バージョンでは、この関数にミスがある。
例;
// もしなにか別の投影モードを変更していた場合、これで元の投影モードに戻る。 //
Settings::SetOrthographicProjection();
// プログラム中で、解像度 800 x 600 で走らせることができるが、実際の解像度は別のものになっている場合 //
// 解像度を 800 x 600 にしてスクリーン上にすべてを表示させることができる。//
Settings::SetOrthographicProjection( 800, 600 );
2■RestoreOldProjection ( 前の投射モードを復帰させる)
static void RestoreOldProjection();
SetOrtographicProjection() が呼ばれた際に スタックに格納された 前の投影モード を復帰させます。
元の投射モードを スタック行列から取り出し、元に戻すのにこの関数を呼ぶことができます。
例;
// 前の投射モードを復帰させる //
Settings::RestoreOldProjection();
2■StoreMemoryBitmaps ( ビットマップデータをメモリ上に貯蔵できるかどうか選択できる。デフォルトではOFF)
static void StoreMemoryBitmaps( bool turnedOn )
ビットマップデータをメモリ上に貯蔵できるかどうか選択できる。 デフォルトではOFFになっている。
ビットマップデータはグラフィックス・カードで(UnloadFromGPU -関数が呼ばれるまで)に常に貯えられていて、メモリ上にはありません。
もし、SendToGPU / UnloadFromGPU -関数を 使いたければ、ビットマップデータをロードする前にメモリ上へデータを格納しなければいけません。
OpenLayer2.0 から、アンロードされたビットマップをメモリ上で保持しておきたければ UnloadFromGPU の代わりに、UnloadToMemory 関数が使用可能になりました。
ビットマップの内容をメモリに貯蔵するのを強制することは、プログラムのメモリ使用量の増加につながります。
例;
// ビットマップデータをメモリ上に貯蔵できるようにする //
Settings::StoreMemoryBitmaps( true );
2■MemoryBitmapsStored ( ビットマップデータをメモリ上に貯蔵していたらtrueを返す )
static bool MemoryBitmapsStored();
ビットマップデータをメモリ上に貯蔵していたらtrueを返す。
ビットマップデータをメモリ上に貯蔵しておく機能はデフォルトではOFFになっています。しかしSettings::StoreMemoryBitmaps( true )を呼ぶことで有効にすることができます。
ユーザーは、MemoryBitmapsStored 関数を使うことで、ビットマップデータがメモリ上に貯蔵されているかを調べることができます。
例;
// ビットマップデータがメモリ上にあるか調べる//
if( Settings::MemoryBitmapsStored() ) {
allegro_message( "Bitmaps are also stored in the memory" );
}
[Setup]プログラムを初期化する関数 、OpenLayerを有効にするには、最初にこれらの関数を使う必要があります。
このクラスは、マウス、キーボード、タイマー処理やウインドウ/スクリーンモード等、プログラムを初期化する関数を有している。
Member functions
■SetupProgram ( 入力デバイスの初期化, キーボード, マウス等 )
static bool SetupProgram(
bool setupKeyboard = true,
bool setupMouse = true,
bool setupTimer = true );
OpenLayer, Allegro, AllegroGL と 指定した入力でバイス を初期化します。true が返れば成功。
static bool SetupProgram(
int devices );
上と同じですが、 定数名 KEYBOARD, MOUSE , TIMER で指定します。複数のデバイスを同時に指定したければ 論理演算子OR「|」で区切って下さい。
あなたがまず最初にしなければいけないことは、この関数を呼び出し初期化することです。さもなければ、OpenLayer、Allegro 、AllegroGL のどの機能も使うことはできません。
ライブラリの初期化に指定した入力デバイスの初期化も行います。最低限キーボードを使わない場合でも、キーボードを指定することをお進めします。また、マウスを設定した場合は タイマーが false になっていても 自動的にタイマーも初期化されます。これはマウスが、タイマー ル−ティンを使用しているからです。
この関数を呼ぶ時に、パラメータに何も渡さなければ、デフォルトですべての入力デバイスが初期化されます。
この関数を呼び出した後に、Setup::SetupScreen 関数を呼ぶのがベストです。
なぜなら、スクリーンを初期化しなければ、Bitmaps または TextRenderers が使えないからです。
例:
// 全ライブラリとドライバを初期化 //
Setup::SetupProgram();
//全ライブラリの初期化、 キーボードを有効に、マウスを無効にする。 //
Setup::SetupProgram( true, false );
// 上と同じ結果ですが、引数を定数「KEYBOARD」で指定しています。 //
Setup::SetupProgram( KEYBOARD );
// 全ライブラリの初期化、キーボードとタイマーは有効に、マウスは無効。//
Setup::SetupProgram( true, false, true );
// 上と同じ結果ですが、引数が定数「KEYBOARD | TIME」で指定してます。 //
Setup::SetupProgram( KEYBOARD | TIMER );
// 全ライブラリとドライバを初期化、デフォルト扱い//
Setup::SetupProgram();
// これで、キーボード、マウス、タイマー処理全て使える準備が整いました。//
■SetupScreen ( スクリーンの初期化, ウインドウ/フルスクリーン)
static bool SetupScreen(
int width, int height,
bool fullscreen = true,
int colorDepth = 32, int zDepth = 8 );
プログラムの使用する色深度 colorDepth、Z depth、ウインドウモードか、フルスクリーンモードで動作するのか指定します。成功すればtrueが返ります。
fullscreen parameterには、ブーリアン指定ではなく、定数 FULLSCREEN または WINDOWED で指定することもできます。
Width、 height パラメータには、スクリーンの解像度(フルスクリーンモードの場合)か、ウインドウのサイズ(ウインドウモード)をピクセル単位で指定します。色深度は、16、32 のいずれかを指定します。
一般的に、この関数は、Setup::SetupProgram の直後に呼ぶのがベストです。なぜなら、スクリーンを準備しなければ、Bitmaps や TextRenderers が使えないからです!
zDepth パラメータには、built-in depthソートの精度(8, 16または32)を指定します。しかしこれが何をしているのかをあなたは知る心配はいりません。この値を省略した場合はデフォルトの値が適用されます。
例:
// 32-bit フルスクリーンモード、 解像度は 1024 x 768 (ピクセル)//
Setup::SetupScreen( 1024, 768, true, 32 );
// 上と同じですが、定数「FULLSCREEN」 を使ったやり方です//
Setup::SetupScreen( 1024, 768, FULLSCREEN, 32 );
// 32-bit ウインドウモード、ウインドウサイズは 800 x 600 //
Setup::SetupScreen( 800, 600, false, 32 );
// 上と同じですが、定数「WINDOWED」を使ったやり方です //
Setup::SetupScreen( 800, 600, WINDOWED, 32 );
// もし、32-bit のグラフィックを使いたければ、 color depth パラメータを省略できます。 //
Setup::SetupScreen( 800, 600, WINDOWED );
// 32-bit 古すクリーンモード、ウインドウサイズは 800 x 600 //
// Zバッファの精度は最大 //
Setup::SetupScreen( 800, 600, FULLSCREEN, 32, 32 );
2■GetWindowWidth ( ウインドウの幅を返す )
static inline int GetWindowWidth()
ウインドウの幅を返します。
もちろん、この関数は、Setup::SetupScreenを呼び出した後にしか動作しません。
例:
// ウインドウの幅を取得 //
int windowWidth = Setup::GetWindowWidth();
2■ GetWindowHeight ( ウインドウの高さを返す )
static inline int GetWindowHeight()
ウインドウの高さを返します。
もちろん、この関数は、Setup::SetupScreenを呼び出した後にしか動作しません。
例:
// ウインドウの高さを取得 //
int windowWidth = Setup::GetWindowHeight();
2■ GetColorDepth ( ウインドウの色深度を返す )
static inline int GetColorDepth()
ウインドウの色深度を返します。
2■ GetExecutablePath ( プログラムが実行しているパスを返す )
static inline std::string GetExecutablePath()
プログラムが実行しているパスを返します。
もちろん、この関数は、Setup::SetupScreenを呼び出した後にしか動作しません。
例:
// プログラムが実行しているパスを取得 //
std::string executablePath = Setup::GetExecutablePath();
2■ ToAbsolutePathname ( 相対パスを絶対パスに変換 )
static std::string ToAbsolutePathname( std::string pathname )
相対パスを絶対パスに変換します。
OpenLayerのすべての読込み関数は、相対パス、絶対パスの両方ともを受け入れます。この関数は、渡されたパスが既に絶対パスならばパス名は変更されずに返ってきます。
もちろん、この関数は、Setup::SetupScreenを呼び出した後にしか動作しません。
例:
string relativePathname = "data/SomeTextFile.txt";
// 相対パスを絶対パスに変換します。 //
// (例えば, C:/mygames/mycoolgame/data/SomeTextFile.txt) //
string absolutePathname = Setup::ToAbsolutePath( relativePathname );
Advanced functions
2■IsProgramSetUp ( SetupProgram 関数が呼び出されていれば Trueを返す。 )
static bool IsProgramSetUp();
SetupProgram 関数が呼び出されていれば Trueを返す。
例;
// SetupProgram 関数が呼び出されたか調べる //
if( Setup::IsProgramSetUp() ) {
allegro_message( "Yes it is!" );
}
2■IsScreenSetUp ( SetupScreen関数が呼び出されていれば Trueを返す。)
static bool IsScreenSetUp()
SetupScreen関数が呼び出されていれば Trueを返す。
例;
// SetupProgram 関数が呼び出されたか調べる //
if( Setup::IsScreenSetUp() ) {
allegro_message( "Yes it is!" );
}
[ Shape ] 図形全般 **
線、長方形、円、長円、連続線分、多角形および点は、Shape の 派生クラスです。 作成可能なすべてのリストをみることができます。
注意:
OpenLayer は、プリミティブの描画方法について、もうほとんどのライブラリとは違った独特のやり方をしています。その代わり、プリミティブクラスがあり、そのメンバ関数によって描画しています。
この考えは、例えば、内部が塗られた長方形や、長方形の輪郭、グラデーションのある長方形が、それら知る必要のあるすべての位置や長方形のサイズについて、共通のコンストラクタすべてを使うことができるということです。また、専門化されたコンストラクタによって、同じ操作によって角丸長方形を作成するといったことも可能にしています。
これは円であっても同じで、いくつもの全く異なった描画方法によって扱います。例えば分割された円や、ディスクのようなものを描画したい時も...。
注意:
多くの変数が オプション であることに注目して下さい。オプションとなる追加パラメータは、あなたが必要とする場合だけ使えばよいのです。従って、最初は関数は複雑に見えても、実際はより単純なものに見えるかもしれません。
Member functions
■Draw ( 図形の描画 )
svoid Draw( Rgba color ) const
指定した色で内部が塗られた図形を、サーフェスに描画します
どんなオブジェクトも描画時には、この関数に依存されます。
例:
// 新しい 円 を作成し、それをポインタに格納 //
Shape *myShape = new Circle( 200.0, 100.0, 50.0 );
// カンバスに、内部が緑色に塗られた 図形を描画する //
myShape->Draw( Rgba::GREEN );
// shapeオブジェクトへのポインタを使って、スクリーン上のすべてのプリミティブを含む
//リストを作成しすることができます。 //
std::list< Shape *> myList;
// 円と、線、長方形をリストに追加する。 //
myList.push_back( new Circle( 200.0, 100.0, 50.0 ));
myList.push_back( new Line( 200.0, 100.0, 250.0, 150.0 );
myList.push_back( new Rect( 200.0, 100.0, 70.0, 50.0 );
// すべてのプリミティブを 内部を黒く塗って描画する //
for( std::list< Shape *> ::iterator iter = myList.begin(); iter != myList.end(); iter++ ) {
(*iter)->Draw( Rgba::BLACK );
}
■DrawOutline ( 図形の輪郭線を描画 )
DrawOutline( Rgba color ) const
指定した色の輪郭線で、図形をサーフェスに描画します
どんなオブジェクトも描画時には、この関数に依存されます。詳細については Draw 関数を見て下さい。
■RecordDraw ( カンバスに描画せず、描画を記録することで、高速化 )
void RecordDraw()
Draw を呼び出しますが、カンバスへ描画する代わりに、描画結果を記録します。
従って、プリミティブ図形を何度も描画する場合は、この関数を使って描画結果の記録を重ねて、カンバスへの描画は一度だけで済ます、という方法をとるのが高速です。
例:
Shape *myShape = new Circle(...);
// Draw関数の描画結果のみを記録 //
myShape->RecordDraw();
// 記録内容を、黒色で (黒色の円が描画される) //
myShape->DrawRecord( Rgba::BLACK );
■MoveBy ( 図形の移動 )
void MoveBy( const Vec2D &amount )
指定した場所へ図形を移動する
例:
Shape myShape = ...;
// 20ピクセル右に図形を移動 //
myShape.MoveBy( Vec2D( 20.0, 0.0 ));
// 図形を、左に100下に150ピクセル移動 //
myShape.MoveBy( Vec2D( -100.0, 150.0 ));
// 図形を同じようにして移動しますが、deltaTime を加味する //
// ことで、移動速度を調節しています。//
float deltaTime = FpsCounter::GetDeltaTime();
myShape.MoveBy( deltaTime * Vec2D( -100.0, 150.0 ));
■SetLineWidth ( 輪郭線の太さを指定します。 )
SetLineWidth( float lineWidth )
輪郭線の太さを指定します。
例:
Shape myShape = ...;
// 輪郭線の太さを 5.0 ピクセルに //
myShape.SetLineWidth( 5.0 );
■GetLineWidth ( 輪郭線の太さを取得します。 )
float GetLineWidth()
輪郭線の太さを指定します。
例:
Shape *myShape = ...;
// 図形の輪郭線の太さを得る //
float outlineWidth = myShape->GetLineWidth();
■DrawRecord ( RecordDrawで呼ばれた最新の描画記録を呼び出します。 )
inline void DrawRecord( const Rgba &color ) const
RecordDrawで呼ばれた最新の描画記録を呼び出します。プリミティブ図形を RecordDraw 関数で記録しておけば、使い回しが効き、高速に描画することができます
例:
Shape *myShape = ...;
Shape *myShape = new Circle(...);
// Draw-function の描画結果を記録します //
myShape->RecordDraw();
// 記録された、内容を黒色でスクリーンに描画する ( 黒い円がスクリーンに出力される。) //
myShape->DrawRecord( Rgba::BLACK );
■RotateBy ( 指定された角度で図形を回転させます。 )
void RotateBy( float angle )
例:
Circle circle( ... );
// 円を90°回転する //
circle.RotateBy( AL_PI/2 );
■TransformBy (指定されたPlacement で図形を変形させます。 )
void TransformBy( const Placement &placement )
例:
Circle circle( ... );
// 円を20pixel 右に移動して、90°回転する //
circle.TransformBy( Placement( 20.0, 0.0, AL_PI/2 ));
Derived Classes
■Poly ( ポリゴン )
Poly()
デフォルトのコンストラクタで、頂点は存在しません。
Poly( const std::vector< Vec2D > &vertices )
頂点リストを結ぶポリゴンを構築。
Poly( const Vec2D *vertices, int numVertices )
頂点リストを結ぶポリゴンを構築。 numVertices には、 (最低限の)頂点数 を引数として与えなければいけない。
Poly-Member functions
○Add ポリゴンの追加
inline void Add( Vec2D vec )
ポリゴンに頂点を追加する。この時、追加された頂点は、この直前に追加された頂点と、一番最初の頂点を繋ぐ頂点となる。
例:
Polygon polygon( ... );
// ポリゴンに頂点 (x = 200, y = 100) を追加//
polygon.Add( Vec2D( 200.0, 100.0 ));
○GetVertex 頂点を得る
Vec2D &GetVertex( int index )
指定したインデックスの ポリゴンの頂点 を得る。もし、index の値が 範囲外で、エラーが発生した場合 は Vec2D( 0, 0 )が返ります。
例:
○GetNumberOfVertices ポリゴンを構成する 頂点の総数を得る
int GetNumberOfVertices()
ポリゴンを構成する 頂点の総数が返ります。
例:
○Draw カンバスに、内部を指定色で塗られたポリゴンを描画します
void Draw( const Rgba &color )
カンバスに、内部を指定色で塗られたポリゴンを描画します。
例:
○DrawOutlineカンバスに、輪郭線が指定色のポリゴンを描画します。
void DrawOutline( const Rgba &color )
カンバスに、輪郭線が指定色のポリゴンを描画します。この輪郭線は、テクスチャを持つことがあります(これについては、SetOutlineTexture を見ること。 また、この場合テクスチャが指定した色で乗算されます)。
例:
○Collides 衝突判定 true/false
bool Collides( const Poly &other,
const Placement &thisPlacement,
const Placement &otherPlacement )
true を返した場合、このポリゴンが他のポリゴンに衝突したことを示します。
どのように衝突が判定されるかは、Placements クラス の testing for a collision の例を参考にして下さい。
例:
○GetCollision 衝突判定。 詳細
Collision GetCollision(
const Poly &other,
const Placement &thisPlacement,
const Placement &otherPlacement )
衝突判定に関する 詳細
詳細は、Collision クラス を参考にして下さい。
例:
○SetPivot ポリゴンの回転の中心位置をセットする。
void SetPivot( Vec2D rotationPivot )
ポリゴンの回転の中心位置をセットする。rotation pivot は主に衝突判定ルーティンで使用される。
例:
○GetPivot ポリゴンの回転の中心位置を得る。
Vec2D GetPivot()
ポリゴンの回転の中心位置を返します。
例:
○SetOutlineTexture ポリゴンの輪郭線にテクスチャをセットする。
void SetOutlineTexture( Bitmap *texture )
ポリゴンの輪郭線にテクスチャをセットします。
例:
Poly-Derived Classes
○Collides 2つの、コリジョンポリゴンが衝突したか チェックする。
Poly-Parent Class
Shape
■Line ( 2点を結ぶ直線 )
Line( float x1, float y1, float x2, float y2, float lineWidth = 1.0 )
座標(x1, y1) から (x2, y2) を結ぶ直線を作成。
Line( Vec2D start, Vec2D end, float lineWidth = 1.0 )
指定した 開始位置から、終了位置まで を結ぶ直線を作成。
Public fields
Vec2D start - 線分の始まり
Vec2D end - 線分の終わり
テンポラリオブジェクトを使って、シンプルに直線を描画するやり方。
例:
// x = 50.0, y = 30.0 から、x = 200.0, y = 100.0 を//
// 結ぶ直線(線幅は1.0)を作成 //
Line myLine( 50.0, 30.0, 200.0, 100.0 );
// この直線を黒色 で、スクリーンに描画 //
myLine.Draw( Rgba::BLACK );
// 上と同じ処理を、今度は 1行で済ませます //
Line( 50.0, 30.0, 200.0, 100.0 ).Draw( Rgba::BLACK );
// または、開始点 及び 終点位置を格納したベクトルを使いたい場合は、このようにも書けます。//
Line( Vec2D( 50.0, 30.0 ), Vec2D( 200.0, 100.0 )).Draw( Rgba::BLACK );
Line-Member functions
○Draw ポリゴンの追加
void Draw( Rgba color ) const
スクリーンに 指定した色の直線を描きます。
void Draw( const Rgba &startColor, const Rgba &endColor ) const
グラデーションを伴った直線を描きます。開始点の色から終点の色へ 色がなだらかに変化するように描画されます。
例:
// x = 50.0, y = 30.0 から、x = 200.0, y = 100.0 を//
// 結ぶ直線(線幅は1.0)を作成 //
Line myLine( 50.0, 30.0, 200.0, 100.0 );
// この直線を黒色 で、スクリーンに描画 //
myLine.Draw( Rgba::BLACK );
// スクリーンに明るい黄色の線を描く //
myLine.Draw( Rgba( 1.0, 1.0, 0.7 ));
// 上の処理を一行で済ませたもの //
Line( 50.0, 30.0, 200.0, 100.0 ).Draw( Rgba( 1.0, 1.0, 0.7 ));
// 赤から黄色に色が変化する グラデーションを伴った直線を描きます //
myLine.Draw( Rgba::RED, Rgba::YELLOW );
○GetIntersectionPoint 2つの直線の 交差地点 を得る
Vec2D GetIntersectionPoint( const Line &other )
2つの直線の 交差地点 を得る。 交差地点は、ライン・セグメントの中に落ちないかもしれません。ライン・セグメントが衝突した場合は、コリジョン関数を使って判定して下さい。
例:
Line myLine( ... );
Line otherLine( ... );
// 2つの直線が、交差した地点を得る //
Vec2D point = myLine.GetIntersectionPoint( otherLine );
○Collides 衝突判定 true/false
bool Collides( const Line &other )
2つの直線が衝突した場合はtrue を返します。
例:
Line myLine( ... );
Line otherLine( ... );
// 2つのライン・セグメントが衝突したか確かめる //
if( myLine.Collides( otherLine )) {
allegro_message( "Collision! 衝突した!" );
}
○GetNormal 正規化された直線を得ます。
Vec2D GetNormal()
正規化された直線を得ます
例:
Line-Parent Class
Shape
■Rect ( 矩形 )
Rect(
float x, float y, float w, float h,
float outlineWidth = 1.0,
float roundness = 0.0
float accuracy = [default] )
スクリーン左上を起点に、指定した位置に、線幅と、角の丸みを持った長方形を作成する。
輪郭線の幅については、DrawOutline を参照。
Rect(
Vec2D topleft, Vec2D size,
float lineWidth = 1.0,
float roundness = 0.0
float accuracy = [default] )
上のと同じですが、位置及びサイズはベクトルで指定されます。
例:
// 新しく、左上から、 x = 200.0, y = 100.0 の位置に //
// サイズ 300.0 x 400.0 の長方形を 作成 //
Rect myRectangle( 200.0, 100.0, 300.0, 400.0 );
// この長方形を 内部を白く塗ったものを サーフェスに描画します。 //
myRectangle.Draw( Rgba::WHITE );
// また、上の長方形作成を一行で書いて済ませるとこうなります。 //
Rect( 200.0, 100.0, 300.0, 400.0 ).Draw( Rgba::WHITE );
// 新しく 長方形を ベクトルを使って作成します。 //
Vec2D topleft( 200.0, 100.0 );
Vec2D size( 300.0, 400.0 );
Rect myRectangle( topleft, size );
// これを一行で書いて済ませるとこのようになります... //
Rect myRectangle( Vec2D( 200.0, 100.0 ), Vec2D( 300.0, 400.0 ));
Rect-Member functions
○Draw 指定した色で、矩形を描画 /グラデーション
void Draw( const Rgba &color )
内部を指定色で塗った長方形を描画。
void Draw( const Rgba *colors )
内部が各頂点から始まる指定色のグラデーションを伴った長方形を描画。配列に格納された各頂点の色は 左上角を起点に時計回りに指定します。
例:
○DrawOutline 矩形の輪郭線
void DrawOutline( const Rgba &color )
指定色の輪郭線を持つ長方形を描画。
例:
○SetAccuracy 矩形の角の正確さを指定します。
void SetAccuracy( float accuracy )
矩形の角の正確さを指定します。
例:
○SetRoundness 矩形の角の丸みを指定します。
void SetRoundness( float roundness )
矩形の角の丸みを指定します。この関数は角の正確さをデフォルトに戻すことに注意して下さい。
例:
Rect-Parent Class
Shape
■Ellipse ( 楕円 及び 円 )
Ellipse(
float x, float y, float xRadius, float yRadius,
float outlineWidth = 1.0, float angle = 0.0,
float accuracy = [default] )
与えられた座標(x,y)が楕円の中心になります。水平半径をxRadius 、垂直半径をyRadiusで指定します。angle は楕円を反時計回りに回転させます。
Ellipse(
Vec2D pos, Vec2D radiuses,
float outlineWidth = 1.0, float angle = 0.0,
float accuracy = [default)
上のと同じですが、位置及びサイズはベクトルで指定されます。
Public fields
Vec2D pos - 楕円の中心
float angle - 楕円の回転角度
テンポラリオブジェクトを使って、シンプルに直線を描画するやり方。
もし、楕円の代わりに 円を描きたい場合は、 半径 x と y に同じ値を指定するか、 Circle クラスを使って下さい。
例:
// x = 200.0, y = 100.0 を中心に、水平半径が 50.0 垂直半径が30.0 の 楕円を描きます//
Ellipse myEllipse( 200.0, 100.0, 50.0, 30.0 );
// この楕円をカンバスに青色で描きます //
myEllipse.Draw( Rgba::BLUE );
// 上の処理を一行で書くとこのようになります。 //
Ellipse( 200.0, 100.0, 50.0, 30.0 ).Draw( Rgba::BLUE );
Ellipse-Member functions
○Draw 楕円の描画。塗り
void Draw( const Rgba &color ) const
スクリーンに 指定した色で塗られた楕円を描きます。
void Draw( const Rgba &innerColor, const Rgba &outerColor )
グラデーションを伴った楕円を描きます。中心( innerColor)から、円周( outerColor )にかけて半径方向に従って色が変化します。
例:
○DrawOutline 指定した色の輪郭線をもった楕円を描きます。
DrawOutline( Rgba color ) const
スクリーンに 指定した色の輪郭線をもった楕円を描きます。
例:
○DrawSlice 分割された楕円を描きます。扇形/グラデーションも。
void DrawSlice(
const Rgba &color,
float startAngle, float angleSweep )
分割されただ円を描きます。
与えられた座標(x,y)が楕円の中心になります。 startAngle から startAngle + sweepAngl まで、角度 radial で分割されます。
void DrawSlice(
const Rgba &innerColor, const Rgba &outerColor,
float startAngle, float angleSweep )
内部がグラデーションで塗られた、分割された円(扇形など)を描画。中心( innerColor)から、円周( outerColor )にかけて半径方向に従って色が変化します。
与えられた座標(x,y)が楕円の中心になります。startAngle から startAngle + sweepAngl まで、角度 radial で分割されます。
例:
○DrawDisk 内部が塗られた円盤を描画。グラデーションも。
void DrawDisk(
const Rgba &color,
float innerXRadius, float innerYRadius )
内部が塗られた円盤を描きます。円盤の外側の半径はEllipseクラスで指定されます。
void DrawDisk(
const Rgba &innerColor, const Rgba &outerColor,
float innerXRadius, float innerYRadius ) const
グラデーションを伴った円盤を描きます。 円盤の中( innerColor)から、円周( outerColor )にかけて半径方向に従って色が変化します。
例:
○DrawDisk 内部が塗られた円盤の弧を描画。グラデーションも。
void DrawArc(
const Rgba &color,
float startAngle, float angleSweep,
float innerXRadius, float innerYRadius )
内部が塗られた円盤の弧を描きます。
void DrawArc(
const Rgba &innerColor, const Rgba &outerColor,
float startAngle, float angleSweep,
float innerXRadius, float innerYRadius )
グラデーションを伴った円盤の弧を描きます。 円盤の中( innerColor)から、円周( outerColor )にかけて半径方向に従って色が変化します。
例:
○SetRadius 指定した軸の半径を指定する。
void SetRadius( Axis axis, float radius )
radius には、 楕円の指定し軸に合わせて x または y 半径をセットする。 Axis(軸) には、 X_AXIS または Y_AXIS を指定する。
例:
○GetRadius 指定した軸の半径を得る。
float GetRadius( Axis axis )
楕円の 指定した軸によって x または y 半径を得る。 Axis(軸) には、 X_AXIS または Y_AXIS を指定する。
例:
Ellipse-Derived Classes
○Circle 円 - 楕円の特別な形
Circle( Vec2D pos, float radius,
float lineWidth = 1.0, float accuracy = [default] ))
楕円の特別な形。 描画する 位置と半径を指定する。lineWidth は 円の輪郭線の幅です。
例:
// x = 200.0, y = 100.0 に、半径 50.0 の円を作成 //
Circle myCircle( Vec2D( 200.0, 100.0 ), 50.0 );
// 青い円としてカンバスに描画 //
myCircle.Draw( Rgba::BLUE );
Circle - Member Classes
○DrawDisk 円盤 を描く / グラデーションも
void DrawDisk( const Rgba &color, float innerRadius )
void DrawDisk( const Rgba &innerColor, const Rgba &outerColor, float innerRadius )
○DrawArc 円盤の弧を描く
void DrawArc( const Rgba &color, float startAngle, float angleSweep, float innerRadius )
○ SetRadius 円の半径を指定する。
void SetRadius( float radius )
Ellipse-Parent Class
Shape
■LineStrip ( 連続した複数の座標をつないだ 直線 )
LineStrip( float lineWidth = 1.0,
const Bitmap *texture = [none] )
線幅とテクスチャをもったLineStrip (連続した直線)を作成 。
LineStrip(
const std::list< Vec2D > &vertices,
float lineWidth = 1.0,
const Bitmap *texture = [none] )
頂点リストから、線幅とテクスチャをもったLineStripを作成 。
LineStrip-Member functions
○Draw LineStripの描画/グラデーションも
void Draw( const Rgba &color )
指定した色で LineStrip をカンバスに描画。
void Draw( const Rgba &startColor, const Rgba &endColor )
グラデーションを伴ったLineStrip を描きます。開始点の色から終点の色へ 色がなだらかに変化するように描画されます。
例:
○SetTexture LineStrip にテクスチャを適用
void SetTexture( const Bitmap &texture )
LineStrip にテクスチャを適用
例:
○DisableTexture LineStrip のテクスチャを無効
void DisableTexture()
LineStrip のテクスチャを無効にします。
例:
○AddToEnd新しい頂点を、頂点リストの最後に追加
void AddToEnd( Vec2D vertex )
新しい頂点を、頂点リストの最後に追加
例:
○AddToBegin新しい頂点を、頂点リストの最初に追加
void AddToBegin( Vec2D vertex )
新しい頂点を、頂点リストの最初に追加
例:
○DeleteFirst LineStripの頂点リストの最初の頂点を削除
void DeleteFirst()
頂点リストの最初の頂点を削除
例:
○DeleteLast LineStripの頂点リストの最後の頂点を削除
void DeleteLast()
頂点リストの最後の頂点を削除
例:
○GetVertex LineStripの頂点リストから指定したインデックスの 頂点を取得
Vec2D GetVertex( int index )
リスト中から指定したインデックスの 頂点を取得
例:
○GetNumberOfVertices LineStripの頂点リストの総数を得ます
int GetNumOfVertices()
頂点リストの総数を得ます
例:
LineStrip-Parent Class
Shape
■Point ( 点 )
Point( float x, float y )
カンバスの指定位置に点を作成 。
Point( Vec2D pos )
ベクトルを用いた指定。
例:
// x = 200.0, y = 100.0 の位置に青い点を描画//
Point( 200.0, 100.0 ).Draw( Rgba::BLUE );
Point-Member functions
○Draw 指定した色で 点 を描画。
void Draw( const Rgba &color )
指定した色で 点 を描画。
例:
○StartFastDrawing DrawFast を用いる時に使う(初期化)
static void StartFastDrawing()
DrawFast関数を使う場合は、使用前にこの関数を使って描画する。
DrawFast関数はDraw関数よりも高速ですが、画像操作には、まだ適さないことを忘れないで下さい。
例:
// 高速描画をする場合は、最初に必ず start fast drawing を使う //
Point::StartFastDrawing();
// 連続した点を、DrawFastを使い 高速描画 する//
for( int i = 0; i = 1000; i++ ) {
Point( i, i ).DrawFast( Rgba::RED );
}
// 高速描画を終わったら必ず FinishFastDrawing();を呼ぶ //
Point::FinishFastDrawing();
○DrawFast Draw の 高速版。 StartFastDrawing と FinishFastDrawing と組み合わせて使う。
void DrawFast( const Rgba &color )
Draw の 高速版。 StartFastDrawing と FinishFastDrawing と組み合わせて使う。
DrawFast関数はDraw関数よりも高速ですが、画像操作には、まだ適さないことを忘れないで下さい。
例:
// 高速描画をする場合は、最初に必ず start fast drawing を使う //
Point::StartFastDrawing();
// 連続した点を、DrawFastを使い 高速描画 する//
for( int i = 0; i = 1000; i++ ) {
Point( i, i ).DrawFast( Rgba::RED );
}
// 高速描画を終わったら必ず FinishFastDrawing();を呼ぶ //
Point::FinishFastDrawing();
○FinishFastDrawingDrawFast関数を使用した後には必ずこれを呼ぶ。
static void FinishFastDrawing()
DrawFast関数を使用した後には必ずこれを呼ぶ。
例:
Point-Parent Class
Shape
[TextRenderer]フォントコンテナを司るクラス、読込んだフォントは TextRenderer を使用して描画されます。
TextRenderer(
const char *filename,
int width = 9, int height = 12,
Rgba col = Rgba::BLACK, int italics = 0 );
True Type Font を読み込んでTextRendererを構築する。
TextRenderer(
const TextRenderer &otherRenderer,
int width = 9, int height = 12,
Rgba col = [inherit], int italics = [inherit] );
既存の TextRendererオブジェクトのコピーを操作してTextRendererを構築する。
もし、Rgba col か int italics パラメータに何も渡さない場合は、もう一方のレンダラから継承される。
TextRenderer(
GLYPH_FACE *face = 0,
int width = 9, int height = 12,
Rgba col = Rgba::BLACK, int italics = 0 );
Glyph Keeper font face を使ってフォントを構築
TextRenderer();
デフォルトのコンストラクタ。
Load メソッド (IsValid() が falseを返した場合) を行う前には、TextRenderer は使用可能ではありません。
このこんストラクタは、Load メソッドと同じような働きをする。寸法はピクセルで指定し、イタリック体の角度は、度で指定する。
アルファ値は、 描画されたテキストの不透明度をコントロールします。この値が高ければ、テキストは不透明に描画される。
色指定についての詳細情報は、Rgba の項目を参照してください。
これらの関数のいずれかがフォント構築に失敗した場合、エラーが allegro.logファイルに記録されます。
さらに、IsValid () メソッドはTextRendererが使用可能でなければ偽を返します。
Global TextRenderers は、現在自動化されている。
例:
// fonts -フォルダ内のTrue Type フォント Arial.ttf を読み込んで新規TextRendererを構築する //
// 高さ15 、幅 10 で 文字色は 黒 //
TextRenderer myTextRenderer( "fonts/Arial.ttf", 10, 15, Rgba::BLACK );
// 同じようにして今度は、イタリック体(角度は12° これはイタリック体の標準)のTextRendererを構築する。 //
TextRenderer myItalicsRenderer( "fonts/Arial.ttf", 10, 15, Rgba::BLACK, 12 );
//フォントを 不透明度 30% で myTextRenderer として 構築する //
TextRenderer myTranslucentRenderer( "fonts/Arial.ttf", 10, 15, Rgba( 0.0, 0.0, 0.0, 0.30 ));
// 既存のTextRendererをコピーして、より小さいサイズ(sized 9x12) のTextRendererを作成する。 //
// もし、色パラメータを省略した場合、引数に渡した元のフォントのパラメータが継承されます。//
TextRenderer smallerTextRenderer( myTextRenderer, 9, 12 );
// glyph keeper font face を使ってTextRendererを構築する。この例の文字色は黄緑色である//
GLYPH_FACE *glyphKeeperFace = ...;
TextRenderer otherTextRenderer( glyphKeeperFace, 20, 15, Rgba( 0.3, 1.0, 0.0 ));
Member functions
■Load ( フォントをTextRendererに読込み )
bool Load( const char *filename,
int width = 9, int height = 12,
Rgba col = Rgba::BLACK, int italics = 0 );
True Type Font ファイルを読込む
bool Load( const TextRenderer &otherRenderer,
int width = 9, int height = 12,
Rgba col = [inherit], int italics = [inherit] );
既存のTextRendererのコピーからTextRendererを構築します。文字色やイタリック体 のパラメータに何も渡さない場合、otherRenderer のものが継承されます 。
bool Load(
GLYPH_FACE *face = 0,
int width = 9, int height = 12,
Rgba col = Rgba::BLACK, int italics = 0 );
GlyphKeeper font faceから TextRenderer を作ります。
col の アルファ値は、描画されたテキストの不透明度を指定します。この値が大きければ不透明です。アルファチャンネルについてはbitmapクラスのビットマップの定義を見て下さい。
これらの関数のいずれかがフォント構築に失敗した場合、エラーが allegro.logファイルに記録されます。
さらに、IsValid () メソッドはTextRendererが使用可能でなければ偽を返します。
先に、 Setup::SetupProgram と Setup::SetupScreen を呼び出さなければTextRenderers 関数は使えません。
例:
// Loadメソッドの使い方は、コンストラクタを使うやり方とほぼ同じです。 /
// font フォルダにあるArial.ttf というTrueTypeフォントを読込んで 新しいフォントを構築。//
//文字幅は 10, 文字高さは 15 、そして 文字色は黒 //
TextRenderer myTextRenderer;
if( myTextRenderer.Load( "fonts/Arial.ttf", 10, 15, Rgba::BLACK ) == false ) {
allegro_message( "Couldn't load the font Arial.ttf!" );
exit( -1 );
}
// 同じく イタリック体、斜体の角度は12° (一般的なイタリック体の角度 ) //
TextRenderer myItalicsRenderer;
if( myItalicsRenderer.Load( "fonts/Arial.ttf", 10, 15, Rgba::BLACK, 12 ) == false ) {
allegro_message( "Couldn't load the font Arial.ttf!" );
exit( -1 );
}
// 同じようにTextRendererを構築、今度は不透明度は30%です。 //
TextRenderer myTranslucentRenderer;
if( myTranslucentRenderer.Load( "fonts/Arial.ttf", 10, 15, Rgba( 0.0, 0.0, 0.0, 0.30 )) == false ) {
allegro_message( "Couldn't load the font Arial.ttf!" );
exit( -1 );
}
// 既存のTextRenderer をひな形にして、小さい文字のフォントを作ります。(サイズは 9x12) //
// もし、文字色を指定しなければ、ひな形となったTextRenderer のパラメータが継承されます //
TextRenderer smallerTextRenderer;
smallerTextRenderer.Load( myTextRenderer, 9, 12 );
// glyph keeper font face を使って構築//
//文字色は、黄緑色 //
GLYPH_FACE *glyphKeeperFace = ...;
TextRenderer otherTextRenderer;
if( otherTextRenderer.Load( glyphKeeperFace, 20, 15, Rgba( 0.3, 1.0, 0.0 )) == false ) {
allegro_message( "Couldn't load the font from a Glyph Keeper face!" );
exit( -1 );
}
■Print ( (複数行にわたる)テキストを表示 )
void Print( const std::string &text, int x, int baselineY ) const;
指定した座標に、(複数行にわたる)テキストを描画します。
注意: y座標 は、テキストの最初の文字の一番上ではなく テキストの最初の文字のベースライン が基準となっています。( 前のバージョンから仕様が変更されました )
すべての座標はピクセル単位です。もしあなたが複数業に渡るテキストを描画したければ、各行末に終端文字列「¥n (¥は実際には半角です)」を記述して下さい。
パフォーマンスの関係上で、この関数が、テキストデータの参照渡しすることに注意して下さい。これは、テキストを入れる変数を始めに用意して、この関数にそれを渡して下さい、という意味です。
OpenLayerは Print 関数に文字列として渡す為に、変数( 例えば数値など )を変換する ToString 関数も用意しています。これについては例を見て下さい。
例:
TextRenderer myTextRenderer(...);
// 「Hello World!」という文字列をスクリーンの左上隅から//
// x = 200 、y=110 (※最初の行の文字のベースラインの位置)に描画 //
String message = "Hello World!";
myTextRenderer.Print( message, 200, 110 );
// 複数行に渡る文字列を スクリーンの同じ場所に描画します。//
String message = "First line¥nSecond line¥nThird line";
myTextRenderer.Print( message, 200, 110 );
// 数値を 文字列に変換し スクリーンに描画します //
int number = 500;
String message = ToString( number );
myTextRenderer.Print( message, 200, 110 );
// 同じく、文字列と数値(文字列に変換する)を スクリーンに描画します。 //
int number1 = 500;
float number2 = 750.5;
String message = "The first number is " + ToString( number1 ) +
" and the second number is " + ToString( number2 );
// ↑文字列 message の内容は「The first number is 500 and the second number is 750.5」 //
myTextRenderer.Print( message, 200, 110 );
■SetColor ( フォントの色をセットする )
void SetColor( const Rgba col );
フォントの色をセットする。
アルファ値は、描画されたテキストの不透明度を指定します。この値が大きければ不透明です。アルファチャンネルについてはbitmapクラスのビットマップの定義を見て下さい。
例:
TextRenderer renderer( ... );
// フォントの色を 黒にする //
renderer.SetColor( Rgba::BLACK );
// フォントの色を 明るい灰色にする //
renderer.SetColor( Rgba( 0.8, 0.8, 0.8 ));
// フォントの色を 明るい灰色にする、ただし不透明度は30% //
renderer.SetColor( Rgba( 0.8, 0.8, 0.8, 0.30 ));
■GetColor ( フォントの色を取得する )
Rgba GetColor() const;
そのフォントの文字色を返します。
例:
TextRenderer renderer( ... );
// そのフォントの文字色を取得 //
Rgba color = renderer.GetColor();
// ヒント: これを利用すれば テキストを影付きにすることができる。 //
string text = "Some text";
int x = 200;
int y = 100;
// オリジナルの文字色を格納 //
Rgba originalColor = renderer.GetColor();
// 半透明の黒色を指定します。(30%の不透明度) //
renderer.SetColor( Rgba( 0.0, 0.0, 0.0, 0.30 ));
// 先に、文字列の影を付けるためにオリジナルのテキストから1ピクセルずらした位置に 描画します。//
renderer.Print( text, x-1, y+1 );
// オリジナルのテキストの文字色を指定します //
renderer.SetColor( originalColor );
// オリジナルのテキストを上から描画して影付きテキストが完成。 //
renderer.Print( text, x, y );
■SetItalics ( テキストに斜体をかけます )
void SetItalics( int italicsAngle );
テキストに斜体をかけます。
斜体(イタリック体)の角度は度数で指定します。一般的なイタリック体の角度は12°です。もし、テキストに斜体をかけたくなければ 0 を指定することもできます。
デフォルトでは italicsAngle の値は 0 となっています。
斜体を掛ける時に、グラフィックカードのフォントデータが、リフレッシュさせられるので処理が幾分遅くなることに注意して下さい。
TextRenderer で、非斜体、斜体両方とも用意しなければいけない時、一番良い方法は、 TextRenderer から作る方法です。
例:
TextRenderer renderer( ... );
// テキストに12°の斜体をかけます。 (一般的に用いられる角度) //
renderer.SetItalics( 12 );
// もう斜体を掛ける必要がないなら、角度に0を指定しておきます。//
renderer.SetItalics( 0 );
■GetItalics ( 斜体の角度を取得 )
int GetItalics() const;
テキストにかけられている斜体の角度を取得。
斜体(イタリック体)の角度は度数で返ります。
例:
TextRenderer renderer( ... );
// テキストにかけられている斜体の角度を取得。 //
int italicsAngle = renderer.GetItalics();
■Width ( テキストの幅を取得 )
int Width( const std::string &text ) const;
描画された TextRenderer の幅を返します。width はピクセル単位。
注意:TextRendererのような関数では、 文字列変数への参照渡しをする必要があります。従って、この関数に渡す為に、あらかじめテキストを入れる変数を別に用意しておかなければいけません。
例:
TextRenderer renderer( ... );
String text = "Some text";
// テキストの幅を得る//
int textWidth = renderer.Width( text );
■Height ( テキストの高さを取得 )
int Height( const std::string &text ) const;
描画された TextRenderer の高さを返します。height はピクセル単位。
注意:TextRendererのような関数では、 文字列変数への参照渡しをする必要があります。従って、この関数に渡す為に、あらかじめテキストを入れる変数を別に用意しておかなければいけません。
例:
TextRenderer renderer( ... );
String text = "Some text";
// テキストの高さ を得る //
int textHeight = renderer.Height( text );
■FirstLineWidth ( テキストの一行目の幅を取得 )
int FirstLineWidth( const std::string &text ) const;
この関数は、複数行の文字列として描画されたTextRendererの 最初の一行の幅を返します。width はピクセル単位。
この関数 一行あるいは、複数行のテキストを渡した場合、最初の一行目の幅を返します。
注意:TextRendererのような関数では、 文字列変数への参照渡しをする必要があります。従って、この関数に渡す為に、あらかじめテキストを入れる変数を別に用意しておかなければいけません。
例:
TextRenderer renderer( ... );
String text = "First line¥nSecond line¥nThird line";
//テキストの一行目の幅を得る ("First line") //
int textWidth = renderer.FirstLineWidth( text );
■FirstLineHeight ( テキストの一行目の高さを取得 )
int FirstLineHeight( const std::string &text ) const;
この関数は、複数行の文字列として描画されたTextRendererの 最初の一行の高さを返します。height はピクセル単位。
この関数 一行あるいは、複数行のテキストを渡した場合、最初の一行目の高さを返します。
注意:TextRendererのような関数では、 文字列変数への参照渡しをする必要があります。従って、この関数に渡す為に、あらかじめテキストを入れる変数を別に用意しておかなければいけません。
例:
TextRenderer renderer( ... );
String text = "First line¥nSecond line¥nThird line";
// テキストの一行目の高さを得る ("First line") //
int textHeight = renderer.FirstLineHeight( text );
■IsValid ( TextRendererが使用可能か調べる )
bool IsValid();
TextRendererが使用可能( フォントが読込みされているか、あるいは破棄されていない )なら true を返します。
もし、 TextRenderer にフォントがまだ読込まれていなかったり Destroy()メソッドが呼ばれて 無効になっていたら、 IsValid() はfalse を返します。
例:
TextRenderer globalTextRenderer;
// globalTextRendererが使用できる準備がなされているかどうかをチェック(現時点では、できていない) //
if( globalTextRenderer.IsValid() == false ) {
allegro_message( "globalTextRenderer isn't loaded yet!" );
}
Advanced functions
2■GetFace ( Glyph Keeper の フォントフェイスを返す)
GLYPH_FACE *GetFace() const;
OpenLayer では Glyph Keeper のフォントフェイス は必要ありませんが、ユーザーが使うかもしれないのでこの関数が用意されています。
返された フォントフェイスは、const ではなく、コピーでもないことに注意してください。この理由は、Glyph Keeper ライブラリ が
GLYPH_FACE の const をサポートしていないためです。
例;
TextRenderer renderer( ... );
// Glyph Keeper の フォントフェイスを得る //
GLYPH_FACE *face = renderer.GetFace();
2■SendToGPU ( フォントのテクスチャと、ジオメトリ情報をグラフィックカードに転送します。)
void SendToGPU();
フォントのテクスチャと、ジオメトリ情報をグラフィックカードに転送します。
ユーザーがTextRendererをロードするときに、OpenLayerが自動的にSendToGPU関数を呼ぶため、通常、あなたはこの関数を使う要はありません。
しかしながら、フォントデータがGPU側にある時に色々な制御がしたければ、この関数を使用することができます。
例;
TextRenderer renderer( ... );
// フォント情報を グラフィックカード に転送 //
renderer.SendToGPU();
2■UnloadFromGPU ( フォントのテクスチャと、ジオメトリ情報をグラフィックカードからアンロードします。)
void UnloadFromGPU();
フォントのテクスチャと、ジオメトリ情報をグラフィックカードからアンロードします。
ユーザーがTextRendererを破棄するときに、OpenLayerが自動的にデストラクタと Destroy() -メソッドを呼ぶため、通常、あなたはこの関数を使う要はありません。
しかしながら、フォントデータがGPU側にある時に色々な制御がしたければ、この関数を使用することができます。
注意:この関数を呼べばTextRendererが無効になりますが、すべてのフォントリソースがアンロードされるわけではありません。
例;
TextRenderer renderer( ... );
// フォント情報を グラフィックカードから アンロードします。 //
renderer.UnloadFromGPU();
2■UseAutoDelete ( プログラム終了時にTextrnderを自動的に破棄するかどうかを指定します。)
void UseAutoDelete();
プログラム終了時にTextrndererを自動的に破棄するかどうかを指定します。
動的に割り当てられたTextRenderers をプログラム終了時に自動的に破棄させたい場合に、この関数が使えます。なお、動的に割り当てられたTextRenderers に対してのみ、
この関数を呼ばなければいけません。
例;
[ Transforms]スクリーン全体の配置および色、変形
(このクラスの古い名前はScreenで、互換性の理由から OpenLayer 1.8 から変更されました。
今のところ OpenLayer.hppを含む OL_USE_SCREEN_ALIAS を前に定義することによって古い名前を使用することもできる。)
座標の変形および色チャネルが オブジェクトは 変形がセットされた後に描画されたオブジェクトだけに適用されることに注目しなさい。
色合いは、一方では、RefreshScreen が呼出されるまで効果がある。 また、常にすべての座標単位はピクセル、角度は、ラジアンで指定する。
上級者向け: 元になる変形行列がスタックで貯えられることに注目しなさい。
Member functions
■SetPosition ( スクリーンコンテンツ全体の位置をセット )
static void SetPosition( float x, float y );
スクリーンコンテンツの位置をセットします。デフォルトでは、x = 0.0, y = 0.0 となっています。
この関数は、 スクロール処理を実装するために使うことができますが、スクリーン外に描画されたオブジェクトは、グラフィックカード に送られても捨てられるでしょう。
例:
// スクリーン コンテンツを x = 200.0, y = 100.0 の位置に配置//
Transforms::SetPosition( 200.0, 100.0 );
// 元の位置に、スクリーンを戻します //
Transforms::SetPosition( 0.0, 0.0 );
■SetRotation ( スクリーンコンテンツ全体を回転 )
static void SetRotation( float angle );
スクリーンコンテンツを回転させます。角度は時計回りに従います。
例:
// スクリーンコンテンツを、pi/2 回転 //
// (スクリーンを時計回りに90°回転 ) //
Transforms::SetRotation( AL_PI/2 );
// 回転をやめる //
Transforms::SetRotation( 0.0 );
■SetRotationPivot ( 回転の中心座標をセットする)
static void SetRotationPivot( float pivotX, float pivotY );
スクリーンコンテンツの回転の中心座標(ピボットポイント)をセットする。デフォルトはスクリーンの中央となっています。
ヒント: プレーヤーを中心にスクリーンを回転させるには、プレイヤーの位置に ピボットポイントをセットします。
例:
// スクリーンコンテンツ 上の、 x = 300.0, y = 400.0 の座標を回転の中心にする //
Transforms::SetRotationPivot( 300.0, 400.0 );
// 回転の中心 を、スクリーンコンテンツの中央に 指定する //
Transforms::SetRotationPivot( SCREEN_W/2, SCREEN_H/2 );
■SetStretch ( スクリーンコンテンツ全体 をズームイン、ズームアウトさせる)
static void SetStretch( float xStretch, float yStretch );
スクリーン全体を 伸張します。
指定する値は、倍率が1.0 なら オリジナルと同じサイズ。0.5なら オリジナルの半分。 2.0ならオリジナルの2倍に伸張されます。
デフォルトでは、 xStretch = 1.0, yStretch = 1.0 となってます。
ヒント: フィールド全体をズームさせたりする時にこの関数を使うことができます。
例:
// オリジナルの 50% のサイズに ズームアウト //
Transforms::SetStretch( 0.50, 0.50 );
// オリジナルのサイズに戻す //
Transforms::SetStretch( 1.0, 1.0 );
■SetTintColor ( スクリーンコンテンツ全体の色調を変化)
static void SetTintColor( Rgba color );
スクリーン全体の色調を指定できます。
ヒント:スクリーン全体を夕焼けに染めたり。夜の効果を出したり、フェードイン、フェードアウト効果にも使えるかもしれません。
色のアルファの値は、色味の度合いを指定します。 0(全く染まらない)〜1.0(指定された色で満たされる) 。
例:
// スクリーン全体の色調を、 30% の濃度の赤色に変えます。 //
Transforms::SetTintColor( Rgba( 1.0, 0.0, 0.0, 0.30 ));
// 色調変化をやめる(透明にする) //
Transforms::SetTintColor( Rgba::INVISIBLE );
■ResetTransforms ( 変形をリセットし、状態を元に戻します )
static void ResetTransforms();
スクリーンコンテンツ全体にかけられたすべての変形をリセットし、デフォルトの状態に戻します。
この変形のリセットは、位置、回転、伸張に適用されます。
注意:この関数は、SetRotationPivotによって指定された 任意の回転中心座標( rotation pivot )には適用されません。
例:
// 位置、回転、伸張 がリセットされます(どんな変形もされていない) //
Screen::ResetTransforms();
■SetColorChannels ( 特定の色成分をセット)
static void SetColorChannels( Rgba cofficients );
赤、緑、青およびアルファチャンネルの係数をセットします。
デフォルトは、Rgba::WHITE (全てのチャンネルは 1.0).
例:
// 全ての赤色成分 を取り除く //
Transforms::SetColorChannels( Rgba( 0.0, 1.0, 1.0 ));
//全てを元に戻す//
Transforms::SetColorChannels( Rgba::WHITE );
■GetColorChannels ( 特定の色成分を取得)
static Rgba GetColorChannels();
色成分のチャンネルを取得します。
例:
// 色成分のチャンネルを取得します。//
Rgba channels = Transforms::GetColorChannels();
2.01■PushPlacement(スタックに、Placementを収容します)
static void PushPlacement()
スタックに、Placement(位置 , 回転、伸張)情報を収容します。なお、現在使われているアクティブなPlacementはそのまま保たれます。
スタックに収容したPlacementは、PopPlacementを使ってスタックから取り出して用いることができます。
例;
// これまで使っていたplacementの状態を、スタックに収容し、新しいものを選択する//
Transforms::PushPlacement();
// グローバル placementを設定 //
Transforms::SetPosition( x, y );
Transforms::SetRotation( alpha );
// なにかする...
// 古いフルーバル placementに復帰する //
Transforms::PopPlacement();
Blenders::Pop();
2.01■PopPlacement (スタックから、Placementを取り出します)
static void PopPlacement()
スタックから、Placementを取り出します(一番最後にスタックに入れたPlacementを取り出します)。
PushPlacementによって、スタックにいれたPlacementは、このPopPlacementによって取り出す事ができます。
例;
// これまで使っていたplacementの状態を、スタックに収容し、新しいものを選択する//
Transforms::PushPlacement();
// グローバル placementを設定 //
Transforms::SetPosition( x, y );
Transforms::SetRotation( alpha );
// なにかする...
// 古いフルーバル placementに復帰する //
Transforms::PopPlacement();
Blenders::Pop();
以下は、Canvas クラスへ移動。
■SetClipping( スクリーンのクリッピング領域をセットします)
static void SetClipping( int x, int y, int w, int h );
スクリーンのクリッピング(切り抜き)領域をセットします。
クリッピングされた領域から外れたオブジェクトは表示されません。
この関数は、例えば、2分割した画面 やミップマップ等を実装するのに使えるでしょう。
例:
// クリッピング領域を スクリーンの右半分を、 100 x 100 ピクセル分切り抜きます//
Transforms::SetClipping( SCREEN_W - 100, 0, 100, 100 );
// スクリーンの左半分の領域を 切り抜きます //
Transforms::SetClipping( 0, 0, SCREEN_W/2, SCREEN_H );
■DisableClipping ( スクリーンのクリッピングをやめる)
static void DisableClipping();
クリッピングをやめます。
Transforms::SetClipping で呼び出した クリッピング領域を無効にするために、この関数を呼び出すことができます。そして再びスクリーン全体が描画されるようになります。
例:
// クリッピング領域を無効にします。 //
Transforms::DisableClipping();
[Vec2D]ベクトル関連のクラス。**
Vec2D( float x = 0.0, float y = 0.0 )
指定した 長さを持つ2Dベクトルを作成します。
2Dベクトルのクラスは、オブジェクトから直接アクセス可能な、ベクトルのx,y 成分の値を保持します。
ベクトルクラスをオーバーロードするのに、いくつかの共通の演算子を使います。例えば、加算、減算、乗算、除算、正規化(~ -演算子)、内積( . -演算子)等です。使用方法については、例を見て下さい。
例:
// theVector という名前の、 x = 15.0 y = 20.0 の成分をもった新規ベクトルを作成する //
Vec2D theVector( 15.0, 20.0 );
// ベクトルの x成分を得る //
float x = theVector.x;
// ベクトルの y成分を得る//
float y = theVector.y;
// secondVectorという名前の x = -50.0、 y = 100.0 の成分をもった新規ベクトルを作成する //
Vec2D secondVector( -50.0, 100.0 );
// theVector と secondVector の2つのベクトル同士の 加算を行う//
Vec2D sum = theVector + secondVector;
// secondVectorの5倍の大きさの ベクトルを得る //
Vec2D biggerVector = 5.0 * secondVector;
// biggerVectorに、さらに x = 40, y = -30.5 の長さを持つ ベクトルを加算する//
biggerVector += Vec2D( 40.0, -30.5 );
// biggerVectorの正規化されたコピーを取得 //
// ( 正規化ベクトルは、 biggerVectorと、 同じ方向で、長さが 1.0のベクトル のこと。) //
Vec2D normalizedBigger = ~biggerVector;
// 2つのベクトルの内積を得る。 //
float dotProduct = theVector * secondVector;
Member functions
2■GetMagnitude ベクトルの長さ(magnitude ) を得ます。
inline float GetMagnitude() const
ベクトルの長さ(magnitude ) を得ます。
例:
// theVector という名前のx = 15.0 、 y = 20.0 の成分をもった新規ベクトルを作成する //
Vec2D theVector( 15.0, 20.0 );
// ベクトルの長さを得る //
float magnitude = theVector.GetMagnitude();
2■GetAngle ベクトルの角度 を得ます。
inline float GetAngle() const
ベクトルの角度 を得ます。
例:
// theVector という名前の x = 15.0 、 y = 20.0 の成分をもった新規ベクトルを作成する //
Vec2D theVector( 15.0, 20.0 );
// ベクトルの角度を得る //
float angle = theVector.GetAngle();
2■Normalized ベクトルの正規化されたコピー を得ます。
inline Vec2D Normalized() const
ベクトルの正規化されたコピー を得ます。
正規化ベクトルは、 同じ方向で、長さが 1.0のベクトル のこと。この関数の代わりに、 ~ -演算子を使うこともできます。
例:
// theVector という名前の x = 15.0 、 y = 20.0 の成分をもった新規ベクトルを作成する //
Vec2D theVector( 15.0, 20.0 );
// ベクトルの 正規化 された コピーを得ます //
Vec2D normalizedCopy = theVector.Normalized();
// ~ -演算子を使って同じことをします。 //
Vec2D normalizedCopy = ~theVector;
Advanced functions
2■GetMagnitudeSquared(ベクトルの平方された大きさを返す。)
inline float GetMagnitudeSquared() const
ベクトルの平方された大きさを返します。
例;