2018-10-05 16:00:15 +02:00
|
|
|
package it.cavallium.warppi.extra.tetris;
|
|
|
|
|
|
|
|
import java.io.IOException;
|
|
|
|
|
2019-02-27 23:29:03 +01:00
|
|
|
import it.cavallium.warppi.WarpPI;
|
|
|
|
import it.cavallium.warppi.device.display.DisplayOutputDevice;
|
|
|
|
import it.cavallium.warppi.device.input.Keyboard;
|
2018-10-05 16:00:15 +02:00
|
|
|
import it.cavallium.warppi.StaticVars;
|
2018-10-06 16:37:44 +02:00
|
|
|
import it.cavallium.warppi.event.KeyPressedEvent;
|
|
|
|
import it.cavallium.warppi.event.KeyReleasedEvent;
|
2018-10-05 16:00:15 +02:00
|
|
|
import it.cavallium.warppi.gui.HistoryBehavior;
|
2019-11-01 18:04:01 +01:00
|
|
|
import it.cavallium.warppi.gui.RenderContext;
|
|
|
|
import it.cavallium.warppi.gui.ScreenContext;
|
2018-10-05 16:00:15 +02:00
|
|
|
import it.cavallium.warppi.gui.graphicengine.BinaryFont;
|
2018-10-06 16:37:44 +02:00
|
|
|
import it.cavallium.warppi.gui.graphicengine.Renderer;
|
2018-10-05 16:00:15 +02:00
|
|
|
import it.cavallium.warppi.gui.graphicengine.Skin;
|
|
|
|
import it.cavallium.warppi.gui.screens.Screen;
|
|
|
|
|
|
|
|
public class TetrisScreen extends Screen {
|
|
|
|
|
|
|
|
private TetrisGame g;
|
|
|
|
|
2018-10-16 21:42:36 +02:00
|
|
|
private ButtonInfo leftPressed = new ButtonInfo();
|
2018-10-09 17:45:20 +02:00
|
|
|
|
2018-10-16 21:42:36 +02:00
|
|
|
private ButtonInfo rightPressed = new ButtonInfo();
|
2018-10-09 17:45:20 +02:00
|
|
|
|
2018-10-16 21:42:36 +02:00
|
|
|
private ButtonInfo upPressed = new ButtonInfo();
|
2018-10-16 15:56:27 +02:00
|
|
|
|
2018-10-16 21:42:36 +02:00
|
|
|
private ButtonInfo downPressed = new ButtonInfo();
|
2018-10-09 17:45:20 +02:00
|
|
|
|
2018-10-16 21:42:36 +02:00
|
|
|
private ButtonInfo okPressed = new ButtonInfo();
|
2018-10-09 17:45:20 +02:00
|
|
|
|
2018-10-16 21:42:36 +02:00
|
|
|
private ButtonInfo backPressed = new ButtonInfo();
|
2018-10-09 17:45:20 +02:00
|
|
|
|
2019-02-27 23:29:03 +01:00
|
|
|
private DisplayOutputDevice e;
|
2018-10-06 16:37:44 +02:00
|
|
|
|
|
|
|
private Renderer r;
|
|
|
|
|
2018-10-05 16:00:15 +02:00
|
|
|
private static Skin skin;
|
|
|
|
|
|
|
|
public TetrisScreen() {
|
|
|
|
super();
|
|
|
|
historyBehavior = HistoryBehavior.ALWAYS_KEEP_IN_HISTORY;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void initialized() {
|
2018-10-23 17:28:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-11-01 18:04:01 +01:00
|
|
|
public void graphicInitialized(ScreenContext ctx) {
|
2018-10-06 16:37:44 +02:00
|
|
|
try {
|
2019-02-27 23:29:03 +01:00
|
|
|
e = d.display;
|
2018-10-06 16:37:44 +02:00
|
|
|
r = d.renderer;
|
|
|
|
if (TetrisScreen.skin == null) {
|
2019-04-09 22:38:22 +02:00
|
|
|
TetrisScreen.skin = d.display.getGraphicEngine().loadSkin("/tetrisskin.png");
|
2018-10-06 16:37:44 +02:00
|
|
|
}
|
|
|
|
} catch (final IOException e) {
|
|
|
|
e.printStackTrace();
|
|
|
|
}
|
2018-10-05 16:00:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public void created() throws InterruptedException {
|
2018-10-06 16:37:44 +02:00
|
|
|
g = new TetrisGame();
|
2018-10-05 16:00:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-11-01 18:04:01 +01:00
|
|
|
public void beforeRender(ScreenContext ctx, final float dt) {
|
2019-04-09 22:38:22 +02:00
|
|
|
d.renderer.glClearColor(0xff000000);
|
2018-10-16 15:56:27 +02:00
|
|
|
g.update(dt, leftPressed, rightPressed, downPressed, upPressed, okPressed, backPressed);
|
2018-10-05 16:00:15 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
2019-11-01 18:04:01 +01:00
|
|
|
public void render(RenderContext ctx) {
|
2019-04-09 22:38:22 +02:00
|
|
|
DisplayOutputDevice display = d.display;
|
2018-10-06 16:37:44 +02:00
|
|
|
if (TetrisScreen.skin != null) {
|
|
|
|
TetrisScreen.skin.use(e);
|
|
|
|
}
|
2018-10-09 19:37:48 +02:00
|
|
|
r.glColor3f(1, 1, 1);
|
2018-10-12 23:23:16 +02:00
|
|
|
BlockColor[] renderedGrid = g.getRenderedGrid();
|
2019-11-01 18:04:01 +01:00
|
|
|
int centerScreen = ctx.getWidth()/2;
|
2018-10-12 23:23:16 +02:00
|
|
|
int centerGrid = TetrisGame.WIDTH*6/2-1;
|
2018-10-09 19:37:48 +02:00
|
|
|
final int leftOffset = centerScreen - centerGrid;
|
2019-11-01 18:04:01 +01:00
|
|
|
final int topOffset = ctx.getHeight() - TetrisGame.HEIGHT*6-1;
|
2018-10-09 19:37:48 +02:00
|
|
|
for (int y = 0; y < TetrisGame.HEIGHT; y++) {
|
|
|
|
for (int x = 0; x < TetrisGame.WIDTH; x++) {
|
|
|
|
final int offset = x+y*TetrisGame.WIDTH;
|
2018-10-12 23:23:16 +02:00
|
|
|
final BlockColor type = renderedGrid[offset];
|
|
|
|
if (type != null) {
|
2018-10-16 17:37:21 +02:00
|
|
|
r.glFillRect(leftOffset + x * 5, topOffset + (y+3) * 5, 5, 5, renderedGrid[offset].ordinal() * 5, 0, 5, 5);
|
2018-10-12 23:23:16 +02:00
|
|
|
} else {
|
2018-10-16 19:28:43 +02:00
|
|
|
r.glFillRect(leftOffset + x * 5, topOffset + (y+3) * 5, 5, 5, 7 * 5, 0, 5, 5);
|
2018-10-16 15:56:27 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
Tetromino nextTetromino = g.getNextTetromino();
|
|
|
|
if (nextTetromino != null) {
|
2018-10-16 19:28:43 +02:00
|
|
|
r.glColor3f(0.25f, 0.25f, 0.25f);
|
|
|
|
r.glFillColor(leftOffset + (TetrisGame.WIDTH + 3) * 5, topOffset + 3 * 5, 5*4, 5*4);
|
|
|
|
r.glColor3f(1,1,1);
|
2018-10-16 15:56:27 +02:00
|
|
|
boolean[] renderedNextTetromino = nextTetromino.getRenderedBlock();
|
|
|
|
final BlockColor type = nextTetromino.getColor();
|
|
|
|
int nextTetrominoGridSize = nextTetromino.getTetrominoGridSize();
|
2018-10-16 19:28:43 +02:00
|
|
|
int nextGridOffset = 4*5/2 - nextTetrominoGridSize*5/2;
|
2018-10-16 15:56:27 +02:00
|
|
|
for (int y = 0; y < nextTetrominoGridSize; y++) {
|
|
|
|
for (int x = 0; x < nextTetrominoGridSize; x++) {
|
|
|
|
final int offset = x+y*nextTetrominoGridSize;
|
|
|
|
if (renderedNextTetromino[offset]) {
|
|
|
|
if (type != null) {
|
2018-10-16 19:28:43 +02:00
|
|
|
r.glFillRect(leftOffset + nextGridOffset + (TetrisGame.WIDTH + 3 + x) * 5, topOffset + nextGridOffset + (3 + y) * 5, 5, 5, type.ordinal() * 5, 0, 5, 5);
|
2018-10-16 15:56:27 +02:00
|
|
|
}
|
|
|
|
}
|
2018-10-12 23:23:16 +02:00
|
|
|
}
|
2018-10-09 19:37:48 +02:00
|
|
|
}
|
|
|
|
}
|
2018-10-16 19:28:43 +02:00
|
|
|
r.glColor3f(1,1,1);
|
|
|
|
r.glDrawStringLeft(leftOffset + (TetrisGame.WIDTH + 3) * 5, topOffset + (3+5) * 5, "SCORE:"+g.getScore());
|
2018-10-05 16:00:15 +02:00
|
|
|
}
|
2018-10-09 17:45:20 +02:00
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean onKeyPressed(KeyPressedEvent k) {
|
|
|
|
switch (k.getKey()) {
|
|
|
|
case LEFT: {
|
2018-10-16 21:42:36 +02:00
|
|
|
leftPressed.press();
|
2018-10-09 17:45:20 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
case RIGHT: {
|
2018-10-16 21:42:36 +02:00
|
|
|
rightPressed.press();
|
2018-10-09 17:45:20 +02:00
|
|
|
return true;
|
|
|
|
}
|
2018-10-16 15:56:27 +02:00
|
|
|
case UP: {
|
2018-10-16 21:42:36 +02:00
|
|
|
upPressed.press();
|
2018-10-16 15:56:27 +02:00
|
|
|
return true;
|
|
|
|
}
|
2018-10-09 17:45:20 +02:00
|
|
|
case DOWN: {
|
2018-10-16 21:42:36 +02:00
|
|
|
downPressed.press();
|
2018-10-09 17:45:20 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
case OK: {
|
2018-10-16 21:42:36 +02:00
|
|
|
okPressed.press();
|
2018-10-16 19:28:43 +02:00
|
|
|
g.playAgain();
|
2018-10-09 17:45:20 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
case BACK: {
|
2018-10-16 21:42:36 +02:00
|
|
|
backPressed.press();
|
2018-10-09 17:45:20 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
default: return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public boolean onKeyReleased(KeyReleasedEvent k) {
|
|
|
|
switch (k.getKey()) {
|
|
|
|
case LEFT: {
|
2018-10-16 21:42:36 +02:00
|
|
|
leftPressed.release();
|
2018-10-09 17:45:20 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
case RIGHT: {
|
2018-10-16 21:42:36 +02:00
|
|
|
rightPressed.release();
|
2018-10-09 17:45:20 +02:00
|
|
|
return true;
|
|
|
|
}
|
2018-10-16 15:56:27 +02:00
|
|
|
case UP: {
|
2018-10-16 21:42:36 +02:00
|
|
|
upPressed.release();
|
2018-10-16 15:56:27 +02:00
|
|
|
return true;
|
|
|
|
}
|
2018-10-09 17:45:20 +02:00
|
|
|
case DOWN: {
|
2018-10-16 21:42:36 +02:00
|
|
|
downPressed.release();
|
2018-10-09 17:45:20 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
case OK: {
|
2018-10-16 21:42:36 +02:00
|
|
|
okPressed.release();
|
2018-10-09 17:45:20 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
case BACK: {
|
2018-10-16 21:42:36 +02:00
|
|
|
backPressed.release();
|
2018-10-09 17:45:20 +02:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
default: return false;
|
|
|
|
}
|
|
|
|
}
|
2018-10-05 16:00:15 +02:00
|
|
|
@Override
|
|
|
|
public boolean mustBeRefreshed() {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
@Override
|
|
|
|
public String getSessionTitle() {
|
2018-10-16 19:28:43 +02:00
|
|
|
return "Tetris";
|
2018-10-05 16:00:15 +02:00
|
|
|
}
|
|
|
|
}
|