DXライブラリで、画像ハンドルに対してアルファ値を設定するには&構造体で特定の要素にまとめて数値を代入するには

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぱんにゃあ

DXライブラリで、画像ハンドルに対してアルファ値を設定するには&構造体で特定の要素にまとめて数値を代入するには

#1

投稿記事 by ぱんにゃあ » 12年前

DXライブラリの画像表示は
DrawGraph(x,y,GrHandle,1);
ですが、このGrHandleに対してアルファ値を設定する方法はあるでしょうか。

いまやっている方法は、

コード:

void DrawGraph(int x,int y,int GrHandle,int TransFlag,int BlendMode,int alpha){

    SetDrawBlendMode(BlendMode, alpha) ;
    DrawGraph(x,y,GrHandle,TransFlag);
    SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 255) ;

}
というオーバーロード関数を作り、表示の都度SetDrawBlendModeをしています。
しかしこの方法は、画像ごとにアルファ値を保存しておく変数を作っていなければいけないので画像を増やしたときにアルファ値用変数も一緒に作らなければいけなくなり煩雑になるのと、毎回SetDrawBlendModeのON→OFFをしているので冗長なのではないかという不安があります。

画像ハンドルに対してアルファ値の設定ができれば、通常のDrawGraphで半透明表示ができるかもしれないと思ってます。


あと、2つ目の質問です。
例えばこんな構造体で、↓

コード:

struct GameDatas{

    struct GameGraphics{
			
        struct Menu{

            int bg;
            int bgb;
            int bgs;
            int chars_g_r[2][6];

        }menu;
		
    }pic,alpha;
	
}data;
data.alpha.~以降のメンバ全てに特定の数値(255のような)を一括代入するにはどうしたらいいですか?

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: DXライブラリで、画像ハンドルに対してアルファ値を設定するには&構造体で特定の要素にまとめて数値を代入するには

#2

投稿記事 by h2so5 » 12年前

ぱんにゃあ さんが書きました: しかしこの方法は、画像ごとにアルファ値を保存しておく変数を作っていなければいけないので画像を増やしたときにアルファ値用変数も一緒に作らなければいけなくなり煩雑になるのと、毎回SetDrawBlendModeのON→OFFをしているので冗長なのではないかという不安があります。
画像ハンドルとアルファ値をまとめた構造体をつくればいいと思います。
例え画像ハンドル自体にアルファ値を設定できても、内部的にはブレンドモードの切り替えを行うことに変わりはありません。
ぱんにゃあ さんが書きました: data.alpha.~以降のメンバ全てに特定の数値(255のような)を一括代入するにはどうしたらいいですか?
できないので地道に代入するしかないです。

あと Datas という複数形は存在しません。Data が複数形なので。

ぱんにゃあ

Re: DXライブラリで、画像ハンドルに対してアルファ値を設定するには&構造体で特定の要素にまとめて数値を代入するには

#3

投稿記事 by ぱんにゃあ » 12年前

h2so5 さんが書きました:
ぱんにゃあ さんが書きました: しかしこの方法は、画像ごとにアルファ値を保存しておく変数を作っていなければいけないので画像を増やしたときにアルファ値用変数も一緒に作らなければいけなくなり煩雑になるのと、毎回SetDrawBlendModeのON→OFFをしているので冗長なのではないかという不安があります。
画像ハンドルとアルファ値をまとめた構造体をつくればいいと思います。
例え画像ハンドル自体にアルファ値を設定できても、内部的にはブレンドモードの切り替えを行うことに変わりはありません。
ぱんにゃあ さんが書きました: data.alpha.~以降のメンバ全てに特定の数値(255のような)を一括代入するにはどうしたらいいですか?
できないので地道に代入するしかないです。

あと Datas という複数形は存在しません。Data が複数形なので。
ふむふむ・・・ Data"s"ではないのですね>< 訂正します。
画像ハンドルとアルファ値をまとめた構造体は、上に提示してある構造体のpic,alphaですでに作ってあります。

構造体の変数を任意の値で一括初期化は、方法を調べたところmemsetを使えば「0での初期化」はできるようです。

memset(&data.alpha ,0, sizeof(data.alpha) );

しかし、0のところを255で初期化すると、中身のint型変数には0xffffffffが入ってしまいます(memsetの内部で第一引数がchar*型にキャストされてしまうため)。
そこで自作関数vlmemsetというものを作ってみたのですが(memsetを元にしてます)、

コード:

void *vlmemset(void *str, int c, size_t num )
{
    //memsetと同じ使い方で使う
	//memsetと比べ、第二引数が255( 0xff )までの値で数値初期化ができるようになった
	//variable length memsetを縮めて vlmemsetに

	unsigned char *ptr = (unsigned char *)str;
	unsigned char in = c;

	while(num--){

    *ptr = in;	//現在のptrのアドレスが示す値に、第二引数で指定された数値を代入
		*ptr++;	//1バイトずらす

		//現在のptrが示しているメンバなどの型をsizeof(num)で調べて、
		//int型(4バイト)なら00 00 00 xx にするために00で上書きしながら3回ポインタをずらす
		//char型(1バイト)なら、sizeof(*ptr) - 1 = 0 になるためforループせずに次のメンバなどへ
		for(int i=0;i< sizeof(num) - 1 ;i++){
			*ptr = 0;
			*ptr++;
		}
	}
	return str;
}
この関数で初期化すると、構造体の変数内には指定した値(255)が入るようになりました。が、他の一部のグローバル変数(int型)の値までも書き換えてしまうのです。
既存のmemsetでは起こらなかった問題なのでこの関数に問題があるとは思うのですが、何度も挙動を確認しても原因が特定できていません。


現在のptrが示しているメンバなどの型をsizeof(num)で調べる、ということはやはりできないのでしょうか。
それとも、そもそもこういう処理はできないのでしょうか。

ぱんにゃあ

Re: DXライブラリで、画像ハンドルに対してアルファ値を設定するには&構造体で特定の要素にまとめて数値を代入するには

#4

投稿記事 by ぱんにゃあ » 12年前

すいません、一部訂正します><
コード内の
//char型(1バイト)なら、sizeof(*ptr) - 1 = 0 になるためforループせずに次のメンバなどへ


//char型(1バイト)なら、sizeof(num) - 1 = 0 になるためforループせずに次のメンバなどへ
です。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前
住所: 東京
連絡を取る:

Re: DXライブラリで、画像ハンドルに対してアルファ値を設定するには&構造体で特定の要素にまとめて数値を代入するには

#5

投稿記事 by h2so5 » 12年前

そもそもsizeof(num)ってsizeof(size_t)と同じなのでメンバに関係なく固定ですよね。
実行時にメンバの情報を得ることはできないので、初期化を自動化したいなら思いつくのは、

1) C++ のコンストラクタを使う
2) 初期化コードを生成するスクリプトを書く

のどちらかだと思います。

閉鎖

“C言語何でも質問掲示板” へ戻る