Signed-off-by: Matt Bruce <mbrucedogs@gmail.com>
This commit is contained in:
parent
d56b0b71d7
commit
645602b2de
@ -50,6 +50,15 @@ enum Design {
|
|||||||
static let labelFontSize: CGFloat = 14
|
static let labelFontSize: CGFloat = 14
|
||||||
static let labelRowHeight: CGFloat = 30
|
static let labelRowHeight: CGFloat = 30
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// MARK: - Card Deal Animation
|
||||||
|
|
||||||
|
enum DealAnimation {
|
||||||
|
/// Horizontal offset for card deal (from upper-center, simulating dealer)
|
||||||
|
static let offsetX: CGFloat = 0
|
||||||
|
/// Vertical offset for card deal (from above the table)
|
||||||
|
static let offsetY: CGFloat = -250
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Baccarat App Colors
|
// MARK: - Baccarat App Colors
|
||||||
|
|||||||
@ -193,7 +193,9 @@ struct GameTableView: View {
|
|||||||
bankerValue: state.bankerHandValue,
|
bankerValue: state.bankerHandValue,
|
||||||
playerIsWinner: playerIsWinner,
|
playerIsWinner: playerIsWinner,
|
||||||
bankerIsWinner: bankerIsWinner,
|
bankerIsWinner: bankerIsWinner,
|
||||||
isTie: isTie
|
isTie: isTie,
|
||||||
|
showAnimations: settings.showAnimations,
|
||||||
|
dealingSpeed: settings.dealingSpeed
|
||||||
)
|
)
|
||||||
.frame(maxWidth: maxContentWidth)
|
.frame(maxWidth: maxContentWidth)
|
||||||
.padding(.horizontal, Design.Spacing.medium)
|
.padding(.horizontal, Design.Spacing.medium)
|
||||||
@ -274,7 +276,9 @@ struct GameTableView: View {
|
|||||||
bankerValue: state.bankerHandValue,
|
bankerValue: state.bankerHandValue,
|
||||||
playerIsWinner: playerIsWinner,
|
playerIsWinner: playerIsWinner,
|
||||||
bankerIsWinner: bankerIsWinner,
|
bankerIsWinner: bankerIsWinner,
|
||||||
isTie: isTie
|
isTie: isTie,
|
||||||
|
showAnimations: settings.showAnimations,
|
||||||
|
dealingSpeed: settings.dealingSpeed
|
||||||
)
|
)
|
||||||
.frame(maxWidth: isLargeScreen ? maxContentWidth : .infinity)
|
.frame(maxWidth: isLargeScreen ? maxContentWidth : .infinity)
|
||||||
.padding(.horizontal, Design.Spacing.medium)
|
.padding(.horizontal, Design.Spacing.medium)
|
||||||
|
|||||||
@ -19,6 +19,8 @@ struct CardsDisplayArea: View {
|
|||||||
let playerIsWinner: Bool
|
let playerIsWinner: Bool
|
||||||
let bankerIsWinner: Bool
|
let bankerIsWinner: Bool
|
||||||
let isTie: Bool
|
let isTie: Bool
|
||||||
|
let showAnimations: Bool
|
||||||
|
let dealingSpeed: Double
|
||||||
|
|
||||||
// MARK: - State
|
// MARK: - State
|
||||||
|
|
||||||
@ -147,7 +149,9 @@ struct CardsDisplayArea: View {
|
|||||||
cards: playerCards,
|
cards: playerCards,
|
||||||
cardsFaceUp: playerCardsFaceUp,
|
cardsFaceUp: playerCardsFaceUp,
|
||||||
isWinner: playerIsWinner,
|
isWinner: playerIsWinner,
|
||||||
containerWidth: width
|
containerWidth: width,
|
||||||
|
showAnimations: showAnimations,
|
||||||
|
dealingSpeed: dealingSpeed
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
.frame(width: width)
|
.frame(width: width)
|
||||||
@ -175,7 +179,9 @@ struct CardsDisplayArea: View {
|
|||||||
cards: bankerCards,
|
cards: bankerCards,
|
||||||
cardsFaceUp: bankerCardsFaceUp,
|
cardsFaceUp: bankerCardsFaceUp,
|
||||||
isWinner: bankerIsWinner,
|
isWinner: bankerIsWinner,
|
||||||
containerWidth: width
|
containerWidth: width,
|
||||||
|
showAnimations: showAnimations,
|
||||||
|
dealingSpeed: dealingSpeed
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
.frame(width: width)
|
.frame(width: width)
|
||||||
@ -199,7 +205,9 @@ struct CardsDisplayArea: View {
|
|||||||
bankerValue: 0,
|
bankerValue: 0,
|
||||||
playerIsWinner: false,
|
playerIsWinner: false,
|
||||||
bankerIsWinner: false,
|
bankerIsWinner: false,
|
||||||
isTie: false
|
isTie: false,
|
||||||
|
showAnimations: true,
|
||||||
|
dealingSpeed: 1.0
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -222,7 +230,9 @@ struct CardsDisplayArea: View {
|
|||||||
bankerValue: 2,
|
bankerValue: 2,
|
||||||
playerIsWinner: true,
|
playerIsWinner: true,
|
||||||
bankerIsWinner: false,
|
bankerIsWinner: false,
|
||||||
isTie: false
|
isTie: false,
|
||||||
|
showAnimations: true,
|
||||||
|
dealingSpeed: 1.0
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -247,7 +257,9 @@ struct CardsDisplayArea: View {
|
|||||||
bankerValue: 8,
|
bankerValue: 8,
|
||||||
playerIsWinner: false,
|
playerIsWinner: false,
|
||||||
bankerIsWinner: true,
|
bankerIsWinner: true,
|
||||||
isTie: false
|
isTie: false,
|
||||||
|
showAnimations: true,
|
||||||
|
dealingSpeed: 1.0
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -15,11 +15,20 @@ struct CompactHandView: View {
|
|||||||
let isWinner: Bool
|
let isWinner: Bool
|
||||||
/// Container width passed from parent for sizing
|
/// Container width passed from parent for sizing
|
||||||
let containerWidth: CGFloat
|
let containerWidth: CGFloat
|
||||||
|
/// Whether to show dealing animations
|
||||||
|
let showAnimations: Bool
|
||||||
|
/// Speed multiplier for dealing animations
|
||||||
|
let dealingSpeed: Double
|
||||||
|
|
||||||
// MARK: - Environment
|
// MARK: - Environment
|
||||||
|
|
||||||
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
|
@Environment(\.horizontalSizeClass) private var horizontalSizeClass
|
||||||
|
|
||||||
|
/// Scaled animation duration based on dealing speed.
|
||||||
|
private var animationDuration: Double {
|
||||||
|
Design.Animation.springDuration * dealingSpeed
|
||||||
|
}
|
||||||
|
|
||||||
// MARK: - Constants
|
// MARK: - Constants
|
||||||
|
|
||||||
/// Overlap ratio relative to card width (negative = overlap)
|
/// Overlap ratio relative to card width (negative = overlap)
|
||||||
@ -90,10 +99,25 @@ struct CompactHandView: View {
|
|||||||
cardWidth: cardWidth
|
cardWidth: cardWidth
|
||||||
)
|
)
|
||||||
.zIndex(Double(index))
|
.zIndex(Double(index))
|
||||||
|
.transition(
|
||||||
|
showAnimations
|
||||||
|
? .asymmetric(
|
||||||
|
insertion: .offset(x: Design.DealAnimation.offsetX, y: Design.DealAnimation.offsetY)
|
||||||
|
.combined(with: .opacity)
|
||||||
|
.combined(with: .scale(scale: Design.Scale.slightShrink)),
|
||||||
|
removal: .scale.combined(with: .opacity)
|
||||||
|
)
|
||||||
|
: .identity
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.animation(nil, value: cards.count) // Prevent size animation during dealing
|
.animation(
|
||||||
|
showAnimations
|
||||||
|
? .spring(duration: animationDuration, bounce: Design.Animation.springBounce)
|
||||||
|
: .none,
|
||||||
|
value: cards.count
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var winnerBorder: some View {
|
private var winnerBorder: some View {
|
||||||
@ -130,7 +154,9 @@ struct CompactHandView: View {
|
|||||||
cards: [],
|
cards: [],
|
||||||
cardsFaceUp: [],
|
cardsFaceUp: [],
|
||||||
isWinner: false,
|
isWinner: false,
|
||||||
containerWidth: 160
|
containerWidth: 160,
|
||||||
|
showAnimations: true,
|
||||||
|
dealingSpeed: 1.0
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -145,7 +171,9 @@ struct CompactHandView: View {
|
|||||||
],
|
],
|
||||||
cardsFaceUp: [true, true],
|
cardsFaceUp: [true, true],
|
||||||
isWinner: false,
|
isWinner: false,
|
||||||
containerWidth: 160
|
containerWidth: 160,
|
||||||
|
showAnimations: true,
|
||||||
|
dealingSpeed: 1.0
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -161,7 +189,9 @@ struct CompactHandView: View {
|
|||||||
],
|
],
|
||||||
cardsFaceUp: [true, true, true],
|
cardsFaceUp: [true, true, true],
|
||||||
isWinner: true,
|
isWinner: true,
|
||||||
containerWidth: 160
|
containerWidth: 160,
|
||||||
|
showAnimations: true,
|
||||||
|
dealingSpeed: 1.0
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -176,7 +206,9 @@ struct CompactHandView: View {
|
|||||||
],
|
],
|
||||||
cardsFaceUp: [false, false],
|
cardsFaceUp: [false, false],
|
||||||
isWinner: false,
|
isWinner: false,
|
||||||
containerWidth: 160
|
containerWidth: 160,
|
||||||
|
showAnimations: true,
|
||||||
|
dealingSpeed: 1.0
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user