Mercurial > hg > ristipolku
diff game/Engine.java @ 9:a7751971c2a3
More work.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sat, 29 Jan 2011 00:30:00 +0200 |
parents | Ristipolku.java@d8e7fd8f3ccf |
children | 4bacc98973f5 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/game/Engine.java Sat Jan 29 00:30:00 2011 +0200 @@ -0,0 +1,330 @@ +/* + * Ristipolku Game Engine + * (C) Copyright 2011 Matti 'ccr' Hämäläinen <ccr@tnsp.org> + */ +package game; + +import java.awt.*; +import java.awt.geom.*; +import java.awt.event.*; +import java.awt.image.*; +import java.awt.event.*; +import javax.imageio.*; +import javax.swing.*; +import java.util.*; +import java.io.*; +import game.*; + +import javax.sound.sampled.*; + + +class PathInfo +{ + public int in, inX, inY, out, outX, outY; + + public PathInfo(int in, int inX, int inY, int out, int outX, int outY) + { + this.in = in; + this.inX = inX; + this.inY = inY; + + this.out = out; + this.outX = outX; + this.outY = outY; + } +} + +/* +class AnimatedElement +{ + float x, y, stime, value; + Interpolate lerp; + boolean active; + + public AnimatedElement(float x, float y, ) + { + stime = 0; + this.x = x; + this.y = y; + + } + + public animate(float time) + { + if (!active) + { + active = true; + stime = time; + } + + float t = (time - stime) / 10.0f; + if (t < 100) + value = lerp.getValue(t); + else + { + + } + } + + public paint(Graphics2D g, ); + { + } +} +*/ + +class GameBoard +{ + public static final int boardSize = 9; + public static final int boardMiddle = 4; + Piece[][] board; + Piece current; + public boolean flagGameOver; + + int moveX, moveY, movePoint; + + public GameBoard() + { + board = new Piece[boardSize][boardSize]; + + board[boardMiddle][boardMiddle] = new Piece(PieceType.START); + + moveX = boardMiddle; + moveY = boardMiddle - 1; + movePoint = 0; + + pieceFinishTurn(); + + flagGameOver = false; + } + + public void paint(Graphics2D g, int sx, int sy, float scale) + { + for (int y = 0; y < boardSize; y++) + for (int x = 0; x < boardSize; x++) + if (board[x][y] != null) + { + AffineTransform save = g.getTransform(); + + board[x][y].paint(g, + sx + (x * scale), + sy + (y * scale), + scale - scale / 10); + + g.setTransform(save); + } + } + + public void animate(float time) + { + for (int y = 0; y < boardSize; y++) + for (int x = 0; x < boardSize; x++) + if (board[x][y] != null) + { + board[x][y].animate(time); + } + } + + private boolean isEmpty(int x, int y) + { + return (x >= 0 && x < boardSize && y >= 0 && y < boardSize && board[x][y] == null); + } + + private Piece getPiece(int x, int y) + { + if (x >= 0 && x < boardSize && y >= 0 && y < boardSize) + return board[x][y]; + else + return null; + } + + public void pieceRotate(boolean dir) + { + if (current != null) + current.rotate(dir); + } + + public PathInfo resolvePath(int startX, int startY, int startPoint, boolean mark) + { + int x = startX, y = startY; + int point = -1; + + Piece curr = getPiece(startX, startY); + if (curr == null) + return null; + +/* + while (curr != null) + { +// curr.(true); +// elements.spawn("", ); + } +*/ + + return new PathInfo(startPoint, startX, startY, point, x, y); + } + + public void pieceFinishTurn() + { + if (current != null) + { + current.setType(PieceType.LOCKED); + PathInfo i = resolvePath(moveX, moveY, movePoint, true); + + if (i != null) + { + } + } + + current = new Piece(PieceType.ACTIVE); + if (isEmpty(moveX, moveY)) + { + board[moveX][moveY] = current; + } + else + { + PathInfo i = resolvePath(moveX, moveY, movePoint, true); + if (i != null) + board[moveX][moveY] = current; + else + flagGameOver = true; + } + } +} + + +public class Engine extends JPanel + implements Runnable, KeyListener +{ + Thread animThread; + boolean animEnable = false; + GameBoard lauta = null; + BufferedImage lautaBG = null, lautaBGScaled = null; + Dimension oldDim; + float clock; + + public Engine() + { + BufferedImage img; + clock = 0; + + System.out.print("Engine() constructor\n"); + + try + { + lautaBG = ImageIO.read(new File("board.png")); + } + catch (IOException e) + { + System.out.print("lol\n"); + JOptionPane.showMessageDialog(null, + "Could not load background image.", + "Initialization error", + JOptionPane.ERROR_MESSAGE); + } + +// Graphics2D g = img.getGraphics(); +// atrans = AffineTransform.getScaleInstance(img.getWidth(), 3); + + lauta = new GameBoard(); + addKeyListener(this); + } + + public void startThreads() + { + System.out.print("startThreads()\n"); + if (animThread == null) + { + animThread = new Thread(this); + animEnable = true; + animThread.start(); + } + } + + public void stopThreads() + { + System.out.print("stopThreads()\n"); + if (animThread != null) + { + animThread.interrupt(); + animEnable = false; + animThread = null; + } + } + + public void paintComponent(Graphics g) + { + Graphics2D g2 = (Graphics2D) g; + + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, + RenderingHints.VALUE_ANTIALIAS_ON); + + Dimension dim = getSize(); + if (oldDim == null || !dim.equals(oldDim)) + { + lautaBGScaled = new BufferedImage(dim.width, dim.height, BufferedImage.TYPE_INT_ARGB); + Graphics2D gimg = lautaBGScaled.createGraphics(); + gimg.setRenderingHint(RenderingHints.KEY_INTERPOLATION, + RenderingHints.VALUE_INTERPOLATION_BICUBIC); + AffineTransform xform = AffineTransform.getScaleInstance(0.5f, 0.5f); + gimg.drawImage(lautaBG, xform, null); + oldDim = dim; + System.out.print("scale changed\n"); + } + + g2.drawImage(lautaBGScaled, 0, 0, null); + lauta.paint(g2, 100, 150, 60); + + if (!hasFocus()) + requestFocus(); + } + + public void keyTyped(KeyEvent e) + { + } + + public void keyReleased(KeyEvent e) + { + } + + public void keyPressed(KeyEvent e) + { + System.out.print("lol\n"); + switch (e.getKeyCode()) + { + case KeyEvent.VK_LEFT: + case KeyEvent.VK_UP: + lauta.pieceRotate(false); + break; + + case KeyEvent.VK_RIGHT: + case KeyEvent.VK_DOWN: + lauta.pieceRotate(true); + break; + + case KeyEvent.VK_ENTER: + lauta.pieceFinishTurn(); + break; + } + } + + public void run() + { + while (animEnable) + { + clock++; + +// System.out.print("clock=" + clock + "\n"); + + lauta.animate(clock); + + repaint(); + + try { + Thread.sleep(10); + } + + catch (InterruptedException x) { + } + } + } +}