// 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 ; } }