ページ 11

ボスの位置を表す赤い部分を自機が近づいたら薄くする計算式

Posted: 2010年1月14日(木) 22:43
by kai
龍神録についてです。
添付した東方の画像なんですが、
これはボスのx軸の場所によって赤い画像も、同じx軸の場所に位置が動きます。
本題なんですが、
このボスの位置を表す赤い部分を自機が近づいたら薄くするようにしたいのですが、
計算が弱くて、どのような計算式を書けばいいのか分からなくて困ってます。
SetDrawBlendMode(DX_BLENDMODE_ALPHA,ここの計算式が分からない); //αブレンドする

boss.dxとch.xが関わってきて、
ボスのx軸と自機のx軸が一緒の位置ならばαブレンドの値は128くらいの薄さに。

中間の薄さ

ボスのx軸と自機のx軸の差が+-100以上ならばαブレンドの値は255。

みたいな感じにしたいのですが、出来ますでしょうか?
誰か分かる方がいましたら助けてください。よろしくお願いします。 画像

Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法

Posted: 2010年1月14日(木) 23:12
by ひよこ
薄くするじゃなくて透明ってことですか?
透明だったらこんな感じでいいと思います。あくまでも参考に。
真ん中が一番薄くなるように勝手なこともしてます。(見た目が汚いと思います。
int x=ボスのx軸-自機のx軸;
int alpha=0;
if(x>0 x<100){
    if(x<=49){ 
        alpha=255-205/50*(x+1); 
    }
    if(x>=51){ 
        alpha=255-205/(x-1)*(50); 
    }
    if(x==50){ 
        alpha=40; 
    }
}
else
alpha=255;

SetDrawBlendMode(DX_BLENDMODE_ALPHA,alpha);//αブレンドする

Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法

Posted: 2010年1月14日(木) 23:14
by ひよこ
こうすればきれいかもしれません。
if(x<=49){ 
       alpha=255-205/(x+1)*50; 
    }

Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法

Posted: 2010年1月14日(木) 23:50
by kai
ひよこさん、ありがとうございます。

ただ、これだと、自機がボスより右にいた場合、
薄くならないようですが 画像

Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法

Posted: 2010年1月15日(金) 00:10
by ひよこ
すみません。コメント付けてませんでしたね。
if(x>0 x<100){//ボスのx軸-自機のx軸が0(ぴったし)より大きくて100(boss.x+100>自機)
未満だったらということです。
よく考えたら、-100のほうは作ってませんでした。すいません。(少し工夫すればできると思います。

Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法

Posted: 2010年1月15日(金) 00:13
by ひよこ
薄くならないようですが
>>勝手に考えて、自機が真ん中?の50に来た時に一番薄くする処理になっていますので、
>>条件式や処理を逆にすればできると思います。

Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法

Posted: 2010年1月15日(金) 00:19
by SooA
こんな感じかな。

alpha = 0 ;
gap = boss_X - mychar_X ;

if( gap < 0 )
gap = 100-( 100+gap ) ;

if( gap > 0 && gap <= 100 )
alpha = 255/100*gap ; 画像

Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法

Posted: 2010年1月15日(金) 00:31
by kai
ひよこさん、SooAさん、返答ありがとうございます。
SooAさんの方法で
if( gap > 100 )
alpha = 255;
を追加したらなんとかいけました。ありがとうございます。
私はてっきり、ひよこさんのおっしゃる通りに、+の値と-の値が出てしまうので、
絶対値を出してから計算するのかなと思ったのですが、
その計算をしなくても大丈夫なんですね。
勉強になりました。ありがとうございました。

追記:
if(gap < 0)
  gap = 100 - (100 + gap);
ここで絶対値を出してるんですね。なるほど。ありがとうございました。 画像

Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法

Posted: 2010年1月15日(金) 03:43
by SooA
>を追加したらなんとかいけました
すみませんいい加減な事を書いてました…
他も訂正しときます。

alpha = 0 ;
gap = boss_X - mychar_X ;

if( gap < 0 )
gap *= -1 ;

if( gap > 0 && gap <= 100 )
alpha = 255/100*gap ;
else if( gap > 100 )
alpha = 255 ;

Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法

Posted: 2010年1月15日(金) 07:23
by light
>>ひよこ

言ってることが間違いだらけです。

Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法

Posted: 2010年1月15日(金) 17:03
by ひよこ
間違いが多いので新しい方法にしました。
真ん中(50)で255
それ以外は(x>0&&x<100)
薄くなっていくと思います。
int x=ボスのx軸-自機のx軸;
int alpha=0;
if(x<0)//マイナスだったらプラスに
x*=-1;
if(x>=0 x<=100){//+-100いないだったら
    if(x<=50){ 
       alpha=255+(x-50)*5; 
    }
    if(x>=51){ 
       alpha=255-(x-50)*5; 
    }
}
else
alpha=255;

SetDrawBlendMode(DX_BLENDMODE_ALPHA,alpha);//αブレンドする

Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法

Posted: 2010年1月16日(土) 10:56
by SooA
最小α値を設ける場合も載せておきます。

gap = boss_X - mychar_X ;
alpha = 50 ; // 最小α

if( gap < 0 )
gap *= -1 ;

if( gap > 0 && gap <= 100 )
alpha += (255-alpha)/100*gap ;
else if( gap > 100 )
alpha = 255 ;


□ひよこさん
No:46262 のソースでは残念ながらミスがありますが、
以前に拝見した時のソースと比較すると、
「ソースの見やすさ」が上達していると思いますよ。
次は処理を簡潔にして短くできないか工夫してみましょう。

※約一年ほど前にソースの書き方に付いて
書かせてもらいました。別人だったらすみません。

Re:ボスの位置を表す赤い部分を自機が近づいたら薄くする方法

Posted: 2010年1月16日(土) 11:19
by ひよこ
SooAさんもしかして間違いというのは&&が抜けてるってことですよね?
直すとif(x>=0 && x<=100){//+-100いないだったらこうなると思います。

以前に拝見した時のソースと比較すると、
「ソースの見やすさ」が上達していると思いますよ。
次は処理を簡潔にして短くできないか工夫してみましょう。

>>ありがとうございます。
>>昔はすごい見にくいソースを書いてたひよこです。
>>上の自分のソースはelse文を使えばよさそうですね。

SooAさんのソースはちゃんと、左か右の端から真ん中まで行くとalphaが減っています。
わかりやすい処理ですね。