Starting to create split play view
Change-Id: Ic2b9f68ac53b49cd34cb98db7e8de2e6cd22b44b
diff --git a/go/src/hearts/img/uistate/uistate.go b/go/src/hearts/img/uistate/uistate.go
index 5d084a1..a4b7617 100644
--- a/go/src/hearts/img/uistate/uistate.go
+++ b/go/src/hearts/img/uistate/uistate.go
@@ -32,6 +32,7 @@
Table View = "Table"
Play View = "Play"
Score View = "Score"
+ Split View = "Split"
)
const (
diff --git a/go/src/hearts/img/view/view.go b/go/src/hearts/img/view/view.go
index 1d97c8b..c56a5c3 100644
--- a/go/src/hearts/img/view/view.go
+++ b/go/src/hearts/img/view/view.go
@@ -119,7 +119,7 @@
u.Cards = append(u.Cards, dropCard)
}
// adding 4 player icons, text, and device icons
- playerIconImage := u.CurTable.GetPlayers()[0].GetImage()
+ playerIconImage := u.CurTable.GetPlayers()[0].GetIconImage()
playerIconX := (u.WindowSize.X - u.PlayerIconDim.X) / 2
playerIconY := u.WindowSize.Y - u.TableCardDim.Y - u.BottomPadding - u.Padding - u.PlayerIconDim.Y
playerIconPos := coords.MakeVec(playerIconX, playerIconY)
@@ -137,13 +137,13 @@
u.BackgroundImgs = append(u.BackgroundImgs, img)
}
// player 0's device icon
- deviceIconImage := u.Texs["phoneIcon.png"]
+ deviceIconImage := u.CurTable.GetPlayers()[0].GetDeviceImage()
deviceIconDim := u.PlayerIconDim.DividedBy(2)
deviceIconPos := coords.MakeVec(playerIconPos.X+u.PlayerIconDim.X, playerIconPos.Y)
u.BackgroundImgs = append(u.BackgroundImgs,
texture.MakeImgWithoutAlt(deviceIconImage, deviceIconPos, deviceIconDim, u.Eng, u.Scene))
// player 1's icon
- playerIconImage = u.CurTable.GetPlayers()[1].GetImage()
+ playerIconImage = u.CurTable.GetPlayers()[1].GetIconImage()
playerIconX = u.BottomPadding
playerIconY = (u.WindowSize.Y+2*u.BottomPadding+u.PlayerIconDim.Y-
(float32(len(u.CurTable.GetPlayers()[1].GetHand()))*
@@ -164,12 +164,12 @@
u.BackgroundImgs = append(u.BackgroundImgs, img)
}
// player 1's device icon
- deviceIconImage = u.Texs["tabletIcon.png"]
+ deviceIconImage = u.CurTable.GetPlayers()[1].GetDeviceImage()
deviceIconPos = coords.MakeVec(playerIconPos.X+u.PlayerIconDim.X, playerIconPos.Y+u.PlayerIconDim.Y-deviceIconDim.Y)
u.BackgroundImgs = append(u.BackgroundImgs,
texture.MakeImgWithoutAlt(deviceIconImage, deviceIconPos, deviceIconDim, u.Eng, u.Scene))
// player 2's icon
- playerIconImage = u.CurTable.GetPlayers()[2].GetImage()
+ playerIconImage = u.CurTable.GetPlayers()[2].GetIconImage()
playerIconX = (u.WindowSize.X - u.PlayerIconDim.X) / 2
playerIconY = u.TopPadding + u.TableCardDim.Y + u.Padding
playerIconPos = coords.MakeVec(playerIconX, playerIconY)
@@ -187,12 +187,12 @@
u.BackgroundImgs = append(u.BackgroundImgs, img)
}
// player 2's device icon
- deviceIconImage = u.Texs["watchIcon.png"]
+ deviceIconImage = u.CurTable.GetPlayers()[2].GetDeviceImage()
deviceIconPos = coords.MakeVec(playerIconPos.X+u.PlayerIconDim.X, playerIconPos.Y+u.PlayerIconDim.Y-deviceIconDim.Y)
u.BackgroundImgs = append(u.BackgroundImgs,
texture.MakeImgWithoutAlt(deviceIconImage, deviceIconPos, deviceIconDim, u.Eng, u.Scene))
// player 3's icon
- playerIconImage = u.CurTable.GetPlayers()[3].GetImage()
+ playerIconImage = u.CurTable.GetPlayers()[3].GetIconImage()
playerIconX = u.WindowSize.X - u.BottomPadding - u.PlayerIconDim.X
playerIconY = (u.WindowSize.Y+2*u.BottomPadding+u.PlayerIconDim.Y-
(float32(len(u.CurTable.GetPlayers()[3].GetHand()))*
@@ -213,7 +213,7 @@
u.BackgroundImgs = append(u.BackgroundImgs, img)
}
// player 3's device icon
- deviceIconImage = u.Texs["laptopIcon.png"]
+ deviceIconImage = u.CurTable.GetPlayers()[3].GetDeviceImage()
deviceIconPos = coords.MakeVec(playerIconPos.X-deviceIconDim.X, playerIconPos.Y+u.PlayerIconDim.Y-deviceIconDim.Y)
u.BackgroundImgs = append(u.BackgroundImgs,
texture.MakeImgWithoutAlt(deviceIconImage, deviceIconPos, deviceIconDim, u.Eng, u.Scene))
@@ -254,12 +254,7 @@
addHeader(u)
addScoreViewHeaderText(u)
addPlayerScores(roundScores, u)
- if len(winners) > 0 {
- addScoreButton(true, u)
- } else {
- addScoreButton(false, u)
- }
-
+ addScoreButton(len(winners) > 0, u)
}
// Pass View: Shows player's hand and allows them to pass cards
@@ -299,17 +294,7 @@
resetScene(u)
addPlaySlot(u)
addHand(u)
- var turnText string
- playerTurnNum := u.CurTable.WhoseTurn()
- if playerTurnNum == -1 || !u.CurTable.AllDonePassing() {
- turnText = "Waiting for other players"
- } else if playerTurnNum == u.CurPlayerIndex {
- turnText = "Your turn"
- } else {
- name := u.CurTable.GetPlayers()[playerTurnNum].GetName()
- turnText = name + "'s turn"
- }
- addPlayHeader(turnText, u)
+ addPlayHeader(getTurnText(u), u)
if u.Debug {
addDebugBar(u)
}
@@ -319,6 +304,18 @@
}
}
+func LoadSplitView(u *uistate.UIState) {
+ u.CurView = uistate.Split
+ resetImgs(u)
+ resetScene(u)
+ addHand(u)
+ addPlayHeader(getTurnText(u), u)
+ addSplitViewPlayerIcons(u)
+ if u.Debug {
+ addDebugBar(u)
+ }
+}
+
func ChangePlayMessage(message string, u *uistate.UIState) {
// remove text and replace with message
var emptyTex sprite.SubTex
@@ -331,6 +328,98 @@
addPlayHeader(message, u)
}
+func addSplitViewPlayerIcons(u *uistate.UIState) {
+ topOfBanner := u.WindowSize.Y - 4*u.CardDim.Y - 5*u.Padding - u.BottomPadding - 40
+ splitWindowSize := coords.MakeVec(u.WindowSize.X, topOfBanner+u.TopPadding)
+ dropTargetImage := u.Texs["trickDrop.png"]
+ dropTargetAlt := u.Texs["trickDropBlue.png"]
+ dropTargetDimensions := u.CardDim
+ playerIconDimensions := u.CardDim.Minus(2)
+ // first drop target
+ dropTargetX := (splitWindowSize.X - u.CardDim.X) / 2
+ dropTargetY := splitWindowSize.Y/2 + u.Padding
+ dropTargetPos := coords.MakeVec(dropTargetX, dropTargetY)
+ u.DropTargets = append(u.DropTargets,
+ texture.MakeImgWithAlt(dropTargetImage, dropTargetAlt, dropTargetPos, dropTargetDimensions, true, u.Eng, u.Scene))
+ // first player icon
+ playerIconImage := u.CurTable.GetPlayers()[u.CurPlayerIndex].GetIconImage()
+ u.BackgroundImgs = append(u.BackgroundImgs,
+ texture.MakeImgWithoutAlt(playerIconImage, dropTargetPos.Plus(1), playerIconDimensions, u.Eng, u.Scene))
+ // card on top of first drop target
+ dropCard := u.CurTable.GetTrick()[u.CurPlayerIndex]
+ if dropCard != nil {
+ texture.PopulateCardImage(dropCard, u.Texs, u.Eng, u.Scene)
+ dropCard.Move(dropTargetPos, dropTargetDimensions, u.Eng)
+ u.TableCards = append(u.TableCards, dropCard)
+ }
+ // second drop target
+ dropTargetY = (splitWindowSize.Y - u.CardDim.Y) / 2
+ dropTargetX = splitWindowSize.X/2 - 3*u.CardDim.X/2 - u.Padding
+ dropTargetPos = coords.MakeVec(dropTargetX, dropTargetY)
+ u.DropTargets = append(u.DropTargets,
+ texture.MakeImgWithAlt(dropTargetImage, dropTargetAlt, dropTargetPos, dropTargetDimensions, true, u.Eng, u.Scene))
+ // second player icon
+ playerIconImage = u.CurTable.GetPlayers()[(u.CurPlayerIndex+1)%len(u.CurTable.GetPlayers())].GetIconImage()
+ u.BackgroundImgs = append(u.BackgroundImgs,
+ texture.MakeImgWithoutAlt(playerIconImage, dropTargetPos.Plus(1), playerIconDimensions, u.Eng, u.Scene))
+ // card on top of second drop target
+ dropCard = u.CurTable.GetTrick()[(u.CurPlayerIndex+1)%len(u.CurTable.GetPlayers())]
+ if dropCard != nil {
+ texture.PopulateCardImage(dropCard, u.Texs, u.Eng, u.Scene)
+ dropCard.Move(dropTargetPos, dropTargetDimensions, u.Eng)
+ u.TableCards = append(u.TableCards, dropCard)
+ }
+ // third drop target
+ dropTargetX = (splitWindowSize.X - u.CardDim.X) / 2
+ dropTargetY = splitWindowSize.Y/2 - u.Padding - u.CardDim.Y
+ dropTargetPos = coords.MakeVec(dropTargetX, dropTargetY)
+ u.DropTargets = append(u.DropTargets,
+ texture.MakeImgWithAlt(dropTargetImage, dropTargetAlt, dropTargetPos, dropTargetDimensions, true, u.Eng, u.Scene))
+ // third player icon
+ playerIconImage = u.CurTable.GetPlayers()[(u.CurPlayerIndex+2)%len(u.CurTable.GetPlayers())].GetIconImage()
+ u.BackgroundImgs = append(u.BackgroundImgs,
+ texture.MakeImgWithoutAlt(playerIconImage, dropTargetPos.Plus(1), playerIconDimensions, u.Eng, u.Scene))
+ // card on top of third drop target
+ dropCard = u.CurTable.GetTrick()[(u.CurPlayerIndex+2)%len(u.CurTable.GetPlayers())]
+ if dropCard != nil {
+ texture.PopulateCardImage(dropCard, u.Texs, u.Eng, u.Scene)
+ dropCard.Move(dropTargetPos, dropTargetDimensions, u.Eng)
+ u.TableCards = append(u.TableCards, dropCard)
+ }
+ // fourth drop target
+ dropTargetY = (splitWindowSize.Y - u.CardDim.Y) / 2
+ dropTargetX = splitWindowSize.X/2 + u.CardDim.X/2 + u.Padding
+ dropTargetPos = coords.MakeVec(dropTargetX, dropTargetY)
+ u.DropTargets = append(u.DropTargets,
+ texture.MakeImgWithAlt(dropTargetImage, dropTargetAlt, dropTargetPos, dropTargetDimensions, true, u.Eng, u.Scene))
+ // fourth player icon
+ playerIconImage = u.CurTable.GetPlayers()[(u.CurPlayerIndex+3)%len(u.CurTable.GetPlayers())].GetIconImage()
+ u.BackgroundImgs = append(u.BackgroundImgs,
+ texture.MakeImgWithoutAlt(playerIconImage, dropTargetPos.Plus(1), playerIconDimensions, u.Eng, u.Scene))
+ // card on top of fourth drop target
+ dropCard = u.CurTable.GetTrick()[(u.CurPlayerIndex+3)%len(u.CurTable.GetPlayers())]
+ if dropCard != nil {
+ texture.PopulateCardImage(dropCard, u.Texs, u.Eng, u.Scene)
+ dropCard.Move(dropTargetPos, dropTargetDimensions, u.Eng)
+ u.TableCards = append(u.TableCards, dropCard)
+ }
+}
+
+// returns a string which says whose turn it is
+func getTurnText(u *uistate.UIState) string {
+ var turnText string
+ playerTurnNum := u.CurTable.WhoseTurn()
+ if playerTurnNum == -1 || !u.CurTable.AllDonePassing() {
+ turnText = "Waiting for other players"
+ } else if playerTurnNum == u.CurPlayerIndex {
+ turnText = "Your turn"
+ } else {
+ name := u.CurTable.GetPlayers()[playerTurnNum].GetName()
+ turnText = name + "'s turn"
+ }
+ return turnText
+}
+
func addHeader(u *uistate.UIState) {
// adding blue banner
headerImage := u.Texs["RoundedRectangle-DBlue.png"]
@@ -343,20 +432,33 @@
func addPlayHeader(message string, u *uistate.UIState) {
// adding blue banner
headerImage := u.Texs["Rectangle-DBlue.png"]
- headerPos := coords.MakeVec(0, 0)
- headerDimensions := coords.MakeVec(u.WindowSize.X, float32(50))
+ var headerDimensions *coords.Vec
+ var headerPos *coords.Vec
+ if u.CurView == uistate.Play {
+ headerDimensions = coords.MakeVec(u.WindowSize.X, float32(50))
+ headerPos = coords.MakeVec(0, 0)
+ } else {
+ headerDimensions = coords.MakeVec(u.WindowSize.X, float32(40))
+ topOfHand := u.WindowSize.Y - 4*(u.CardDim.Y+u.Padding) - u.BottomPadding
+ headerPos = coords.MakeVec(0, topOfHand-headerDimensions.Y-u.Padding)
+ }
u.BackgroundImgs = append(u.BackgroundImgs,
texture.MakeImgWithoutAlt(headerImage, headerPos, headerDimensions, u.Eng, u.Scene))
// adding pull tab
pullTabImage := u.Texs["HorizontalPullTab.png"]
pullTabDim := u.CardDim.DividedBy(2)
- pullTabPos := headerDimensions.MinusVec(pullTabDim).Minus(u.Padding)
+ pullTabPos := headerPos.PlusVec(headerDimensions).MinusVec(pullTabDim).Minus(u.Padding)
u.Buttons = append(u.Buttons,
texture.MakeImgWithoutAlt(pullTabImage, pullTabPos, pullTabDim, u.Eng, u.Scene))
// adding text
color := "DBlue"
scaler := float32(4)
- center := coords.MakeVec(u.WindowSize.X/2, 20)
+ var center *coords.Vec
+ if u.CurView == uistate.Play {
+ center = coords.MakeVec(u.WindowSize.X/2, headerPos.Y+20)
+ } else {
+ center = coords.MakeVec(u.WindowSize.X/2, headerPos.Y+10)
+ }
maxWidth := u.WindowSize.X - pullTabDim.X*2 - u.Padding*4
u.BackgroundImgs = append(u.BackgroundImgs,
texture.MakeStringImgCenterAlign(message, color, color, true, center, scaler, maxWidth, u)...)
@@ -625,7 +727,7 @@
u.BackgroundImgs = append(u.BackgroundImgs,
texture.MakeImgWithoutAlt(dividerImage, dividerPos, dividerDim, u.Eng, u.Scene))
// player icon
- playerIconImage := p.GetImage()
+ playerIconImage := p.GetIconImage()
playerIconDim := coords.MakeVec(rowHeight/2, rowHeight/2)
playerIconPos := coords.MakeVec(u.WindowSize.X/4-playerIconDim.X/2, top+(float32(i)+.5)*rowHeight+rowHeight/7)
u.BackgroundImgs = append(u.BackgroundImgs,
diff --git a/go/src/hearts/logic/player/player.go b/go/src/hearts/logic/player/player.go
index abaa220..4f61379 100644
--- a/go/src/hearts/logic/player/player.go
+++ b/go/src/hearts/logic/player/player.go
@@ -12,33 +12,35 @@
)
// Returns a player instance with playerIndex equal to index
-func NewPlayer(index int, name string, tex sprite.SubTex) *Player {
+func NewPlayer(index int, name string, iconTex, deviceTex sprite.SubTex) *Player {
return &Player{
- hand: nil,
- tricks: make([]*card.Card, 0),
- score: 0,
- playerIndex: index,
- playerName: name,
- playerImage: tex,
- donePassing: false,
- doneTaking: false,
- doneScoring: false,
+ hand: nil,
+ tricks: make([]*card.Card, 0),
+ score: 0,
+ playerIndex: index,
+ playerName: name,
+ playerIconImage: iconTex,
+ playerDeviceImage: deviceTex,
+ donePassing: false,
+ doneTaking: false,
+ doneScoring: false,
}
}
type Player struct {
- hand []*card.Card
- passedFrom []*card.Card
- passedTo []*card.Card
- tricks []*card.Card
- score int
- playerIndex int
- playerName string
- playerImage sprite.SubTex
- donePassing bool
- doneTaking bool
- donePlaying bool
- doneScoring bool
+ hand []*card.Card
+ passedFrom []*card.Card
+ passedTo []*card.Card
+ tricks []*card.Card
+ score int
+ playerIndex int
+ playerName string
+ playerIconImage sprite.SubTex
+ playerDeviceImage sprite.SubTex
+ donePassing bool
+ doneTaking bool
+ donePlaying bool
+ doneScoring bool
}
// Returns the hand of p
@@ -70,8 +72,12 @@
return p.playerName
}
-func (p *Player) GetImage() sprite.SubTex {
- return p.playerImage
+func (p *Player) GetIconImage() sprite.SubTex {
+ return p.playerIconImage
+}
+
+func (p *Player) GetDeviceImage() sprite.SubTex {
+ return p.playerDeviceImage
}
// Returns true if p has finished the pass phase of the current round
diff --git a/go/src/hearts/logic/table/table.go b/go/src/hearts/logic/table/table.go
index 073d2b4..74ed5ba 100644
--- a/go/src/hearts/logic/table/table.go
+++ b/go/src/hearts/logic/table/table.go
@@ -19,9 +19,10 @@
func InitializeGame(numPlayers int, texs map[string]sprite.SubTex) *Table {
players := make([]*player.Player, 0)
names := []string{"YoungSeok", "Dan", "Emily", "Ross"}
- images := []sprite.SubTex{texs["player0.jpeg"], texs["player1.jpeg"], texs["player2.jpeg"], texs["player3.jpeg"]}
+ iconImages := []sprite.SubTex{texs["player0.jpeg"], texs["player1.jpeg"], texs["player2.jpeg"], texs["player3.jpeg"]}
+ deviceImages := []sprite.SubTex{texs["laptopIcon.png"], texs["watchIcon.png"], texs["tabletIcon.png"], texs["phoneIcon.png"]}
for i := 0; i < numPlayers; i++ {
- players = append(players, player.NewPlayer(i, names[i], images[i]))
+ players = append(players, player.NewPlayer(i, names[i], iconImages[i], deviceImages[i]))
}
t := makeTable(players)
t.GenerateClassicCards()
diff --git a/go/src/hearts/touchhandler/touchhandler.go b/go/src/hearts/touchhandler/touchhandler.go
index 645e3a0..89d63af 100644
--- a/go/src/hearts/touchhandler/touchhandler.go
+++ b/go/src/hearts/touchhandler/touchhandler.go
@@ -58,6 +58,15 @@
case "end":
endClickPlay(t, u)
}
+ case uistate.Split:
+ switch t.Type.String() {
+ case "begin":
+ beginClickSplit(t, u)
+ case "move":
+ moveClickSplit(t, u)
+ case "end":
+ endClickSplit(t, u)
+ }
case uistate.Score:
switch t.Type.String() {
case "begin":
@@ -261,6 +270,7 @@
if u.Debug {
if u.Buttons[0] == buttonList[0] {
u.CurImg = u.Buttons[0]
+ view.LoadSplitView(u)
} else if u.Buttons[1] == buttonList[0] {
view.LoadTableView(u)
} else if u.Buttons[2] == buttonList[0] {
@@ -298,6 +308,19 @@
u.CurCard = nil
}
+func beginClickSplit(t touch.Event, u *uistate.UIState) {
+ buttonList := findClickedButton(t, u)
+ if len(buttonList) > 0 {
+ view.LoadPlayView(u)
+ }
+}
+
+func moveClickSplit(t touch.Event, u *uistate.UIState) {
+}
+
+func endClickSplit(t touch.Event, u *uistate.UIState) {
+}
+
func beginClickScore(t touch.Event, u *uistate.UIState) {
buttonList := findClickedButton(t, u)
if len(buttonList) > 0 {