diff options
Diffstat (limited to 'go/ui/mapView.go')
| -rw-r--r-- | go/ui/mapView.go | 57 |
1 files changed, 40 insertions, 17 deletions
diff --git a/go/ui/mapView.go b/go/ui/mapView.go index 6c887920..c966f1a8 100644 --- a/go/ui/mapView.go +++ b/go/ui/mapView.go @@ -132,20 +132,25 @@ func (vw *MapView) drawMapLayer(screen *ebiten.Image) { screen.DrawImage(vw.mapLayer, &ebiten.DrawImageOptions{}) } +func getPermanentSymbol(p game.Permanent, i int) *ebiten.Image { + permanentSymbol := assets.GetSymbol(strings.ToLower(p.GetCard().Name)) + if permanentSymbol == nil { + symbol := fmt.Sprintf("%c%d", unicode.ToUpper(rune(p.GetCard().Type.String()[0])), i) + permanentSymbol = assets.GetGenericSymbol(symbol) + if permanentSymbol == nil { + log.Fatalf("Failed to generate generic symbol %s", symbol) + } + } + + return permanentSymbol +} + func (vw *MapView) drawPermanentsLayer(screen *ebiten.Image) { if vw.permanentsLayer == nil { vw.permanentsLayer = vw.newLayerImage() for i, p := range vw.gameState.Permanents { - permanentSymbol := assets.GetSymbol(strings.ToLower(p.GetCard().Name)) - if permanentSymbol == nil { - symbol := fmt.Sprintf("%c%d", unicode.ToUpper(rune(p.GetCard().Type.String()[0])), i) - permanentSymbol = assets.GetGenericSymbol(symbol) - if permanentSymbol == nil { - log.Fatalf("Failed to generate generic symbol %s", symbol) - } - } - + permanentSymbol := getPermanentSymbol(p, i) t := p.GetTile() x_px := t.Position.X*TILE_WIDTH + (TILE_WIDTH-PERMANENT_WIDTH)/2 y_px := t.Position.Y*TILE_HEIGHT + (TILE_HEIGHT-PERMANENT_HEIGHT)/2 @@ -178,19 +183,37 @@ func (vw *MapView) ForceRedraw() { vw.permanentsLayer = nil } -func (vw *MapView) FindObjectAt(x_px, y_px int) interface{} { - x := x_px / TILE_WIDTH - y := y_px / TILE_HEIGHT +func isSymbolTransparentAt(p game.Permanent, relativeX, relativeY int) bool { + permanentSymbol := getPermanentSymbol(p, 0) + _, _, _, alpha := permanentSymbol.At(relativeX, relativeY).RGBA() + return alpha == 0 +} + +func (vw *MapView) FindObjectAt(screenX, screenY int) interface{} { + x := screenX / TILE_WIDTH + y := screenY / TILE_HEIGHT if x < 0 || y < 0 { return nil } - // TODO: detect if a permanent or the containing tile was selected - for _, u := range vw.gameState.Permanents { - pos := u.GetTile().Position - if pos.X == x && pos.Y == y { - return u + relativeX := screenX % TILE_WIDTH + relativeY := screenY % TILE_HEIGHT + xMargin := (TILE_WIDTH - PERMANENT_WIDTH) / 2 + yMargin := (TILE_HEIGHT - PERMANENT_HEIGHT) / 2 + // detect if a permanent or the containing tile was selected + if relativeX >= xMargin && relativeX <= TILE_WIDTH-xMargin && + relativeY >= yMargin && relativeY <= TILE_HEIGHT-yMargin { + + for _, p := range vw.gameState.Permanents { + pos := p.GetTile().Position + if pos.X == x && pos.Y == y { + if isSymbolTransparentAt(p, relativeX, relativeY) { + break + } + + return p + } } } |
