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)で調べる、ということはやはりできないのでしょうか。
それとも、そもそもこういう処理はできないのでしょうか。