package com.theducecat.blockdude;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
public class GameMain extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
static final int CANVAS_WIDTH = 800;
static final int CANVAS_HEIGHT = 600;
static final int UPDATE_RATE = 4;
static final long UPDATE_PERIOD = 1000000000L / UPDATE_RATE;
static enum State {
INITIALIZED, MENU, PLAYING, PAUSED, DESTROYED
}
static State state;
private GameCanvas canvas;
// TODO: Fix this.
public static float gameScale = 3.5f;
private Level testLevel;
private Player player;
private ArrayList<ArrayList<Block>> blocks;
public GameMain() {
gameInit();
Textures.init("res/textures.png");
canvas = new GameCanvas();
canvas.setPreferredSize(new Dimension(CANVAS_WIDTH, CANVAS_HEIGHT));
this.setContentPane(canvas);
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
this.pack();
this.setTitle("Block Dude");
this.setVisible(true);
gameStart();
}
public void gameInit() {
state = State.INITIALIZED;
testLevel = new Level("levels/level.png");
blocks = testLevel.getBlocks();
for (int i = 0; i < blocks.size(); i++) {
for (int j = 0; j < blocks.get(i).size(); j++) {
if (blocks.get(i).get(j) == Block.SPAWN) {
player = new Player(j, i);
break;
}
}
}
}
public void gameStart() {
Thread gameThread = new Thread() {
@Override
public void run() {
gameLoop();
}
};
gameThread.start();
}
private void gameLoop() {
long beginTime, timeTaken, timeLeft;
state = State.PLAYING;
while (true) {
beginTime = System.nanoTime();
//if (state == State.GAMEOVER) break;
if (state == State.PLAYING) {
gameUpdate();
}
repaint();
timeTaken = System.nanoTime() - beginTime;
timeLeft = (UPDATE_PERIOD - timeTaken) / 1000000;
if (timeLeft < 10) timeLeft = 10;
try {
Thread.sleep(timeLeft);
} catch (InterruptedException ex) {}
}
}
public void gameShutdown() {
System.out.println("Shutting down!");
}
public void gameUpdate() {
// Have a state switcher, send to different classes (states) depending on state
}
public void gameDraw(Graphics2D g2d) {
switch (state) {
case PLAYING:
testLevel.draw(g2d);
player.draw(g2d);
}
}
public void gameKeyPressed(int keyCode) {
}
public void gameKeyReleased(int keyCode) {
switch (keyCode) {
case KeyEvent.VK_LEFT:
player.move(Direction.LEFT);
break;
case KeyEvent.VK_RIGHT:
player.move(Direction.RIGHT);
break;
}
}
public void gameKeyTyped(char keyChar) {
}
class GameCanvas extends JPanel implements KeyListener {
/**
*
*/
private static final long serialVersionUID = 1L;
public GameCanvas() {
setFocusable(true);
requestFocus();
addKeyListener(this);
}
@Override
public void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
super.paintComponent(g2d);
setBackground(Color.WHITE);
g2d.scale(gameScale, gameScale);
gameDraw(g2d);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
/*switch (state) {
case MENU:
System.exit(0);
break;
}*/
}
@Override
public void keyReleased(KeyEvent e) {
gameKeyReleased(e.getKeyCode());
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new GameMain();
}
});
}
}