HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2013
1102
名無しArtlet2Dを使ってアルファチャネル部分を透明化する書き方2解決


名無し

リンク

2013/11/2(Sat) 05:21:51|NO.57945

今までは色255,0,255を透明色でgmode4を使っていたのですが、限界を感じます
ロードした画像のアルファ部分を透明化する方法を教えてください



この記事に返信する


暇人

リンク

2013/11/2(Sat) 13:07:51|NO.57954

alCreateImageByFileで読み込んでalCopyImageToScreenでHSPスクリーンバッファにコピー

#include "a2d.hsp" //Artlet2DのバッファID0に透明度付き画像読み込み alCreateImageByFile 0, dir_exe+"\\sample\\hsp3dish\\hsplogo8.png" repeat redraw 0 color 0,80,80 boxf //Artlet2DのバッファID0からHSPスクリーンID0にコピー alCopyImageToScreen 0, 0, 300, 200, 80, 50,0,50*(cnt\16) redraw 1//表画面に反映 await 50 loop
でも結構重いから用途によっては厳しい
picload "ファイル.png",1
で表示するよりは軽いけど・・・

a2dの描画じゃ速度的に厳しい時用(加工にa2dの命令を使用)
アルファ付き画像をgmode7用に加工してHSPバッファに入れるモジュール

#include "a2d.hsp" //必ず#include "a2d.hsp"の後に挿入 #module //アルファ値付き画像をgmode7で使えるようにidで指定したバッファへ指定サイズ毎に画像を左、アルファ値(グレースケール)を右にして全て縦に並べる //gmode7picload fname, id, sizex, sizey // fname "ファイルネーム" // id = 読み込むHSPバッファID // sizex = 画像が複数キャラからを含んでる時に1キャラのXサイズ(celdivにも設定される) // sizey = 画像が複数キャラからを含んでる時に1キャラのYサイズ(celdivにも設定される) // cpx = celput時の中心X座標 // cpy = celput時の中心Y座標 //statに分割数が返る(celput用の分割数では無い) #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 {_sizex=alGetHeight()}else{_sizey=sizey} divx=(alGetWidth()/_sizex) divy=(alGetHeight()/_sizey) buffer id,_sizex*2,divx*divy*_sizey 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 //モジュールここまで sizex=80 sizey=50 id=1 gmode7picload dir_exe+"\\sample\\hsp3dish\\hsplogo8.png",id,sizex,sizey div=stat repeat redraw 0 color 200,80,80 boxf gmode 7,sizex,sizey pos 300, 200 gcopy id,0,sizey*(cnt\div) //縦に並んでるのでコピー元の左上Y座標を変更 pos 300, 200+sizey celput id,(cnt\div)*2 //gmode 7用にしたバッファが透明度用に横が二倍になるので分割画像No.を2倍して指定する必要がある redraw 1//表画面に反映 await 50 loop

gmode7のコピーでも重い場合はOpenGLやDirect3D等でハードウェアアクセラレーションを使うしかない



名無し

リンク

2013/11/3(Sun) 01:20:18|NO.57959

応用までわざわざありがとうございます。
はうどうぇあーあくせられーしょんですか
また知らない世界の扉を開くのですね、真理が見えてしまう



ONION software Copyright 1997-2023(c) All rights reserved.