hmm.dllをダウンロードしてhsp34フォルダに突っ込んでください。
下記サンプルを実行ファイルにしてください。
/*
DirectGraphicsのサンプルです。
マウスカーソルをの位置で画像を表示します。
ESCで終了します。
SHIFTで画面モードを切り替えます。
SPACEで残像っぽいエフェクトサンプル
*/
;----------------------
;
;----------------------
#include "hmm.as"
#include "hspext.as"
#packopt name "ax"
;----------------------
;
;----------------------
#define FULL_SCREEN_MODE 0
#define WINDOW_MODE 1
#define STAR_MAX 256
#define PARAM_MAX 10
#define pos_x 0
#define pos_y 1
#define speed_x 2
#define speed_y 3
#define scale 4
#define angle 5
#define color_r 6
#define color_g 7
#define color_b 8
#define color_a 9
;----------------------
;
;----------------------
*init
title "hmm.dll sample [esc=end][shift=chngscrmode][space=effect]"
randomize
diInit
ScreenMode = 1: gosub *initdg
dim SinTbl, 256: dim CosTbl, 256
repeat 256
emsin SinTbl.cnt, cnt: emcos CosTbl.cnt, cnt
loop
dim Star, STAR_MAX, PARAM_MAX
repeat STAR_MAX
StarNumber = cnt: gosub *setparam
loop
;----------------------
;
;----------------------
*main
await 0
hmmgetfps fps
gosub *keycheck
gosub *draw
gosub *moveparam
dgReDraw ;画面更新
if stat == 0 {
// ALT+TAB、スクリーンセーバー、省電力モードなどで
// 画面更新が失敗したら初期化して画像などを読み込みし直す
// この時にはウィンドウモードにすること
ScreenMode = WINDOW_MODE
gosub *initdg
}
goto *main
;----------------------
;
;----------------------
*setparam
Star.StarNumber.pos_x = mousex<<8: Star.StarNumber.pos_y = mousey<<8
r = rnd( 256 )
Star.StarNumber.speed_x = CosTbl.r
Star.StarNumber.speed_y = SinTbl.r
Star.StarNumber.scale = rnd( 392 )
Star.StarNumber.angle = rnd( 257 )
Star.StarNumber.color_r = rnd( 128 ): Star.StarNumber.color_r += 128
Star.StarNumber.color_g = rnd( 128 ): Star.StarNumber.color_g += 128
Star.StarNumber.color_b = rnd( 128 ): Star.StarNumber.color_b += 128
Star.StarNumber.color_a = rnd( 128 ): Star.StarNumber.color_a += 128
return
;----------------------
;
;----------------------
*moveparam
repeat STAR_MAX
StarNumber = cnt
;パラメーターの変更
Star.StarNumber.pos_x += Star.StarNumber.speed_x: Star.StarNumber.pos_y += Star.StarNumber.speed_y
Star.StarNumber.color_a --: Star.StarNumber.angle += 4
;パラメーターの初期化判定
x = Star.StarNumber.pos_x>>8: y = Star.StarNumber.pos_y>>8: a = Star.StarNumber.color_a
if ( x < 0 ) || ( x > 640 ) || ( y < 0 ) || ( y > 480 ) || ( a <= 0 ): gosub *setparam
loop
return
;----------------------
;
;----------------------
*draw
dgGsel 0
dgColor 0, 0, 0, 255: dgClear ;画面のクリア
dgGsel 2: dgColor 0, 0, 0, 255: dgClear
/*
;星の描画( ver DGGCOPY )
dgBlendMode 2: dgRect 0, 0, 96, 32
repeat STAR_MAX
StarNumber = cnt
dgScaleAndAngle Star.StarNumber.scale, Star.StarNumber.scale, Star.StarNumber.angle
dgColor Star.StarNumber.color_r, Star.StarNumber.color_g, Star.StarNumber.color_b, Star.StarNumber.color_a
dgPos Star.StarNumber.pos_x>>8, Star.StarNumber.pos_y>>8: dgGcopy 1,5
loop
*/
;星の描画( ver DGDRAWPRIMITIVE )
dgTexture 1: dgBlendMode 2: dgRect 0, 0, 96, 32
repeat STAR_MAX
StarNumber = cnt
dgScaleAndAngle Star.StarNumber.scale, Star.StarNumber.scale, Star.StarNumber.angle
dgColor Star.StarNumber.color_r, Star.StarNumber.color_g, Star.StarNumber.color_b, Star.StarNumber.color_a
dgPos Star.StarNumber.pos_x>>8, Star.StarNumber.pos_y>>8: dgAddPrimitive 5
loop: dgDrawPrimitive
dgBlendMode 2
repeat 128
ca = rnd( 256 ): cb = rnd( 256 ): cg = rnd( 256 )
ex = rnd( 320 ): ey = rnd( 240 )
dgColor ca, cb, cg, 255: dgLine 0, 0, ex, ey
loop
if AfterEffect {
dgGsel 3
dgBlendMode 1: dgColor 255, 255, 255, 16
dgRect 0, 0, 640, 480: dgScaleAndAngle 256, 256, 0
dgPos 0, 0: dgGcopy 2
cpybufid = 3
} else {
cpybufid = 2
}
dgGsel 0
dgBlendMode 0: dgColor 255, 255, 255, 255
dgRect 0, 0, 640, 480: dgScaleAndAngle 256, 256, 0
dgPos 0, 0: dgGcopy cpybufid
dgPos 640-96, 480-16: dgColor 255, 255, 255, 255: dgDrawText "fps="+fps, 96, 16
return
;----------------------
;
;----------------------
*keycheck
diGetKeyState key, 0
diGetMomentKeyState key, 0 //押した瞬間のキーを取得
//サンプルの終了と画面のキャプチャ
hmmBitCheck key, KEY_ESC_BIT
if stat == 1 {
dgBmpSave "bmpsave.bmp"
end //ESCが押されたら終了
}
//画面モードチェンジ
hmmBitCheck key, KEY_SHIFT_BIT
if stat == 1 {
if ScreenMode {
ScreenMode = FULL_SCREEN_MODE
} else {
ScreenMode = WINDOW_MODE
}
gosub *initdg
}
hmmBitCheck key, Key_SPACE_BIT
if stat == 1 : AfterEffect = AfterEffect^1
return
;----------------------
;
;----------------------
*initdg
dgInit: if stat == DG_ERR: dialog "init err": end
dgScreen 640, 480, ScreenMode, 32, 0: if stat == DG_ERR: dialog "screen err": end
dgRenewalTiming 60
//PCの性能にまかせて描画
//dgScreen 640, 480, ScreenMode, 32, 1: if stat == DG_ERR: dialog "screen err": end
//dgRenewalTiming 60
dgBuffer 1, 64, 64: if stat == DG_ERR: dialog "buffer err": end
dgFont "MS ゴシック", 32: if stat == DG_ERR: end
dgGsel 1: dgScaleAndAngle 256, 256, 0: dgClear
dgColor 255, 255, 255, 255: dgPos 0, 0
dgDrawText "HSP", 96, 32: if stat == DG_ERR: end
dgCreatePrimitive STAR_MAX
dgFont "MS ゴシック", 16: if stat == DG_ERR: end
dgBuffer 2, 640, 480: dgBuffer 3, 640, 480
return
そのあと、
#include "llmod3/llmod3.hsp"
#include "llmod3/input.hsp"
exec "保存した実行ファイルのパス"
wait 300;*1参照
keybd_event 44,-1,1
exec "C:\\Program Files\\Windows NT\\Accessories\\wordpad.exe"
keybd_event 17,0,0
keybd_event 86,-1,1
keybd_event 17,1,$2
end
を実行すると、ワードパッドの画面にDirectx描画がコピーされます。
*1
waitは最低100あったらいいかもしれない。いろいろ試してください。
違ったらごめんなさい。