②につきまして、ドットサークルアニメーションを作ってみました。
あまりリアルには再現できなかったかもしれませんが、とりあえず。
#include "winmm.as"
#module
//canm_init p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11
// ドットサークルアニメ表示の初期設定を行う。
// 実行後、描画領域の正方形の一辺の長さがstatに入る。
// ドットサークルアニメ中はseteaseやgeteaseは使わないこと。
//p1,p2 : この処理で用いる画像バッファの番号
//p3 : ドットの半径
//p4 : 公転半径
//p5,p6,p7 : ドットの色(r,g,b) 0,0,0は使用不可
//p8,p9,p10 : 背景の色(r,g,b)
//p11 : 一周にかかる時間(ミリ秒)
#deffunc canm_init int _buf1,int _buf2,int _r0,int _r1,int cr0,int cg0,int cb0,int cr1,int cg1,int cb1,int msec
now_buf=ginfo_sel
buf1=_buf1 //作業で用いるバッファ番号1
buf2=_buf2 //作業で用いるバッファ番号2
r0=_r0 //ドットの半径
d0=r0*2 //ドットの直径
r1=_r1 //公転の半径
d1=r1*2+d0 //描画領域の正方形の一辺の長さ
buffer buf1,d0,d0 : gsel buf1
color 0,0,0 : boxf
color cr0,cg0,cb0 : circle 0,0,d0,d0,1
buffer buf2,d1,d1 : gsel buf2
color cr1,cg1,cb1 : boxf
gsel now_buf
c_cou=msec/33 //一周にかかるカウント数(1カウントは1/30秒)
c_cou2=c_cou*2 //二周にかかるカウント数
h_cou=c_cou/5 //カウントがこの数値になるまではドットを表示しない
h_cou2=c_cou2-h_cou //カウントがこの数値になったらドットを表示しない
g_cou=c_cou/16 //ドット1個ごとのカウント差
cou0=-1
TimeGetTime : start_t=stat
setease M_PI*0.5,M_PI*2.5,ease_quad_inout
return d1
//canm p1,p2
// ドットサークルアニメを表示
// これを実行する前にcanm_initを実行しておくこと。
//p1 : 1の時はredraw処理を行う(省略可。省略時は1)
//p2 : 1の時は背景を初期化する(省略可。省略時は1)
#define global canm(%1=1,%2=1) _canm %1,%2
#deffunc _canm int swi,int swi2
TimeGetTime : cou=((stat-start_t)/33)\c_cou2 //カウント値を取得
if cou=cou0 : return //前回これを実行した時とカウント値が変わらないなら何もしない
cou0=cou
if swi : redraw 0
x=ginfo_cx : y=ginfo_cy
if swi2 {
gmode 0
gcopy buf2,0,0,d1,d1
}
gmode 2
x0=x+r1+r0 : y0=y+r1+r0 //公転の中心
repeat 5
cou1=cou+cnt*g_cou
if (cou1>h_cou)&(cou1<h_cou2) {
rad=geteasef(cou1\c_cou,c_cou)
pos int(cos(rad)*r1)+x0-r0,int(sin(rad)*r1)+y0-r0
gcopy buf1,0,0,d0,d0
}
loop
if swi : redraw 1,x,y,d1,d1
pos x,y
return
#global
//以下サンプル
color 0,0,0 : boxf
canm_init 100,101,4,30,255,255,255,0,0,0,2200
pos 100,100
repeat
canm
await 33
loop