2007年7月30日月曜日

弾むリング

モジュール変数によるキャラクタの管理。
#module ring x, z, r, v_x, v_z, a_z, ang, a_ang, life, r_inner
#const DIV_NUM 14      // リングの分割数
#const LIFE_MAX 500    // 寿命の初期値

// 初期化
#modinit int _x, int _z, double _r, int _v_x, double _v_z, double _a_ang
    x = _x : z = _z : r = _r : r_inner = 0.8 * r
    v_x = _v_x : v_z = _v_z : a_z = -2.0
    ang = 0.0 : a_ang = _a_ang
    life = LIFE_MAX
    return

// リングを動かす
#modfunc move
    v_z += a_z
    x += v_x : z += v_z
    if ( z < r ) {
        z = r * 2 - z
        v_z = -v_z * 0.9
    }
    life -= 5
    ang += a_ang
    return

// リングを描く
#modfunc draw
    gmode GMODE_ALPHA, , , limit(life , 0200)
    repeat DIV_NUM
        hsvcolor cnt * 191 / DIV_NUM255255
        c = 3.14 * 2 * cnt / DIV_NUM + ang
        gs_x = x + r * cos( c ), x + r * cos( c + g ), x + r_inner * cos( c + g ), x + r_inner * cos( c )
        gs_y = ginfo_winy - z - r * sin( c ), ginfo_winy - z - r * sin( c + g ), ginfo_winy - z - r_inner * sin( c + g ), ginfo_winy - z - r_inner * sin( c )
        gsquare -1, gs_x, gs_y
    loop
    return life <= 0
#global
    g@ring = ( 3.14 * 2.0 ) / ( DIV_NUM@ring + 3 )

    dimtype mod_ring, 520
    onclick gosub *make_ring
    title "click to create rings"

*main
    redraw 0
    color : boxf
    foreach mod_ring
        move mod_ring( cnt )          // リングを移動させる
        draw mod_ring( cnt )          // リングを描く
        if stat : delmod mod_ring( cnt )   // リングが寿命を迎えていたら削除
    loop
    redraw 1
    wait 3
    goto *main

*make_ring
    switch iparam
    case 0
        newmod mod_ring, ring, 0,          rnd100 ) + 15060 + rnd50 ), rnd5 ) + 30.0, -0.1
        swbreak
    default
        newmod mod_ring, ring, ginfo_winxrnd100 ) + 15060 + rnd50 ), rnd5 ) - 70.0,  0.1
        swbreak
    swend
    return

0 件のコメント: