長文はいけないでしょうが入れておきます。
少し長いですがこれは私のノートパソコンで動いたものです。
この文章の最後まで見て下さい。
/*
DirectGraphicsのサンプルです。
マウスカーソルをの位置で画像を表示します。
ESCで終了します。
SHIFTで画面モードを切り替えます。
SPACEで残像っぽいエフェクトサンプル
*/
;----------------------
;
;----------------------
#include "hmm.as"
#include "winmm.as"
#include "comctl32.as"
#include "hspext.as"
;----------------------
;
;----------------------
#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
;-------
t=1
input t,50,25
ic=8,16
InitCommonControlsEx varptr(ic)
CreateUpDownControl 0x50800086,0,0,0,0,hwnd,0x10000,hinstance,objinfo_hwnd(0),1000,0,1
hmminit %10000
*main
dgcolor : dgclear; : dgredraw
await t
hmmgetfps fps : title strf("fps: %d", fps)
gosub *keycheck
gosub *draw
gosub *moveparam
dgReDraw ;画面更新
if stat == 0 {
// ALT+TAB、スクリーンセーバー、省電力モードなどで
// 画面更新が失敗したら初期化して画像などを読み込みし直す
// この時にはウィンドウモードにすること
ScreenMode = WINDOW_MODE
gosub *initdg
}
getkey esc, 27 : if esc : end
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 "hmm.as"
#include "winmm.as"
#include "comctl32.as"
t=1
input t,50,25
ic=8,16
InitCommonControlsEx varptr(ic)
CreateUpDownControl 0x50800086,0,0,0,0,hwnd,0x10000,hinstance,objinfo_hwnd(0),1000,0,1
hmminit %10000
*main
dgcolor : dgclear
await t
hmmgetfps fps : title strf("fps: %d", fps)
gosub *keycheck
gosub *draw
gosub *moveparam
dgReDraw ;画面更新
if stat == 0 {
// ALT+TAB、スクリーンセーバー、省電力モードなどで
// 画面更新が失敗したら初期化して画像などを読み込みし直す
// この時にはウィンドウモードにすること
ScreenMode = WINDOW_MODE
gosub *initdg
}
getkey esc, 27 : if esc : end
goto *main
ボックスの数値を変えて見て下さい。
fpsが変わると思います。(私のでは0と1で違いました)
「dgReDraw」
これの更新タイミングの位置のずれだけでずれて表示不可能になります。
これはサンプルを見て実行して比べると分かります。
この他にも理由があります。
サンプルでも示されています。
このようにひとつひとつ研鑽もあります。
スクリプトは貼り付けて即に実行・変換できて便利です。
本当の長文になってしまい、すみませんでした。