|
|
2024/4/29(Mon) 22:34:52|NO.101642
HSP MULTIMEDIA( hmm.dll )でゲームのカットインで動画を使おうと思ったのですが、透過がうまくできません。
ゲームの画面を写してその上から動画を流しているのですが、動画が黒い背景のまま写ってしまいゲーム画面が見えません。
動画の黒色の部分はRGB( 0, 0, 0 )です。
#include "hmm.as"
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define FULL_SCREEN_MODE 0
#define WINDOW_MODE 1
*init
//必ずDirectGraphicsを先に初期化してください。
dgInit
ScrMode = WINDOW_MODE
dgScreen SCREEN_WIDTH, SCREEN_HEIGHT, ScrMode, 32, 0
/*
DirectShowの初期化
第2引数を1にすることでDirectGraphicsで動かすことができるようになります。
*/
dshInit , 1
dshLoadFname "カットイン.avi", 0
/*
動画ファイルの読み込み後に、その動画をDGBUFFERの何番に描画するかを決めます。
p1にdgBufferの番号
p2に動画の管理番号
*/
dshSetMovieTodgBuffer 1, 0
dshPlay 0, 1, 0, 0, 0
dshGetOriginalVideoSize 0, VideoWidth, VideoHeight
*main
await
dgGsel 0
dgColor 0, 0, 0, 255: dgClear
dgBlendMode 1
dgScaleAndAngle SCREEN_WIDTH, SCREEN_HEIGHT, 0
dgRect 0, 0, VideoWidth, VideoHeight
dgColor 255, 255, 255, 255
dgPos 0, 0
dgGcopy 1, 2
dgRedraw //画面更新
goto *main
hmm.dllのバージョンは1.40です。hsptvの公式ホームページからダウンロードができなくて少し古いバージョンです。。。
|
|
2024/4/29(Mon) 23:02:47|NO.101643
|
|
2024/4/30(Tue) 21:30:15|NO.101644
zrs90(5さい)さん返答ありがとうございます。
その記事を見てやってみたのですが、バージョンが1.3で古いのでした。
ウェブアーカイブからダウンロードしてみたのがバージョン1.4だったのですがhsptvでは1.42と記されていて少しだけ古いのかな?程度ですが気になったので質問してみました。
また昨日質問した文章を改めて見たところ全くまとまっていなかったので補足です。
hmm.dllのmovie2dgbuffer.asのサンプルを参考に作成してみたのが以下のスクリプトです。
#include "hmm.as"
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define FULL_SCREEN_MODE 0
#define WINDOW_MODE 1
*init
//必ずDirectGraphicsを先に初期化してください。
dgInit ;DirectGraphicsを初期化
ScrMode = WINDOW_MODE
dgScreen SCREEN_WIDTH, SCREEN_HEIGHT, ScrMode, 32, 0
/*
DirectShowの初期化
第2引数を1にすることでDirectGraphicsで動かすことができるようになります。
*/
dshInit , 1 ;DirectShowを初期化,動画をDGBUFEERとして扱う
dshLoadFname "カットイン.avi", 0
/*
動画ファイルの読み込み後に、その動画をDGBUFFERの何番に描画するかを決めます。
p1にdgBufferの番号
p2に動画の管理番号
*/
dshSetMovieTodgBuffer 1, 0
dshPlay 0, 1, 0, 0, 0
dshGetOriginalVideoSize 0, VideoWidth, VideoHeight
*main
await
dgGsel 0 ;出力先のスクリーン番号
dgColor 0, 0, 0, 255: dgClear ;スクリーン全体をDGCOLORの色で塗りつぶす
dgBlendMode 1 ;1 = 半透明合成(透過有りRGB(0, 0, 0)を透過)
dgScaleAndAngle SCREEN_WIDTH, SCREEN_HEIGHT, 0
dgRect 0, 0, VideoWidth, VideoHeight ;コピーしたい矩形領域を設定
dgColor 255, 255, 255, 255
dgPos 0, 0 ;表示したい座標を指定
dgGcopy 1, 2
dgRedraw //画面更新
goto *main
/* DGGCOPY p1, p2
引数
p1:コピー元のスクリーン番号
コピー先(出力先)とコピー元で同じ番号を指定することは出来ません。
p2:描画フラグ(省略時0)
機能
p1で指定したスクリーンをDGRECTで指定した領域分を
DGSCALEANDANGLEで指定した値で拡縮と回転し
DGBLENDMODEで指定したブレンド方法とDGCOLORで設定したブレンド率で
DGGSELで選択したスクリーンにDGPOSで指定した座標にコピーします。RGB( 0, 0, 0 )は透過されます。
※DGCOLORで128, 128, 128, 255とした場合などはブレンド率は100%ですが、各画像のRGBの値は半分でコピーされます。
p2は描画フラグで
0 = 通常描画
1 = DGRECTで選択した領域の中心がDGPOSの表示座標になる。
2 = DGSCALEANDANGLEで指定した値は拡縮率ではなく、実際に指定した大きさでコピーされる。
4 = 拡縮は矩形の中心を軸に行われる。
8 = 左右反転で描画
16 = 上下反転で描画
これを組み合わせて指定することができる。
;例)
dginit
dgscreen 640, 480, 1, 16
dgloadfname "sample.bmp", 1
dggsel 0
dgpos 0, 0
dgrect 0, 0, 64, 64
dgscaleandangle 128, 128, 256
dgblend 1
*main
await 0
dgcolor 0, 0, 0, 0
dgclear
dgcolor 255, 255, 255, 128
ddgcopy 1, 3 ;座標(0,0)の位置を中心にして128*128の大きさの半透明で表示される。
dgredraw
goto *main
初めて使うので文法が間違っていたりなにか勘違いしているのかもしれません。
全くわからなかったので質問させていただきました。
もしできないようならばpngの連番も手かなと考えおります。
| |
|
2024/4/30(Tue) 21:30:30|NO.101645
zrs90(5さい)さん返答ありがとうございます。
その記事を見てやってみたのですが、バージョンが1.3で古いのでした。
ウェブアーカイブからダウンロードしてみたのがバージョン1.4だったのですがhsptvでは1.42と記されていて少しだけ古いのかな?程度ですが気になったので質問してみました。
また昨日質問した文章を改めて見たところ全くまとまっていなかったので補足です。
hmm.dllのmovie2dgbuffer.asのサンプルを参考に作成してみたのが以下のスクリプトです。
#include "hmm.as"
#define SCREEN_WIDTH 640
#define SCREEN_HEIGHT 480
#define FULL_SCREEN_MODE 0
#define WINDOW_MODE 1
*init
//必ずDirectGraphicsを先に初期化してください。
dgInit ;DirectGraphicsを初期化
ScrMode = WINDOW_MODE
dgScreen SCREEN_WIDTH, SCREEN_HEIGHT, ScrMode, 32, 0
/*
DirectShowの初期化
第2引数を1にすることでDirectGraphicsで動かすことができるようになります。
*/
dshInit , 1 ;DirectShowを初期化,動画をDGBUFEERとして扱う
dshLoadFname "カットイン.avi", 0
/*
動画ファイルの読み込み後に、その動画をDGBUFFERの何番に描画するかを決めます。
p1にdgBufferの番号
p2に動画の管理番号
*/
dshSetMovieTodgBuffer 1, 0
dshPlay 0, 1, 0, 0, 0
dshGetOriginalVideoSize 0, VideoWidth, VideoHeight
*main
await
dgGsel 0 ;出力先のスクリーン番号
dgColor 0, 0, 0, 255: dgClear ;スクリーン全体をDGCOLORの色で塗りつぶす
dgBlendMode 1 ;1 = 半透明合成(透過有りRGB(0, 0, 0)を透過)
dgScaleAndAngle SCREEN_WIDTH, SCREEN_HEIGHT, 0
dgRect 0, 0, VideoWidth, VideoHeight ;コピーしたい矩形領域を設定
dgColor 255, 255, 255, 255
dgPos 0, 0 ;表示したい座標を指定
dgGcopy 1, 2
dgRedraw //画面更新
goto *main
/* DGGCOPY p1, p2
引数
p1:コピー元のスクリーン番号
コピー先(出力先)とコピー元で同じ番号を指定することは出来ません。
p2:描画フラグ(省略時0)
機能
p1で指定したスクリーンをDGRECTで指定した領域分を
DGSCALEANDANGLEで指定した値で拡縮と回転し
DGBLENDMODEで指定したブレンド方法とDGCOLORで設定したブレンド率で
DGGSELで選択したスクリーンにDGPOSで指定した座標にコピーします。RGB( 0, 0, 0 )は透過されます。
※DGCOLORで128, 128, 128, 255とした場合などはブレンド率は100%ですが、各画像のRGBの値は半分でコピーされます。
p2は描画フラグで
0 = 通常描画
1 = DGRECTで選択した領域の中心がDGPOSの表示座標になる。
2 = DGSCALEANDANGLEで指定した値は拡縮率ではなく、実際に指定した大きさでコピーされる。
4 = 拡縮は矩形の中心を軸に行われる。
8 = 左右反転で描画
16 = 上下反転で描画
これを組み合わせて指定することができる。
;例)
dginit
dgscreen 640, 480, 1, 16
dgloadfname "sample.bmp", 1
dggsel 0
dgpos 0, 0
dgrect 0, 0, 64, 64
dgscaleandangle 128, 128, 256
dgblend 1
*main
await 0
dgcolor 0, 0, 0, 0
dgclear
dgcolor 255, 255, 255, 128
ddgcopy 1, 3 ;座標(0,0)の位置を中心にして128*128の大きさの半透明で表示される。
dgredraw
goto *main
初めて使うので文法が間違っていたりなにか勘違いしているのかもしれません。
全くわからなかったので質問させていただきました。
もしできないようならばpngの連番も手かなと考えおります。
| |
|