人工知能に関する断創録

このブログでは人工知能のさまざまな分野について調査したことをまとめています(更新停止: 2019年12月31日)

スポットライト効果

スポットライト効果です。ドラクエ1の洞窟内でたいまつ使ったイメージです。いろいろ使えそうです。

スポットライト

マウスをドラッグするとスポットライトが移動します。何かの気配がする・・・ドキドキ。背景画像はぐったりにゃんこのホームページさん(リンク切れ)からお借りしました。

spotlight.jar

スポットライトクラスです。スポットライトの位置とスポットライトが当たる範囲の円形領域をspotに格納するだけです。

public class Spotlight {
    // スポットライトの範囲(円形)
    protected Ellipse2D.Double spot;

    public Spotlight() {
        this(0, 0, 0);
    }

    /**
     * コンストラクタ
     * 
     * @param x スポットライト中心のX座標
     * @param y スポットライト中心のY座標
     * @param radius スポットライトの半径
     */
    public Spotlight(int x, int y, int radius) {
        this.spot = new Ellipse2D.Double(x - radius, y - radius,
            radius * 2, radius * 2);
    }

    /**
     * スポットライトの位置をセット
     * 
     * @param x スポットライト中心のX座標
     * @param y スポットライト中心のY座標
     * @param radius スポットライトの半径
     */
    public void setSpot(int x, int y, int radius) {
        spot.x = x - radius;
        spot.y = y - radius;
        spot.width = radius * 2;
        spot.height = radius * 2;
    }

    /**
     * スポットライトの円を返す
     * @return
     */
    public Ellipse2D getSpot() {
        return spot;
    }
}

スポットライトを描画するのはMainPanelクラスのpaintComponent()です。

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        // 背景を描画
        g.drawImage(bgImage, 0, 0, this);

        // お化けを描画
        g.drawImage(obakeImage, 20, 400, this);

        // スポットライト
        Rectangle2D screen = new Rectangle2D.Double(0, 0, WIDTH, HEIGHT);
        // 画面全体を覆うマスク
        Area mask = new Area(screen);
        // マスクからスポットライト部分を取り去る
        mask.subtract(new Area(spotlight.getSpot()));

        // マスクを背景の上に描画
        Graphics2D g2 = (Graphics2D) g;
        g2.setColor(Color.BLACK);
        g2.fill(mask);
    }

画面全体を覆う黒い紙を用意して、スポットライトの部分だけ丸く切り抜きます。この紙を画面に描画すればスポットライトの部分だけ後ろの背景がそのまま表示され、残りは真っ黒になります。スポットライトと言っても円形の部分を明るく表示するわけではないので注意してください。その逆でライトがあたってない部分を黒く塗りつぶしてるわけです。ちなみに背景やオブジェクトを描画した後にマスクを描画します。どの順序で描画するかは非常に重要ですので注意してください。

たいまつ効果

ドラクエ1は洞窟に入ると真っ暗でたいまつやレミーラという呪文を使うと主人公の周りだけ明るくなります。スポットライトを使うと同じ効果が出せます。主人公の位置を中心にスポットライトをセットするだけです。闇の世界って感じだ・・・

torch.jar