|
|
2007/2/9(Fri) 12:04:46|NO.5534
タイトルの通り、例えば「あ」という文字があるとすると
「あ」の上の方は青っぽくて下の方は白っぽいのようなグ
ラデーション文字は作れるでしょうか?
できればゲームで扱える方法でお願いします。
|
|
2007/2/9(Fri) 15:03:53|NO.5538
バッファに黒で文字を描いて、グラデーションの上にgcopy(黒を透過)で貼り付けるのが手っ取り早いです。
ただ、背景が変わったりする時には面倒かもしれません
|
|
2007/2/9(Fri) 22:15:36|NO.5547
gmode 7のピクセルアルファブレンドコピーを使うのもいいかもしれない
//モジュール
#module "grdmes"
#define global TEMP_SCREENID 100 ;作業用スクリーンバッファID(指定されない時)
#define rgb_bak(%1,%2,%3) rbak=ginfo(16):gbak=ginfo(17):bbak=ginfo(18)
#define rgb_set(%1=rbak,%2=gbak,%3=bbak) color %1,%2,%3
/* gmes_set g_mes がパラメータ省略可能な命令*/
//「作業用のスクリーンにグラデーション設定($RRGGBB)」
//gmes_set グラデーション上の色, 下の色, 色が変化するライン数, フォント名前, フォントサイズ, フォントスタイル, 作業用スクリーンバッファID
#define global gmes_set(%1=$ffffff,%2=0,%3=1,%4="",%5=18,%6=0,%7=TEMP_SCREENID) _gmes_set (%1),(%2),(%3),(%4),(%5),(%6),(%7)
#deffunc _gmes_set int scol,int ecol,int lin,str fnam,int siz,int fstyle,int tmpid
SELID=ginfo_sel
rgb_bak
TS_ID=tmpid
sr=scol>>16 :sg=(scol>>8)&$ff :sb=scol&$ff
er=ecol>>16 :eg=(ecol>>8)&$ff :eb=ecol&$ff
if lin<1 {size=siz:_lin=1}else{size=siz/lin:_lin=lin}
r=double(er-sr)/siz :g=double(eg-sg)/siz :b=double(eb-sb)/siz
if r<0.0 {_sr=er:_er=sr:dr=255}else{_sr=sr:_er=er:dr=0}
if g<0.0 {_sg=eg:_eg=sg:dg=255}else{_sg=sg:_eg=eg:dg=0}
if b<0.0 {_sb=eb:_eb=sb:db=255}else{_sb=sb:_eb=eb:db=0}
buffer TS_ID,640,480,0 ;ここをscreen に変えれば実際の動作が分かりやすい
if fnam!"" {font fnam,siz,fstyle}
color 0,0,0 :boxf
repeat 240/siz
cnty=cnt*siz
repeat size
cntcol=cnt*_lin
color limit(r*cntcol+dr,_sr,_er),limit(g*cntcol+dg,_sg,_eg),limit(b*cntcol+db,_sb,_eb)
boxf 0,cnty+cntcol,320,cnty+cntcol+_lin
loop
loop
gsel SELID
rgb_set
return
//「現在アクテブなスクリーンにグラデーション文字を描画」
//g_mes 文字列, x座標, y座標, 作業用ID
#define global g_mes(%1="",%2=$0fffffff,%3=$0fffffff,%4=TS_ID@grdmes) _g_mes (%1),(%2),(%3),(%4)
#deffunc _g_mes str mesbf,int px,int py,int tmpid
rgb_bak
SELID=ginfo_sel
if px=$0fffffff {cpx=ginfo(22)}else{cpx=px} ;$0fffffffの時は pos指定が無いので現在のカレントポジションを使用
if py=$0fffffff {cpy=ginfo(23)}else{cpy=py}
gsel tmpid
color 0,0,0 :boxf 320,0,640,240 :boxf 0,240,320,240
color 255,255,255 :pos 320,0 :mes mesbf ;加工前の描画
addpx=ginfo(22)-320 :addpy=ginfo(23)
gmode 7,320,240 :pos 0,240 :gcopy tmpid,0,0,320,240 ;加工後の描画
gsel SELID
gmode 2,320,240 :pos cpx,cpy :gcopy tmpid,0,240,320,240 ;加工した文字列を表示
pos cpx+addpx,cpy+addpy
rgb_set
return
#global
//モジュールここまで
screen 0,640,480,0
color 20,80,80:boxf:color 255,255,255
a="あいうえお\nかきくけこ"
FONTNAME="MS 明朝"
FONTSIZE=32
FONTSTYLE=1+2+16
//省略時 グラデは上$ff_ff_ff下0で一ラインづつ、フォントは変更しません。 作業用スクリーンIDは100
gmes_set $0000ff,$ffffff,2,FONTNAME,FONTSIZE,FONTSTYLE,100
//省略時 現在のカレントポジションを使用、最後にgmes_setで使用した作業用スクリーンを使用
g_mes a,150,150,100
gmes_set ,,,,,,101
g_mes a
g_mes a,,,100
mes a
gmes_set $ffffff,$0000ff,6,FONTNAME,48,FONTSTYLE
font FONTNAME,48,FONTSTYLE
pos 49,49:color 200,200,200
mes a
pos 52,52:color
mes a
g_mes a,50,50
| |
|
2007/2/9(Fri) 22:23:19|NO.5548
主要部分を抜き出すとこな感じ
このまま使うとコピーに無駄が出るから
その変は色々考えるしかないかな・・・
screen 1,640,480,0 :color 0,0,0 :boxf
repeat 240/18
cnty=cnt*18
repeat 18
color limit(cnt*255/18,0,255),limit(cnt*255/18,0,255),255
line 0,cnty+cnt,320,cnty+cnt
loop
loop
a="あいうえお\nかきくけこ\nABCDEFGabcdefg\nABCDEFGabcdefg"
color 0,0,0 :boxf 320,0,640,240 :boxf 0,240,320,240
color 255,255,255 :pos 320,0 :mes a
gmode 7,320,240 :pos 0,240 :gcopy 1,0,0,320,240
screen 0,640,480,0
gmode 2,320,240 :pos 0,0 :gcopy 1,0,240,320,240
|
|
2007/2/10(Sat) 00:26:58|NO.5551
NO.5547ので間違いが有りました。
> if r<0.0 {_sr=er:_er=sr:dr=255}else{_sr=sr:_er=er:dr=0}
> if g<0.0 {_sg=eg:_eg=sg:dg=255}else{_sg=sg:_eg=eg:dg=0}
> if b<0.0 {_sb=eb:_eb=sb:db=255}else{_sb=sb:_eb=eb:db=0}
の部分を
if r<0.0 {_sr=er:_er=sr:dr=_er}else{_sr=sr:_er=er:dr=_sr}
if g<0.0 {_sg=eg:_eg=sg:dg=_eg}else{_sg=sg:_eg=eg:dg=_sg}
if b<0.0 {_sb=eb:_eb=sb:db=_eb}else{_sb=sb:_eb=eb:db=_sb}
に、してください。
(グラデーションの各色0か255からしか旨くいかなくなってた)
|
|
2007/2/10(Sat) 02:32:17|NO.5556
こんさん、KIMUさん、どうもありがとうございます。
モジュールまで作ってくれてどうもありがとうございます。
スクリいろいろといじって勉強になりました。
|
|