#東方弾幕風
#Title[テストスクリプト]
#Text[テストスクリプト]
#ScriptVersion[2]

script_enemy_main {
    let imgBoss = "script\img\ExRumia.png";
    let wIni    = 120;

    @Initialize {
        SetMovePosition02(GetCenterX, GetClipMinY + 120, wIni);
        SetLife(2000);

        LoadGraphic(imgBoss);
        SetTexture(imgBoss);
        SetGraphicRect(0, 0, 63, 63);

        TNway;
        TMove;
    }

    @MainLoop {
        SetCollisionA(GetX, GetY, 24);
        SetCollisionB(GetX, GetY, 24);

        yield;
    }

    @DrawLoop {
        DrawGraphic(GetX, GetY);
    }

    @Finalize {
        DeleteGraphic(imgBoss);
    }

    // n-way 弾を撃つタスク
    task TNway {
        let angleBase = 90;
        yield;
        loop(wIni) { yield; }

        loop {
            loop(30) { yield; }
            nway(angleBase, 3, 10, YELLOW01);
            angleBase += 8;

            loop(30) { yield; }
            nway(angleBase, 5,  5, WHITE01);
            angleBase += 8;
        }
    }

    // キャラを移動させるタスク
    task TMove {
        yield;
        loop(wIni) { yield; }

        loop {
            loop(120) { yield; }
            moveToPlayer(rand(40, 80), rand(-40, 40), 60,
                         GetClipMinX + 32, GetClipMinY + 32,
                         GetClipMaxX - 32, GetClipMinY + 160);
        }
    }

    // n-way 弾を撃つ関数
    //   dir   : 弾を撃つ方向
    //   way   : 弾の数
    //   span  : 弾の間隔(角度)
    //   color : 弾の色と種類
    function nway(dir, way, span, color) {
        // 中心から発射位置をずらす距離
        let radius = 32;

        // 発射角
        let angle  = dir - (way - 1) / 2 * span;

        loop(way) {
            // 発射地点
            let x = GetX + offsetX(radius, angle);
            let y = GetY + offsetY(radius, angle);

            CreateShot01(x, y, 1, angle, color, 0);
            angle += span;
        }
    }

    // 円の中心からのズレを取得(offsetX : x 座標, offsetY : y 座標)
    //   radius : 半径
    //   angle  : 角度
    function offsetX(radius, angle) {
        return radius * cos(angle);
    }

    function offsetY(radius, angle) {
        return radius * sin(angle);
    }

    // なるべくプレイヤーの方向に移動
    //   xMove  : x 方向の移動量(正の数)
    //   yAdd   : y 方向の移動量
    //   frame  : 移動に要するフレーム数
    //   left   : 以下、可動範囲
    //   top    :
    //   right  :
    //   bottom :
    function moveToPlayer(xMove, yAdd, frame, left, top, right, bottom) {
        let x;
        let y;

        if(GetPlayerX < GetX) {
            // プレイヤーより右に敵がいれば、敵は左に動きます。
            x = GetX - xMove;

            // 但し、敵が可動領域の左端よりも左にいくようなら、右に動きます。
            if(x < left) {
                x = GetX + xMove;
            }
        } else {
            // さもなくば、敵は右に動きます。
            x = GetX + xMove;

            // 但し、敵が可動領域の右端よりも右にいくようなら、左に動きます。
            if(right < x) {
                x = GetX - xMove;
            }
        }

        // 可動領域の外に行く場合は、端っこで止めます。
        y = GetY + yAdd;
        if(y < top) {
            y = top;
        } else if(bottom < y) {
            y = bottom;
        }

        SetMovePosition02(x, y, frame);
    }
}

戻る

この講座はロベールが作成しました。