|
|
2018/3/3(Sat) 22:50:45|NO.82613
もともと透過情報を持っているpng画像の透過のさせ方がよくわかりません。
一応調べたのですがうまくいきませんでしたどなたか教えてください。
|
|
2018/3/4(Sun) 00:30:45|NO.82614
HSP標準命令では透過情報は無視されます。
ただほとんど使ったことが無いのでうろ覚えですが
Artlet2Dで透過情報持ちの画像を使うことが出来たような気がします。
もしくは透過PNG対応のプラグイン利用ですかね。
|
|
2018/3/4(Sun) 04:40:27|NO.82615
標準命令の場合はpicload でモード1を指定した時だけ有効
picloadなのでgcopyのような一部だけ表示とかは出来ない
color 0,60,60
boxf
pos 50,16
picload dir_exe+"\\hsptv\\hsptv_img.png",1
描画速度が必要な場合はhgimg系やhsp3dish等を使う
HSPに付属されてない物でもDirectX系のプラグインで透過PNG使えるのはあったと思う
|
|
2018/3/6(Tue) 19:00:00|NO.82642
返信が遅れて申し訳ありません。picload1を試してみたらできました。有難うございます。
ただpicload1だとループさせると透過できなくなっていく、gcopyだと縁が透過されない問題が
発生しました。これに解決法は有るのでしょうか?
|
|
2018/3/6(Tue) 19:58:42|NO.82645
>ただpicload1だとループさせると透過できなくなっていく
半透明で重ね塗りしてるようなものなので
背景が書き換わってないのに再度読み込むとそうなる
あと、picloadのpngアルファ値再現は少しおかしくて
本来透明な部分も重ね塗りされる事で黒くなってしまう
(完全な透明に出来てない)
repeat
redraw 0
color 0,60,60
boxf
pos 200,200
picload dir_exe+"\\hsptv\\king_knight.png",1
redraw 1
await 16
loop
毎回背景も書き換えれば良い
|
|
2018/3/6(Tue) 23:34:16|NO.82651
gcopyを使われるのでしたら gmode 7 を活用する方法があります。
前処理として透過情報を gmode 7 対応に分離する処理が必要ですが、手軽にできるツールがあるので試してみてはいかがでしょうか。
PixelA メーカー
http://mclab.uunyan.com/dl/dl34.htm
他の方も同じようなツールを作られている方がいるので使いやすい方を選んでください。
> gcopyだと縁が透過されない問題が
gmode 2か4で使用していませんか?
2と4が透明にできるのは1色のみです。
|
|
2018/3/7(Wed) 00:04:32|NO.82654
>>暇人さん
有難うございました。表示ができました。
|
|
2018/3/7(Wed) 19:27:11|NO.82665
↓にgmode7用の画像をbufferに作るモジュールを書いたけどバグがあったので
http://hsp.tv/play/pforum.php?mode=pastwch&num=57945
修正したのを↓に
#include "a2d.hsp"
//必ず#include "a2d.hsp"の後に挿入
#module
//アルファ値付き画像をgmode7で使えるようにidで指定したバッファへ指定サイズ毎に画像を左、アルファ値(グレースケール)を右にして全て縦に並べる
//gmode7picload fname, id, sizex, sizey
// fname "ファイルネーム"
// id = 読み込むHSPバッファID
// sizex = 画像が複数キャラからを含んでる時に1キャラのXサイズ(celdivにも設定される)[省略か0の場合画像サイズが使われる]
// sizey = 画像が複数キャラからを含んでる時に1キャラのYサイズ(celdivにも設定される)[省略か0の場合画像サイズが使われる]
// cpx = celput時の中心X座標
// cpy = celput時の中心Y座標
//statに分割数が返る(celput用の分割数では無い)
//celputを使用する時の分割画像Noは 0からの偶数 を使用してください
//読み込んだ画像のサイズを知りたいときはalGetWidth()、alGetHeight()を使用
#deffunc gmode7picload str fname,int id,int sizex,int sizey,int cpx,int cpy
gsel_bak=ginfo_sel
alCreateImageByFile 99, fname
if sizex<=0 {_sizex=alGetWidth()}else{_sizex=sizex}
if sizey<=0 {_sizey=alGetHeight()}else{_sizey=sizey}
divx=(alGetWidth()/_sizex)
divy=(alGetHeight()/_sizey)
buffer id,_sizex*2,divx*divy*_sizey
color
boxf
alResetCopyMode
repeat divx*divy
alCopyImageToScreen 99, id, 0, _sizey*cnt, _sizex,_sizey,_sizex*(cnt\divx),_sizey*(cnt/divx) //通常の画像を縦に並べてコピー
loop
if length(cmatrix)=1 {; アルファチャネルをグレースケールに変換設定値
cmatrix(MAT_R) = 0.0, 0.0, 0.0, 1.0, 0.0
cmatrix(MAT_G) = 0.0, 0.0, 0.0, 1.0, 0.0
cmatrix(MAT_B) = 0.0, 0.0, 0.0, 1.0, 0.0
cmatrix(MAT_A) = 0.0, 0.0, 0.0, 0.0, 1.0
}
alCopyModeColorMatrix cmatrix //アルファチャネルをグレースケールに変換設定
alCopyImageToImage 99, 99, 0,0,alGetWidth(), alGetHeight(), 0, 0 //コピー(アルファチャネルがグレースケール画像になる)
alResetCopyMode //変換設定を元に戻す
repeat divx*divy
alCopyImageToScreen 99, id, _sizex, _sizey*cnt, _sizex,_sizey,_sizex*(cnt\divx),_sizey*(cnt/divx) //グレースケールを通常画像の右に縦に並べてコピー
loop
celdiv id,_sizex,_sizey,cpx,cpy
gsel gsel_bak
return divx*divy
#global
//モジュールここまで
p_id=1
gmode7picload dir_exe+"\\hsptv\\king_knight.png",p_id,64
title "読み込んだ画像サイズ X="+alGetWidth()+" Y="+alGetHeight()
repeat
redraw 0
color 0,60,60
boxf
pos 200,200
gmode 7 //gmode7picload内でceldivの設定をしてるのでcelputで描画するならコピーサイズを指定する必要は無い
celput p_id,0
pos 350,200
celput p_id,2
redraw 1
await 16
loop
直接picloadで描画した時みたいなアルファ値再現がおかしいのは無くなるし
速度的にもpicloadよりは良いと思う

| |
|
2018/3/9(Fri) 07:21:26|NO.82685
>alCopyImageToScreen 99, id, 0, _sizey*cnt, _sizex,_sizey,_sizex*(cnt\divx),_sizey*(cnt/divx) //通常の画像を縦に並べてコピー
完全透明ならいいけどこれだと左側の画像はアルファチャネルが適用されて半透明の部分は背景と混ざると思うけど
こんな感じであらかじめアルファチャネル無効にしとかないと
cmatrix(MAT_R) = 1.0, 0.0, 0.0, 0.0, 0.0
cmatrix(MAT_G) = 0.0, 1.0, 0.0, 0.0, 0.0
cmatrix(MAT_B) = 0.0, 0.0, 1.0, 0.0, 0.0
cmatrix(MAT_A) = 0.0, 0.0, 0.0, 0.0, 1.0
|
|
2018/3/9(Fri) 19:20:19|NO.82689
あ、そう言えばそうですね
gmode7用の右側の画像がα値適用された画像になってしまってた・・・
修正版↓
//必ず#include "a2d.hsp"の後に挿入
#module
//アルファ値付き画像をgmode7で使えるようにidで指定したバッファへ指定サイズ毎に画像を左、アルファ値(グレースケール)を右にして全て縦に並べる
//gmode7picload fname, id, sizex, sizey
// fname "ファイルネーム"
// id = 読み込むHSPバッファID
// sizex = 画像が複数キャラからを含んでる時に1キャラのXサイズ(celdivにも設定される)[省略か0の場合画像サイズが使われる]
// sizey = 画像が複数キャラからを含んでる時に1キャラのYサイズ(celdivにも設定される)[省略か0の場合画像サイズが使われる]
// cpx = celput時の中心X座標
// cpy = celput時の中心Y座標
//statに分割数が返る(celput用の分割数では無い)
//celputを使用する時の分割画像Noは 0からの偶数 を使用してください
//読み込んだ画像のサイズを知りたいときはalGetWidth()、alGetHeight()を使用
#deffunc gmode7picload str fname,int id,int sizex,int sizey,int cpx,int cpy
gsel_bak=ginfo_sel
alCreateImageByFile 99, fname
if sizex<=0 {_sizex=alGetWidth()}else{_sizex=sizex}
if sizey<=0 {_sizey=alGetHeight()}else{_sizey=sizey}
divx=(alGetWidth()/_sizex)
divy=(alGetHeight()/_sizey)
buffer id,_sizex*2,divx*divy*_sizey
cmatrix(MAT_R) = 1.0, 0.0, 0.0, 0.0, 0.0
cmatrix(MAT_G) = 0.0, 1.0, 0.0, 0.0, 0.0
cmatrix(MAT_B) = 0.0, 0.0, 1.0, 0.0, 0.0
cmatrix(MAT_A) = 0.0, 0.0, 0.0, 0.0, 1.0
alCopyModeColorMatrix cmatrix
repeat divx*divy
alCopyImageToScreen 99, id, 0, _sizey*cnt, _sizex,_sizey,_sizex*(cnt\divx),_sizey*(cnt/divx) //通常の画像を縦に並べてコピー
loop
cmatrix(MAT_R) = 0.0, 0.0, 0.0, 1.0, 0.0
cmatrix(MAT_G) = 0.0, 0.0, 0.0, 1.0, 0.0
cmatrix(MAT_B) = 0.0, 0.0, 0.0, 1.0, 0.0
cmatrix(MAT_A) = 0.0, 0.0, 0.0, 0.0, 1.0
alCopyModeColorMatrix cmatrix //アルファチャネルをグレースケールに変換設定
repeat divx*divy
alCopyImageToScreen 99, id, _sizex, _sizey*cnt, _sizex,_sizey,_sizex*(cnt\divx),_sizey*(cnt/divx) //グレースケールを通常画像の右に縦に並べてコピー
loop
alResetCopyMode //一応変換設定を元に戻しとく
celdiv id,_sizex,_sizey,cpx,cpy
gsel gsel_bak
return divx*divy
#global

| |
|