// IMW版 スクリーンセーバー
// 紅白まんじゅうが踊ります
// コンパイルして、拡張子を .exe → .scr に変更すれば
// スクリーンセーバーとして使えます
// キーが押されたりクリックされたら終了させる
KEYDOWN { end ; }
LBUTTONDOWN { end ; }
RBUTTONDOWN { end ; }
// マウスが動いたら終了させる
MOUSEMOVE
{
// ms_move の値が 10 までは終了させない
// こうしないといきなり終了してしまう
ms_move = ms_move + 1 ;
if(ms_move > 10){ end ; }
}
TIMER
{
// 描画位置(描画の中心位置)を変更
Set3DCenter(px,py,2000) ;
// 回転角を変更
n = 0 ;
loop(2){
Set3DLocalRotateX(n,rx+n) ;
Set3DLocalRotateY(n,ry+n) ;
Set3DLocalRotateZ(n,rz+n) ;
n = n + 1 ;
}
// 黒で消去
FullPaint(0) ;
// 描画し、表画面にコピー
Draw3DPack(0) ; Draw3DPack(1) ;
CopyBMP(0,0,0,SCR_X,SCR_Y,1,0,0,SCR_X,SCR_Y,0) ;
// 次の描画位置を設定
px = px + mvx ; py = py + mvy ;
// スクリーンの縁(100 手前)にきたら進行方向を反転
if(px > SCR_X-100){ mvx = mvx * (-1) ; }
if(py > SCR_Y-100){ mvy = mvy * (-1) ; }
if(px < 100 ){ mvx = mvx * (-1) ; }
if(py < 100 ){ mvy = mvy * (-1) ; }
count = count + 1 ;
// 回転角を再設定
if(count > 10){
count = 0 ;
rx = 5-rand(SEC)%10 ;
ry = 5-rand(rx)%10 ;
rz = 5-rand(ry)%10 ;
}
}
INIT
{
pn = 0 ; // パック番号
sx = 0 ; // 軸のズレ幅(X)
r = 255 ; g = 255 ; b = 255 ; // 色設定
call("SetData") ; // パック番号0のデータをセット
pn = 1 ;
sx = 150 ;
r = 255 ; g = 200 ; b = 255 ;
call("SetData") ; // パック番号1のデータをセット
SelectScreen(0) ; // 描画は常に裏画面なのでここで指定してしまう
}
CREATE
{
SetWinStyle(4) ;
SetWinSize(SCR_X,SCR_Y) ;
SetWinPos(0,0,0) ;
SetWinColor(0) ;
SetTimer(20) ;
SubScreen(SCR_X,SCR_Y) ;
Data("pos",16,2) ;
Create3DPack(0,18*16*2) ;
Create3DPack(1,18*16*2) ;
px = SCR_X/2 ; py = SCR_Y/2 ; // 描画位置
rx = 2 ; ry = 3 ; rz = 4 ; // 回転角
mvx = 2 ; mvy = 1 ; // 進行方向(+ か -)
count = 0 ; // 移動のカウンタ
ms_move = 0 ; // マウスの移動カウンタ
}
// 3Dパックにデータをセット
SetData
{
pos(0,0) = 0 ; pos(0,1) = -100 ;
pos(1,0) = 16 ; pos(1,1) = -98 ;
pos(2,0) = 32 ; pos(2,1) = -93 ;
pos(3,0) = 47 ; pos(3,1) = -85 ;
pos(4,0) = 59 ; pos(4,1) = -74 ;
pos(5,0) = 69 ; pos(5,1) = -61 ;
pos(6,0) = 76 ; pos(6,1) = -46 ;
pos(7,0) = 79 ; pos(7,1) = -30 ;
pos(8,0) = 79 ; pos(8,1) = -14 ;
pos(9,0) = 76 ; pos(9,1) = 1 ;
pos(10,0) = 69 ; pos(10,1) = 7 ;
pos(11,0) = 59 ; pos(11,1) = 7 ;
pos(12,0) = 47 ; pos(12,1) = 7 ;
pos(13,0) = 32 ; pos(13,1) = 7 ;
pos(14,0) = 16 ; pos(14,1) = 7 ;
pos(15,0) = 0 ; pos(15,1) = 7 ;
kaku = 18 ;
p = 360 / kaku ; x = p / 2 ; s = 0 ;
loop(16){
loop(kaku){
fx1 = -cos(x) * pos(s,0) + sx ;
fz1 = sin(x) * pos(s,0) ;
fx2 = -cos(x+p) * pos(s,0) + sx ;
fz2 = sin(x+p) * pos(s,0) ;
fy = pos(s,1) ;
sx1 = -cos(x) * pos((s+1)%16,0) + sx ;
sz1 = sin(x) * pos((s+1)%16,0) ;
sx2 = -cos(x+p) * pos((s+1)%16,0) + sx ;
sz2 = sin(x+p) * pos((s+1)%16,0) ;
sy = pos((s+1)%16,1) ;
Add3DPack(pn,fx2,fy,fz2,fx1,fy,fz1,sx1,sy,sz1,r,g,b) ;
Add3DPack(pn,fx2,fy,fz2,sx1,sy,sz1,sx2,sy,sz2,r,g,b) ;
x = x + p ;
}
s = s + 1 ;
}
}