クラスまみれのゲームプログラミング入門

20:スプライトのアルファブレンド

 スプライトに対して透明度を適用したいのなら、ID3DXSprite::Draw()において、重ね合わせるカラー情報における透過度情報の値を変更するだけです。


hpのデスクトップPC お買い得キャンペーン情報!!

 C++には引数の指定を省略したとき、自動的に特定の値を引数にしてくれる機能が備わっています(デフォルト引数)。デフォルト引数は、引数リストの後ろに配置することができますが、先頭や途中だけに配置するようなことはできません。

default.cpp
#include <iostream>
using namespace std;

// デフォルト引数の例
void function(int x = 10)
{
	cout << x << endl;
}

// デフォルト引数は複数指定できる
void function2(int x = 5, int y = 10)
{
	cout << x << endl;
	cout << y << endl;
}

// 以下は間違いの例
/*
void function3(int x = 5, int y)
{
}

void function4(int x, int y = 5, int z)
{
}
*/

void main(void)
{
	function(20);	// 画面には「20」と表示される
	function();		// デフォルト引数の「10」が表示される
	function2(0);	// 「0\n10」が表示される
}

 透明度を頻繁に指定することはそうあることではありませんので、この透明度をデフォルト引数で宣言することにしましょう。変更結果は以下のようになります。

Sprite.h
#pragma once

#include "Texture.h"

class CSprite : public CGameObject
{
private:
	/* 省略 */

public:
	/* 省略 */
	
	// 完全不透明の値をアルファ値のデフォルト引数として追加
	void Draw(float x, float y, int alpha = 255);
};

Sprite.cpp
void CSprite::Draw(float x, float y, int alpha)
{
	pSprite->Begin(NULL);	// スプライト描画開始

	D3DXVECTOR3 vec;	// スプライトの描画位置を格納
	vec.x = x;		// x座標
	vec.y = y;		// y座標
	vec.z = 0.0f;	// z座標(奥行きは0にする)

	pSprite->Draw(
		texture, NULL, NULL, &vec,
		0x00FFFFFF | ((BYTE)alpha << 24)	// アルファ値を合成する
		);

	pSprite->End();			// スプライト描画終了
}