From 70f88140e06327e9a59938354184e1455895ac91 Mon Sep 17 00:00:00 2001 From: chris dillon Date: Wed, 18 Mar 2009 20:43:16 -0400 Subject: [PATCH] 090307a archive --- Block.pde | 20 ++-- LPiece.pde | 34 +++---- Piece.pde | 42 +++++--- PlayState.pde | 232 +++++++++++++++++++++++++++++++++++---------- applet/Tatris.java | 22 +++++ 5 files changed, 257 insertions(+), 93 deletions(-) create mode 100644 applet/Tatris.java diff --git a/Block.pde b/Block.pde index 778a364..3a0f551 100644 --- a/Block.pde +++ b/Block.pde @@ -22,21 +22,12 @@ class Block { stroke(0,150); // black border, mostly opaque strokeWeight(3); - //translate(x,y); fill(fillColor[0], fillColor[1], fillColor[2]); rect(this.x+x, this.y+y,height,width); - fill(255); - text(this.x+x + "," + this.y+y, this.x+x, this.y+y); - - /* - beginShape(); - vertex(-height/2, height/2); - vertex(-height/2, -height/2); - vertex(height/2, -height/2); - vertex(height/2, height/2); - endShape(CLOSE); - */ + // debug text + //fill(255); + //text(this.x+x + "," + this.y+y, this.x+x, this.y+y); } // dead grid calls this @@ -46,7 +37,10 @@ class Block { strokeWeight(3); fill(fillColor[0], fillColor[1], fillColor[2]); rect(this.x, this.y,height,width); - text(x + "," + y, x, y); + + // debug text + //fill(255); + //text(x + "," + y, x, y); } public void setX(float x) { diff --git a/LPiece.pde b/LPiece.pde index 599a04e..05bf22d 100644 --- a/LPiece.pde +++ b/LPiece.pde @@ -1,4 +1,4 @@ -class LPiece extends Piece implements Cloneable { +class LPiece extends Piece { /* 3 # @@ -30,14 +30,6 @@ class LPiece extends Piece implements Cloneable { super.round(blocks[1]); super.round(blocks[3]); } - - public Object clone() { - try { - return super.clone(); - } catch (Exception e) { - return null; - } - } public void setRotation(float angle) { this.rotation = angle; @@ -52,7 +44,7 @@ class LPiece extends Piece implements Cloneable { // are we more right? if (super.pivotPoint.getX() > wallWidth / 2) { if (super.pivotPoint.getX() + blockSize * 3 < wallWidth) { - println("nowhere close near east wall"); + //println("nowhere close near east wall"); return false; } else { float tmpRotation = rotation + 90.0f; @@ -64,29 +56,29 @@ class LPiece extends Piece implements Cloneable { tmpOffsetX[3] = sin(tmpRotation + radians(315)) * (blockSize + (blockSize / 2)); if (super.pivotPoint.getX()+tmpOffsetX[0] >= wallWidth) { - println("denied 0"); + //println("denied 0"); return true; } if (super.pivotPoint.getX()+tmpOffsetX[1] >= wallWidth) { - println("denied 1"); + //println("denied 1"); return true; } if (super.pivotPoint.getX()+tmpOffsetX[2] >= wallWidth) { - println("denied 2"); + //println("denied 2"); return true; } if (super.pivotPoint.getX()+tmpOffsetX[3] >= wallWidth) { - println("denied 3"); + //println("denied 3"); return true; } - println("allowed west"); + //println("allowed west"); return false; } // or are we more left? } else { if (super.pivotPoint.getX() - blockSize * 2 > wallStart) { - println("nowhere close near west wall"); + //println("nowhere close near west wall"); return false; } else { float tmpRotation = rotation + 90.0f; @@ -97,22 +89,22 @@ class LPiece extends Piece implements Cloneable { tmpOffsetX[2] = sin(tmpRotation + radians(270)) * blockSize; tmpOffsetX[3] = sin(tmpRotation + radians(315)) * (blockSize + (blockSize / 2)); if (super.pivotPoint.getX()+tmpOffsetX[0] < wallStart - blockSize/2) { - println("denied 0"); + //println("denied 0"); return true; } if (super.pivotPoint.getX()+tmpOffsetX[1] < wallStart - blockSize/2) { - println("denied 1"); + //println("denied 1"); return true; } if (super.pivotPoint.getX()+tmpOffsetX[2] < wallStart - blockSize/2) { - println("denied 2"); + //println("denied 2"); return true; } if (super.pivotPoint.getX()+tmpOffsetX[3] < wallStart - blockSize/2) { - println("denied 3"); + //println("denied 3"); return true; } - println("allowed east"); + //println("allowed east"); return false; } diff --git a/Piece.pde b/Piece.pde index 303dadc..ff64a00 100644 --- a/Piece.pde +++ b/Piece.pde @@ -1,7 +1,7 @@ import java.util.ArrayList; // blocks move together as one set of blocks, offset by shape pattern -class Piece implements Cloneable { +class Piece { float x; // center x float y; // center y @@ -14,14 +14,6 @@ class Piece implements Cloneable { } - public Object clone() { - try { - return super.clone(); - } catch (Exception e) { - return null; - } - } - public void draw() { for (int i=0; i < 4; i++) { blocks[i].draw(x,y); @@ -93,6 +85,34 @@ class Piece implements Cloneable { return greatest; } - - + // this is used when dropping pieces + public Block[] getMaxYBlocks() { + HashMap map = new HashMap(); + + for (int i=0; i test.getY()){ + map.put(blocks[i].getX(), blocks[i]); + } + } else { + map.put(blocks[i].getX(), blocks[i]); + } + + } + + Block returnBlocks[] = new Block[map.size()]; + int i = 0; + + Set mapset= map.keySet(); + Iterator iter = mapset.iterator(); + while(iter.hasNext()){ + Float currentKey = (Float)iter.next(); + returnBlocks[i++] = (Block)map.get(currentKey); + } + + return returnBlocks; + } + } \ No newline at end of file diff --git a/PlayState.pde b/PlayState.pde index 9c969ed..6d9806e 100644 --- a/PlayState.pde +++ b/PlayState.pde @@ -1,60 +1,47 @@ public class PlayState implements GameState { - + Piece currentPiece; - float blockSize; - Block deadGrid[][]; // the grid are the blocks that are done on the field Float gridSizeX; - Float gridSizeY; - + Float gridSizeY; Point2d playField[] = new Point2d[2]; - float timer; + boolean gameOver; public PlayState() { + gameOver = false; currentPiece = new LPiece(width/2,32.0f); - - blockSize=16.0f; - + blockSize=16.0f; gridSizeX = new Float(width/blockSize); gridSizeY = new Float(height/blockSize); deadGrid = new Block[gridSizeX.intValue() + 1][gridSizeY.intValue() + 1]; - playField[0] = new Point2d(blockSize, blockSize); // start playField[1] = new Point2d(256,480); // end + timer = 1.0f; - println(gridSizeX.intValue() + " " + gridSizeY.intValue()); + // create graphics offscreen size of play field + Float playFieldWidth = playField[0].getX() - playField[1].getX(); + Float playFieldHeight = playField[0].getY() - playField[1].getY(); - timer = 1.0f; + // TMP + drawPlayField(); } public void update(float elapsed) { currentPiece.update(); - timer -= elapsed; - // hit bottom, copy to deadGrid if (currentPiece.getMaxY() > playField[1].getY() - blockSize * 2) { copyToGrid(); - // check for done lines - currentPiece = new LPiece(width/2,32.0f); } + // this is the timed downward movement of the piece if (timer <= 0) { - - // move down one - //Piece testPiece = new Piece(); - //testPiece = (LPiece)currentPiece.clone(); - //testPiece.setY(testPiece.getY() + blockSize); - - - // won't hit, move down - if (! gridCollideY(currentPiece.getBlocks())) { + if (! gridCollideY(currentPiece.getBlocks())) { // won't hit, move down currentPiece.setY(currentPiece.getY() + blockSize); - } else { + } else { // we hit something, deadgrid it copyToGrid(); - currentPiece = new LPiece(width/2,32.0f); } timer = 1; @@ -66,9 +53,7 @@ public class PlayState implements GameState { // last drawn appears on top public void paint() { background(25); - drawPlayField(); - currentPiece.draw(); for (int x=0; x < gridSizeX.intValue(); x++) { @@ -77,39 +62,44 @@ public class PlayState implements GameState { } } - - + drawOverlay(); fill(255); text("fps: " + Math.round(fps * .1)/.1,8,8); - - - } + public GameState nextState() { - if (currentPiece.getY() > height) { - //return new GameOverState(); - currentPiece = new LPiece(32.0f,128.0f); - return this; + if (gameOver == true) { + return new GameOverState(); } else{ - return this; + return this; } - } + } + public void keyPressed() { + + // left arrow key if (keyCode == LEFT) { - currentPiece.setX(currentPiece.getX() - blockSize, playField[0].getX()); + if (! gridCollideX(currentPiece.getBlocks(), -1)) { + currentPiece.setX(currentPiece.getX() - blockSize, playField[0].getX()); + } } + // right arrow key if (keyCode == RIGHT) { - currentPiece.setX(currentPiece.getX() + blockSize, playField[1].getX()); + if (! gridCollideX(currentPiece.getBlocks(), 1)) { + currentPiece.setX(currentPiece.getX() + blockSize, playField[1].getX()); + } } + // up arrow key if (keyCode == UP) { if (! currentPiece.rotateCollide(playField[0].getX(), playField[1].getX())) { currentPiece.setRotation(currentPiece.getRotation() + radians(90)); } } + // down arrow key if (keyCode == DOWN) { // When player presses down, reset timer to make gameplay more // predictable and smooth. Pieces can fall "twice" otherwise. @@ -124,10 +114,98 @@ public class PlayState implements GameState { if (gridCollideY(currentPiece.getBlocks())) { println("collision on grid"); copyToGrid(); - currentPiece = new LPiece(width/2,32.0f); + } } + + // space bar + if (keyCode == ' ') { + // get greatest Y values + Block yBlocks[] = currentPiece.getMaxYBlocks(); + int columns[] = new int[yBlocks.length]; + for (int i=0; i < yBlocks.length; i++) { + columns[i] = (int)(yBlocks[i].getX() / blockSize); + //println (columns[i]); + } + + // search down columns with Y in current piece + Block hitPoint = null; + ArrayList hitPoints = new ArrayList(); + + boolean hitSomething = false; + float xStart = yBlocks[0].getY() / blockSize; + for (int col=0; col < columns.length; col++) { + for (int row=(int)xStart; row < (int)playField[1].getY() / blockSize; row++) { + //println ("checking col:" + columns[col] + " row:" + row); + + // hit something + if(deadGrid[(int)columns[col]][row] != null) { + println("there's something down there"); + hitSomething = true; + hitPoint = deadGrid[(int)columns[col]][row]; + hitPoints.add(hitPoint); + } + } + } + + if (hitSomething) { + + // TODO: finds too many hit points, do reverse MaxYBlock function on deadgrid + float closest = 0.0f; + Block closestBlock = null; + float distance = 0.0f; + + for (int i=0; i < yBlocks.length; i++) { + for (int j=0; j < hitPoints.size(); j++) { + Block b = (Block)hitPoints.get(j); + + println("ylen " + yBlocks.length + " hitlen" + hitPoints.size()); + + if (b.getX() == yBlocks[i].getX()) { + if (closest == 0.0f) { + println("b.getY()" + b.getY() + " yBlocks[j].getY()" + yBlocks[i].getY()); + closest = b.getY() - yBlocks[i].getY(); + } + if ((b.getY() - yBlocks[i].getY()) < closest ) { + closest = b.getY() - yBlocks[i].getY(); + closestBlock = b; + println(closestBlock.getX() + " " + closestBlock.getY()); + } + } + } + } + + // set x,y of piece minus offset of block + currentPiece.setY(currentPiece.getY() + closest - blockSize); + + // TODO: why do I have to do this instead of copyToGrid()? + timer = 0; + + } else { + // nothing below, just drop + println(playField[1].getY()); + currentPiece.setY(playField[1].getY() - blockSize * 2); + + // TODO: why do I have to do this instead of copyToGrid()? + timer = 0; + } + + + + /* + } else { + if (hitPoint.getY() < deadGrid[(int)columns[col]][row].getY()) { + hitPoint = deadGrid[(int)columns[col]][row]; + println("---HIT----" + hitPoint.getX() + " " + hitPoint.getY() ); + } + }*/ + + + + // copy to grid + + } } public void keyReleased() { @@ -145,6 +223,11 @@ public class PlayState implements GameState { //deadGrid[x][y] = new Block(x*blockSize, y*blockSize, blockSize, copyBlock[i].getFillColor()); deadGrid[x][y] = new Block(x*blockSize, y*blockSize, blockSize, "#444444"); } + + // TODO: check for done lines HERE + + // new piece HERE + currentPiece = new LPiece(playField[1].getX() / 2, 32.0f); } // check for blocks below current piece @@ -178,22 +261,75 @@ public class PlayState implements GameState { } } + // check for blocks on X, -1 is left, 1 is right + boolean gridCollideX(Block checkBlocks[], int direction) { + //Block copyBlock[] = currentPiece.getBlocks(); + + boolean hit = false; + + for (int i=0; i < 4; i++) { + Float fx = checkBlocks[i].getX() / blockSize; + Float fy = checkBlocks[i].getY() / blockSize; + + + //println("block" + i + " " + fx * blockSize + " " + fy * blockSize); + if (direction > 0) { + int x = fx.intValue() + 1; + int y = fy.intValue(); + // we hit something on the grid + if(deadGrid[x][y] != null) { + println("deny right"); + return true; + } + + } else { + int x = fx.intValue() - 1; + int y = fy.intValue(); + // we hit something on the grid + if(deadGrid[x][y] != null) { + println("deny left"); + return true; + } + + } + + + } + + return false; + /* + if (hit == true) { + return true; + } else { + return false; + }*/ + } + + + + // background art etc + // TODO: offscreen drawing void drawPlayField() { + background(25); // grid lines strokeWeight(1); stroke(0); - for (int i=0; i < height; i++) { - if ( (i%16) == 0) { - line(i,0,i,height); - line(0,i,width,i); + for (float i=playField[0].getX(); i < playField[1].getX(); i+=blockSize) { + for (float j=playField[0].getY(); j < playField[1].getY(); j+=blockSize) { + line(i, playField[0].getY(), i, playField[1].getY()); + line(playField[0].getX(), j, playField[1].getX(), j); } } + } + + // top most art + void drawOverlay() { // border box strokeWeight(3); stroke(255); line(playField[0].getX(), playField[0].getY(), playField[1].getX(), playField[0].getY()); // top line line(playField[1].getX(), playField[0].getY(), playField[1].getX(), playField[1].getY()); // right line line(playField[1].getX(), playField[1].getY(), playField[0].getX(), playField[1].getY()); // bottom line - line(playField[0].getX(), playField[1].getY(), playField[0].getX(), playField[0].getY()); // left line + line(playField[0].getX(), playField[1].getY(), playField[0].getX(), playField[0].getY()); // left line } } \ No newline at end of file diff --git a/applet/Tatris.java b/applet/Tatris.java new file mode 100644 index 0000000..4b078d7 --- /dev/null +++ b/applet/Tatris.java @@ -0,0 +1,22 @@ +import processing.core.*; +import processing.xml.*; + +import procontroll.*; +import java.io.*; +import procontroll.*; +import java.io.*; +import procontroll.*; +import java.io.*; +import java.util.ArrayList; + +import java.applet.*; +import java.awt.*; +import java.awt.image.*; +import java.awt.event.*; +import java.io.*; +import java.net.*; +import java.text.*; +import java.util.*; +import java.util.zip.*; +import java.util.regex.*; +