Mercurial > hg > ristipolku
view game/Engine.java @ 41:a5fd4f74a767
Rename some variables.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Sat, 19 Feb 2011 03:05:13 +0200 |
parents | a69103644bf6 |
children | 951a4d669af0 |
line wrap: on
line source
/* * 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 java.awt.font.*; 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; } public void print() { System.out.print("PathInfo: inP="+in+", inX="+inX+", inY="+inY+"\n"); System.out.print(" outP="+out+", outX="+outX+", outY="+outY+"\n\n"); } } /* 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 IDMWidget { public IDMWidget() { } public void paint(Graphics2D g) { } public boolean hit(float x, float y) { return false; } } class IDMButton { BufferedImage imgUp, imgPressed; public IDMButton(float x, float y, String text) { } public void paint(Graphics2D g) { } public boolean hit(float x, float y) { return false; } } class GameBoard { public static final int boardSize = 9; public static final int boardMiddle = 4; Piece[][] board; public boolean flagGameOver; Piece currPiece; int currX, currY, currPoint; public GameBoard() { board = new Piece[boardSize][boardSize]; board[boardMiddle][boardMiddle] = new Piece(PieceType.START); currX = boardMiddle; currY = boardMiddle - 1; currPoint = 5; 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); } public void pieceRotate(Piece.RotateDir dir) { if (currPiece != null) currPiece.rotate(dir); } public PathInfo resolvePath(int startX, int startY, int startPoint, boolean mark) { int x = startX, y = startY; int point = startPoint; Piece curr = board[x][y]; do { if (x >= 0 && x < boardSize && y >= 0 && y < boardSize) { curr = board[x][y]; if (curr == null) break; if (curr.getType() == PieceType.START) { // Hit center starting piece return null; } else { // Mark, if needed if (mark) { curr.setType(PieceType.LOCKED); curr.setConnectionState(curr.getRotatedPoint(point), true); } // Get next piece point = curr.getConnection(curr.getRotatedPoint(point)); switch (point) { case 0: y--; point = 5; break; case 1: y--; point = 4; break; case 2: x++; point = 7; break; case 3: x++; point = 6; break; case 4: y++; point = 1; break; case 5: y++; point = 0; break; case 6: x--; point = 3; break; case 7: x--; point = 2; break; } } } else { // Outside of the board return null; } } while (curr != null); return new PathInfo(startPoint, startX, startY, point, x, y); } public void pieceFinishTurn() { // Do we have a piece? if (currPiece != null) { // Yes, start resolving path to next piece placement PathInfo i = resolvePath(currX, currY, currPoint, true); if (i != null) { currX = i.outX; currY = i.outY; currPoint = i.out; } } // Create a new piece currPiece = new Piece(PieceType.ACTIVE); // Find a place for it if (isEmpty(currX, currY)) { // Current position is empty, use it board[currX][currY] = currPiece; } else { // Resolve path PathInfo i = resolvePath(currX, currY, currPoint, true); if (i != null) { // Path found, place the piece board[currX][currY] = currPiece; } else { // Path ended up center/gameboard walls - it's game over, man System.out.print("pieceFinishTurn(): Game Over!\n"); flagGameOver = true; } } } } public class Engine extends JPanel implements Runnable, KeyListener, MouseListener { long startTime; float gameClock, gameFrames; Thread animThread; boolean animEnable = false; Font fontMain, font1, font2; GameBoard lauta = null; BufferedImage lautaBG = null, lautaBGScaled = null; Dimension lautaDim; static final AudioFormat sfmt = new AudioFormat(22050, 16, 1, true, false); SoundManager smgr; Sound musa, placed; public Engine() { // Initialize globals System.out.print("Engine() constructor\n"); gameClock = 0; gameFrames = 0; startTime = new Date().getTime(); // Sound system smgr = new SoundManager(sfmt, 16); // Load resources try { ResourceLoader res = new ResourceLoader("graphics/board.jpg"); lautaBG = ImageIO.read(res.getStream()); try { res = new ResourceLoader("graphics/font.ttf"); fontMain = Font.createFont(Font.TRUETYPE_FONT, res.getStream()); font1 = fontMain.deriveFont(24f); font2 = fontMain.deriveFont(32f); } catch (FontFormatException e) { System.out.print("Could not initialize fonts.\n"); } musa = smgr.getSound("sounds/gamemusic.wav"); // placed = smgr.getSound("sounds/placed.wav"); } catch (IOException e) { JOptionPane.showMessageDialog(null, e.getMessage(), "Initialization error", JOptionPane.ERROR_MESSAGE); System.out.print(e.getMessage()); } // Initialize game components lauta = new GameBoard(); addKeyListener(this); addMouseListener(this); // Get initial focus if (!hasFocus()) { System.out.print("Engine(): requesting focus\n"); requestFocus(); } smgr.play(musa); } public void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g; // Use antialiasing when rendering the game elements g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON); // Rescale background if component size has changed Dimension dim = getSize(); if (lautaDim == null || !dim.equals(lautaDim)) { lautaBGScaled = new BufferedImage(dim.width, dim.height, BufferedImage.TYPE_INT_ARGB); Graphics2D gimg = lautaBGScaled.createGraphics(); gimg.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC); gimg.drawImage(lautaBG, 0, 0, dim.width, dim.height, null); lautaDim = dim; System.out.print("scale changed\n"); } // Background, pieces g2.drawImage(lautaBGScaled, 0, 0, null); lauta.paint(g2, 100, 150, 60); // Scores g2.setFont(font1); g2.setPaint(Color.white); // Other elements long currTime = new Date().getTime(); g2.drawString("fps = "+ ((gameFrames * 1000) / (currTime - startTime)), dim.width - 120, 20); } 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"); // Stop animations if (animThread != null) { animThread.interrupt(); animEnable = false; animThread = null; } // Shut down sound manager smgr.close(); } public void mousePressed(MouseEvent e) { } public void mouseEntered(MouseEvent e) { } public void mouseExited(MouseEvent e) { } public void mouseReleased(MouseEvent e) { } public void mouseClicked(MouseEvent e) { System.out.print("mouseClicked()\n"); if (!hasFocus()) { System.out.print("requesting focus\n"); requestFocus(); } } public void keyTyped(KeyEvent e) { } public void keyReleased(KeyEvent e) { } public void keyPressed(KeyEvent e) { // Handle keyboard input switch (e.getKeyCode()) { case KeyEvent.VK_LEFT: case KeyEvent.VK_UP: lauta.pieceRotate(Piece.RotateDir.LEFT); break; case KeyEvent.VK_RIGHT: case KeyEvent.VK_DOWN: lauta.pieceRotate(Piece.RotateDir.RIGHT); break; case KeyEvent.VK_ENTER: smgr.play(placed); lauta.pieceFinishTurn(); break; case KeyEvent.VK_ESCAPE: break; } } public void run() { while (animEnable) { // Progress game animation clock gameClock++; // Animate components lauta.animate(gameClock); // Repaint with a frame limiter if (gameClock % 3 == 1) { repaint(); gameFrames++; } // Sleep for a moment try { Thread.sleep(10); } catch (InterruptedException x) { } } } }