// @flow import * as React from 'react'; import {Alert, View} from 'react-native'; import {IconButton, Text, withTheme} from 'react-native-paper'; import {MaterialCommunityIcons} from "@expo/vector-icons"; import GameLogic from "./GameLogic"; import Grid from "./components/Grid"; import HeaderButton from "../../components/HeaderButton"; type Props = { navigation: Object, } type State = { grid: Array>, gameRunning: boolean, gameTime: number, gameScore: number } class TetrisScreen extends React.Component { colors: Object; logic: GameLogic; onTick: Function; onGameEnd: Function; updateGrid: Function; constructor(props) { super(props); this.colors = props.theme.colors; this.logic = new GameLogic(20, 10, this.colors); this.state = { grid: this.logic.getEmptyGrid(), gameRunning: false, gameTime: 0, gameScore: 0, }; this.onTick = this.onTick.bind(this); this.onGameEnd = this.onGameEnd.bind(this); this.updateGrid = this.updateGrid.bind(this); this.props.navigation.addListener('blur', this.onScreenBlur.bind(this)); this.props.navigation.addListener('focus', this.onScreenFocus.bind(this)); } componentDidMount() { const rightButton = this.getRightButton.bind(this); this.props.navigation.setOptions({ headerRight: rightButton, }); this.startGame(); } getRightButton() { return ( this.togglePause()}/> ); } /** * Remove any interval on un-focus */ onScreenBlur() { if (!this.logic.isGamePaused()) this.logic.togglePause(); } onScreenFocus() { if (!this.logic.isGameRunning()) this.startGame(); else if (this.logic.isGamePaused()) this.showPausePopup(); } onTick(time: number, score: number, newGrid: Array>) { this.setState({ gameTime: time, gameScore: score, grid: newGrid, }); } updateGrid(newGrid: Array>) { this.setState({ grid: newGrid, }); } togglePause() { this.logic.togglePause(); if (this.logic.isGamePaused()) this.showPausePopup(); } showPausePopup() { Alert.alert( 'PAUSE', 'GAME PAUSED', [ {text: 'RESTART', onPress: () => this.showRestartConfirm()}, {text: 'RESUME', onPress: () => this.togglePause()}, ], {cancelable: false}, ); } showRestartConfirm() { Alert.alert( 'RESTART?', 'WHOA THERE', [ {text: 'NO', onPress: () => this.showPausePopup()}, {text: 'YES', onPress: () => this.startGame()}, ], {cancelable: false}, ); } showGameOverConfirm() { Alert.alert( 'GAME OVER', 'NOOB', [ {text: 'LEAVE', onPress: () => this.props.navigation.goBack()}, {text: 'RESTART', onPress: () => this.startGame()}, ], {cancelable: false}, ); } startGame() { this.logic.startGame(this.onTick, this.onGameEnd); this.setState({ gameRunning: true, }); } onGameEnd(time: number, score: number, isRestart: boolean) { this.setState({ gameTime: time, gameScore: score, gameRunning: false, }); if (!isRestart) this.showGameOverConfirm(); } render() { return ( {this.state.gameTime} {this.state.gameScore} this.logic.rotatePressed(this.updateGrid)} /> this.logic.leftPressed(this.updateGrid)} /> this.logic.rightPressed(this.updateGrid)} /> this.logic.rightPressed(this.updateGrid)} /> ); } } export default withTheme(TetrisScreen);