Display doubling cube

Resolves #30.
This commit is contained in:
Trevor Slocum 2024-02-20 12:47:17 -08:00
parent b90ab54466
commit bb6ed81d91
4 changed files with 83 additions and 11 deletions

View file

@ -1,3 +1,6 @@
1.3.1:
- Display doubling cube
1.3.0:
- Remember password

BIN
game/asset/image/cubes.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View file

@ -59,6 +59,9 @@ type board struct {
overlapSize float64
lastPlayerNumber int8
lastPoints int8
lastDoubleValue int8
lastDoublePlayer int8
lastVariant int8
gameState *bgammon.GameState
@ -1393,6 +1396,22 @@ func (b *board) updateBackgroundImage() {
}
b.backgroundImage.DrawImage(ebiten.NewImageFromImage(b.baseImage), nil)
// Doubling cube.
if b.gameState.Points > 1 {
var cubeY float64
switch b.gameState.DoublePlayer {
case 1:
cubeY = float64(b.h) - b.verticalBorderSize - b.overlapSize*5 - 2 - float64(etk.Scale(mediumFontSize)) - 2 - cubesImageSize
case 2:
cubeY = b.verticalBorderSize + b.overlapSize*5 + 2 + float64(etk.Scale(mediumFontSize)) + 2
default:
cubeY = float64(b.h)/2 - cubesImageSize/2
}
op := &ebiten.DrawImageOptions{}
op.GeoM.Translate(float64(b.w)-b.spaceWidth/2-float64(cubesImageSize)/2-1, cubeY)
b.backgroundImage.DrawImage(cubeImage(b.gameState.DoubleValue), op)
}
// Draw space numbers.
fontMutex.Lock()
defer fontMutex.Unlock()
@ -2263,9 +2282,14 @@ func (b *board) processState() {
if b.lastPlayerNumber != b.gameState.PlayerNumber || b.lastVariant != b.gameState.Variant {
b.setSpaceRects()
b.updateBackgroundImage()
} else if b.lastPoints != b.gameState.Points || b.lastDoublePlayer != b.gameState.DoublePlayer || b.lastDoubleValue != b.gameState.DoubleValue {
b.updateBackgroundImage()
}
b.lastPlayerNumber = b.gameState.PlayerNumber
b.lastVariant = b.gameState.Variant
b.lastPoints = b.gameState.Points
b.lastDoublePlayer = b.gameState.DoublePlayer
b.lastDoubleValue = b.gameState.DoubleValue
if b.flipBoard || b.gameState.PlayerNumber == 2 {
if b.opponentLabel.activeColor != colorBlack {

View file

@ -68,6 +68,14 @@ var (
imgDice5 *ebiten.Image
imgDice6 *ebiten.Image
imgCubes *ebiten.Image
imgCubes2 *ebiten.Image
imgCubes4 *ebiten.Image
imgCubes8 *ebiten.Image
imgCubes16 *ebiten.Image
imgCubes32 *ebiten.Image
imgCubes64 *ebiten.Image
extraSmallFont font.Face
smallFont font.Face
mediumFont font.Face
@ -178,7 +186,11 @@ func lg(s string) {
scheduleFrame()
}
var loadedCheckerWidth = -1
var (
loadedCheckerWidth = -1
diceImageSize = 0.0
cubesImageSize = 0.0
)
func loadImageAssets(width int) {
if width == loadedCheckerWidth {
@ -189,7 +201,7 @@ func loadImageAssets(width int) {
imgCheckerTop = loadAsset("asset/image/checker_top.png", width)
imgCheckerSide = loadAsset("asset/image/checker_side.png", width)
resizeDice := func(img image.Image) *ebiten.Image {
resizeDice := func(img image.Image, scale float64) *ebiten.Image {
if game == nil {
panic("nil game")
}
@ -206,17 +218,29 @@ func loadImageAssets(width int) {
if diceSize > maxSize {
diceSize = maxSize
}
return ebiten.NewImageFromImage(resize.Resize(uint(diceSize), 0, img, resize.Lanczos3))
if scale == 1 {
diceImageSize = float64(diceSize)
} else {
cubesImageSize = float64(diceSize) * scale
}
return ebiten.NewImageFromImage(resize.Resize(uint(float64(diceSize)*scale), 0, img, resize.Lanczos3))
}
const size = 184
imgDice = ebiten.NewImageFromImage(loadImage("asset/image/dice.png"))
imgDice1 = resizeDice(imgDice.SubImage(image.Rect(0, 0, size*1, size*1)))
imgDice2 = resizeDice(imgDice.SubImage(image.Rect(size*1, 0, size*2, size*1)))
imgDice3 = resizeDice(imgDice.SubImage(image.Rect(size*2, 0, size*3, size*1)))
imgDice4 = resizeDice(imgDice.SubImage(image.Rect(0, size*1, size*1, size*2)))
imgDice5 = resizeDice(imgDice.SubImage(image.Rect(size*1, size*1, size*2, size*2)))
imgDice6 = resizeDice(imgDice.SubImage(image.Rect(size*2, size*1, size*3, size*2)))
imgDice1 = resizeDice(imgDice.SubImage(image.Rect(0, 0, size*1, size*1)), 1)
imgDice2 = resizeDice(imgDice.SubImage(image.Rect(size*1, 0, size*2, size*1)), 1)
imgDice3 = resizeDice(imgDice.SubImage(image.Rect(size*2, 0, size*3, size*1)), 1)
imgDice4 = resizeDice(imgDice.SubImage(image.Rect(0, size*1, size*1, size*2)), 1)
imgDice5 = resizeDice(imgDice.SubImage(image.Rect(size*1, size*1, size*2, size*2)), 1)
imgDice6 = resizeDice(imgDice.SubImage(image.Rect(size*2, size*1, size*3, size*2)), 1)
imgCubes = ebiten.NewImageFromImage(loadImage("asset/image/cubes.png"))
imgCubes2 = resizeDice(imgCubes.SubImage(image.Rect(0, 0, size*1, size*1)), 0.6)
imgCubes4 = resizeDice(imgCubes.SubImage(image.Rect(size*1, 0, size*2, size*1)), 0.6)
imgCubes8 = resizeDice(imgCubes.SubImage(image.Rect(size*2, 0, size*3, size*1)), 0.6)
imgCubes16 = resizeDice(imgCubes.SubImage(image.Rect(0, size*1, size*1, size*2)), 0.6)
imgCubes32 = resizeDice(imgCubes.SubImage(image.Rect(size*1, size*1, size*2, size*2)), 0.6)
imgCubes64 = resizeDice(imgCubes.SubImage(image.Rect(size*2, size*1, size*3, size*2)), 0.6)
}
func loadAudioAssets() {
@ -419,6 +443,23 @@ func diceImage(roll int8) *ebiten.Image {
}
}
func cubeImage(value int8) *ebiten.Image {
switch value {
case 2:
return imgCubes2
case 4:
return imgCubes4
case 8:
return imgCubes8
case 16:
return imgCubes16
case 32:
return imgCubes32
default:
return imgCubes64
}
}
func setViewBoard(view bool) {
var refreshLobby bool
if !view && viewBoard != view {
@ -1427,6 +1468,9 @@ func (g *Game) handleEvent(e interface{}) {
g.Board.availableStale = false
g.Board.playerMoves = nil
g.Board.opponentMoves = nil
if g.needLayoutBoard {
g.layoutBoard()
}
g.Board.processState()
g.Board.Unlock()
setViewBoard(true)
@ -2591,8 +2635,9 @@ func (g *Game) Update() error {
if g.lobby.showCreateGame {
pointsText := g.lobby.createGamePoints.Text()
if pointsText != "" {
g.lobby.createGamePoints.SetText(strings.Join(anyNumbers.FindAllString(pointsText, -1), ""))
strippedText := strings.Join(anyNumbers.FindAllString(pointsText, -1), "")
if pointsText != strippedText {
g.lobby.createGamePoints.SetText(strippedText)
}
}
}