@@ -4,44 +4,41 @@ import (
44 "image/color"
55
66 "github.com/hajimehoshi/ebiten/v2"
7- es "github.com/kijimaD/ruins/internal/engine/states"
8- w "github.com/kijimaD/ruins/internal/world"
97)
108
11- // ブラー画像と暗転オーバーレイのキャッシュ
129var (
1310 cachedBlurImage * ebiten.Image
1411 cachedDarkOverlay * ebiten.Image
15- cachedBaseState es. State [w. World ]
12+ cachedStateCount int
1613)
1714
1815// applyBlurOverlay は画面にブラー効果を適用する
19- // baseStateが変わるとキャッシュを再生成する
20- func applyBlurOverlay ( screen * ebiten. Image , baseState es. State [w. World ]) {
21- // 下層stateが変わったらキャッシュをクリア
22- if cachedBaseState != baseState {
16+ // stateCountが変わるとキャッシュを再生成する
17+ // applyBlurがfalseの場合はキャッシュ更新のみ行う
18+ func applyBlurOverlay ( screen * ebiten. Image , stateCount int , applyBlur bool ) {
19+ if stateCount != cachedStateCount {
2320 cachedBlurImage = nil
24- cachedBaseState = baseState
21+ cachedStateCount = stateCount
22+ }
23+
24+ if ! applyBlur {
25+ return
2526 }
2627
2728 bounds := screen .Bounds ()
2829
29- // キャッシュがない場合のみブラー画像を生成する
3030 if cachedBlurImage == nil {
3131 w , h := bounds .Dx (), bounds .Dy ()
3232
33- // 現在の画面をコピーする
3433 src := ebiten .NewImage (w , h )
3534 op := & ebiten.DrawImageOptions {}
3635 op .GeoM .Translate (float64 (- bounds .Min .X ), float64 (- bounds .Min .Y ))
3736 src .DrawImage (screen , op )
3837
39- // ブラー効果を2パス(水平→垂直)で適用する
4038 const blurRadius = 4
4139 kernel := blurRadius * 2 + 1
4240
43- // 水平ブラー
44- tmp := ebiten .NewImage (bounds .Dx (), bounds .Dy ())
41+ tmp := ebiten .NewImage (w , h )
4542 for x := - blurRadius ; x <= blurRadius ; x ++ {
4643 op := & ebiten.DrawImageOptions {}
4744 op .GeoM .Translate (float64 (x ), 0 )
@@ -50,8 +47,7 @@ func applyBlurOverlay(screen *ebiten.Image, baseState es.State[w.World]) {
5047 tmp .DrawImage (src , op )
5148 }
5249
53- // 垂直ブラー
54- cachedBlurImage = ebiten .NewImage (bounds .Dx (), bounds .Dy ())
50+ cachedBlurImage = ebiten .NewImage (w , h )
5551 for y := - blurRadius ; y <= blurRadius ; y ++ {
5652 op := & ebiten.DrawImageOptions {}
5753 op .GeoM .Translate (0 , float64 (y ))
@@ -61,7 +57,6 @@ func applyBlurOverlay(screen *ebiten.Image, baseState es.State[w.World]) {
6157 }
6258 }
6359
64- // 黒い半透明オーバーレイをキャッシュから取得または生成する
6560 if cachedDarkOverlay == nil {
6661 cachedDarkOverlay = ebiten .NewImage (bounds .Dx (), bounds .Dy ())
6762 cachedDarkOverlay .Fill (color.RGBA {0 , 0 , 0 , 48 })
0 commit comments