From 496f0610593272a0391634673f7c0cf510355d63 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Wed, 16 Oct 2019 14:39:18 -0400 Subject: [PATCH] Show upcoming tetrominoes --- Tetris/ContentView.swift | 45 +++++++++++++++++++----------- TetrisKit/GameController.swift | 4 ++- TetrisUI/NextTetrominoesView.swift | 32 +++++++++++++++++++++ 3 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 TetrisUI/NextTetrominoesView.swift diff --git a/Tetris/ContentView.swift b/Tetris/ContentView.swift index 6e0a77c..335aecd 100644 --- a/Tetris/ContentView.swift +++ b/Tetris/ContentView.swift @@ -22,25 +22,35 @@ struct ContentView: View { var body: some View { GeometryReader { (geometry) in VStack { - HStack { - Text("Held:") - if self.controller.heldTetromino != nil { - Group { - TetrominoView(tetromino: self.controller.heldTetromino!) - }.frame(width: 50, height: 50, alignment: .center) - } else { - Rectangle().foregroundColor(.clear).frame(width: 50, height: 50) + Spacer() + HStack(alignment: .top, spacing: 8) { + VStack { + Text("Held") + if self.controller.heldTetromino != nil { + Group { + TetrominoView(tetromino: self.controller.heldTetromino!) + }.frame(width: 50, height: 50, alignment: .center) + } else { + Rectangle().foregroundColor(.clear).frame(width: 50, height: 50) + } } + .padding(.leading, 8) + BoardView(board: self.$controller.board, currentPiece: self.$controller.currentPiece, droppedPiece: self.$controller.currentPieceAtDropPoint) + .aspectRatio(CGSize(width: self.controller.width, height: self.controller.height), contentMode: .fit) + .onAppear(perform: self.startTimer) + .onDisappear(perform: self.stopTimer) + .onTapGesture(perform: self.onTap) + .gesture(self.horizDragGesture(geometry: geometry).simultaneously(with: self.verticalDragGesture)) + // .gesture(ExclusiveGesture(horizDragGesture, verticalDragGesture)) + // .gesture(horizDragGesture.simultaneously(with: verticalDragGesture)) + + VStack { + Text("Next") + NextTetromioesView(tetrominoes: self.controller.nextTetrominoes).frame(width: 50) + } + .padding(.trailing, 8) } - BoardView(board: self.$controller.board, currentPiece: self.$controller.currentPiece, droppedPiece: self.$controller.currentPieceAtDropPoint) - .aspectRatio(CGSize(width: self.controller.width, height: self.controller.height), contentMode: .fit) - .onAppear(perform: self.startTimer) - .onDisappear(perform: self.stopTimer) - .onTapGesture(perform: self.onTap) - .gesture(self.horizDragGesture(geometry: geometry).simultaneously(with: self.verticalDragGesture)) - // .gesture(ExclusiveGesture(horizDragGesture, verticalDragGesture)) - // .gesture(horizDragGesture.simultaneously(with: verticalDragGesture)) - + Spacer() HStack { Button(action: { self.controller.rotate(direction: .counterClockwise) }) { Image(systemName: "gobackward").resizable().frame(width: 50, height: 50) @@ -55,6 +65,7 @@ struct ContentView: View { .frame(width: 150, height: 150) .padding(.trailing, 25) } + Spacer() } } } diff --git a/TetrisKit/GameController.swift b/TetrisKit/GameController.swift index 0e3c503..91e2e1c 100644 --- a/TetrisKit/GameController.swift +++ b/TetrisKit/GameController.swift @@ -24,6 +24,7 @@ public class GameController: ObservableObject { } } @Published public var currentPieceAtDropPoint: GamePiece? + @Published public var nextTetrominoes: [Tetromino] = [.random(), .random(), .random()] @Published public var heldTetromino: Tetromino? public var ended: Bool { @@ -41,8 +42,9 @@ public class GameController: ObservableObject { } func nextPiece() { - let tetromino = Tetromino.random() + let tetromino = nextTetrominoes.removeFirst() currentPiece = GamePiece(tetromino: tetromino, topLeft: ((width - tetromino.shape.count) / 2, 0)) + nextTetrominoes.append(.random()) } func finalizePiece() { diff --git a/TetrisUI/NextTetrominoesView.swift b/TetrisUI/NextTetrominoesView.swift new file mode 100644 index 0000000..8c4cbc4 --- /dev/null +++ b/TetrisUI/NextTetrominoesView.swift @@ -0,0 +1,32 @@ +// +// NextTetrominoesView.swift +// Tetris +// +// Created by Shadowfacts on 10/16/19. +// Copyright © 2019 Shadowfacts. All rights reserved. +// + +import SwiftUI +import TetrisKit + +public struct NextTetromioesView: View { + let tetrominoes: [Tetromino] + + public init(tetrominoes: [Tetromino]) { + self.tetrominoes = tetrominoes + } + + public var body: some View { + VStack { + ForEach(0..