package blocksthatfall;
import org.newdawn.slick.Color;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.Input;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.state.BasicGameState;
import org.newdawn.slick.state.StateBasedGame;
public class GamePlayState extends BasicGameState {
int stateID = -1;
GamePlayState(int stateID) {
this.stateID = stateID;
}
@Override
public int getID() {
return stateID;
}
PieceFactory pieceFactory;
int blockSize;
int pitPositionX;
int pitPositionY;
Pit pit;
Piece piece;
Piece nextPiece;
int score;
boolean paused = false;
static int DELAY = 300;
int deltaCounter = DELAY;
int deltaInput = DELAY/4;
int posX;
int posY;
@Override
public void init(GameContainer gc, StateBasedGame sbg) throws SlickException {
pieceFactory = new PieceFactory();
blockSize = 28;
pit = new Pit(10, 20);
pitPositionX = blockSize*9;
pitPositionY = (600 - blockSize*pit.height)/2;
piece = pieceFactory.generateRandomPiece();
nextPiece = pieceFactory.generateRandomPiece();
posX = (pit.width - piece.getMatrix().toArray().length)/2;
posY = -piece.getBlankLinesAtTop();
score = 0;
}
@Override
public void render(GameContainer gc, StateBasedGame sbg, Graphics grphcs) throws SlickException {
grphcs.setColor(Color.black);
drawBorder(grphcs);
drawPit(grphcs);
drawPiece(grphcs, piece, pitPositionX+posX*blockSize, pitPositionY+posY*blockSize);
drawNextPiece(grphcs);
drawScore(grphcs);
if(paused) {
Color fadedWhite = new Color(0, 0, 0, 0.7f);
grphcs.setColor(fadedWhite);
grphcs.fillRect(0, 0, 800, 600);
grphcs.setColor(Color.black);
grphcs.drawString("GAME PAUSED", pitPositionX+blockSize*3, pitPositionX);
}
}
@Override
public void update(GameContainer gc, StateBasedGame sbg, int delta) throws SlickException {
Input in = gc.getInput();
if(in.isKeyDown(Input.KEY_ESCAPE)) gc.exit();
if(in.isKeyPressed(Input.KEY_P)) paused = !paused;
if(paused) return;
score += pit.eraseFullLines();
if(in.isKeyDown(Input.KEY_DOWN)) DELAY = 50;
else {DELAY = 300; }
deltaCounter -= delta;
if(deltaCounter <= 0) {
boolean collides = pit.pieceCollidesAt(piece, posX, posY+1);
if(!collides) posY += 1;
else {
pit.insertPieceAt(piece, posX, posY);
piece = nextPiece;
nextPiece = pieceFactory.generateRandomPiece();
posX = (pit.width - piece.getMatrix().toArray().length)/2;
posY= -piece.getBlankLinesAtTop();
if(pit.pieceCollidesAt(piece, posX, posY)) {
BlocksThatFall.score = score;
sbg.enterState(BlocksThatFall.GAMEOVERSTATE);
init(gc, sbg);
}
deltaCounter = DELAY;
return;
}
deltaCounter = DELAY;
}
if(in.isKeyPressed(Input.KEY_SPACE)) {
Piece rotatedPiece = piece.rotated();
if(!pit.pieceCollidesAt(rotatedPiece, posX, posY)) {
piece = rotatedPiece;
}
}
deltaInput -= delta;
if(deltaInput <= 0) {
boolean leftDown = in.isKeyDown(Input.KEY_LEFT);
boolean rightDown = in.isKeyDown(Input.KEY_RIGHT);
if(leftDown || rightDown) {
if(leftDown && !pit.pieceCollidesAt(piece, posX-1, posY)) posX -= 1;
else if(rightDown && !pit.pieceCollidesAt(piece, posX+1, posY)) posX += 1;
}
deltaInput = DELAY/4;
}
}
void drawBorder(Graphics g) {
g.drawRect(pitPositionX, pitPositionY, blockSize*pit.width, blockSize*pit.height);
}
void drawPit(Graphics g) {
for(int j=0; j < pit.height; j++) {
for(int i=0; i < pit.width; i++) {
if(pit.getBlockAt(i, j) != 0) g.fillRect(pitPositionX+blockSize*i, pitPositionY+blockSize*j, blockSize, blockSize);
}
}
}
void drawNextPiece(Graphics g) {
drawPiece(g, nextPiece, pitPositionX+pit.width*blockSize+blockSize, pitPositionY);
}
void drawScore(Graphics g) {
g.drawString("Score: "+score, pitPositionX+pit.width*blockSize+blockSize, pitPositionY+5*blockSize);
}
void drawPiece(Graphics g, Piece piece, int x, int y) {
int[][] matrix = piece.getMatrix().toArray();
for(int j=0; j < matrix.length; j++) {
for(int i=0; i < matrix[j].length; i++) {
if(matrix[j][i] != 0) {
g.fillRect(x+blockSize*i, y+blockSize*j, blockSize, blockSize);
}
}
}
}
}