import java.awt.*; import javax.swing.*; import org.w3c.dom.css.Rect; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import java.awt.image.*; import java.io.File; @SuppressWarnings("all") public class Screen extends JPanel implements Runnable { public Thread thread = new Thread ( this ); private static int cols = 18, rows = 15, blockSize = 34; private static Image[] tileset_ground = new Image[100]; private static Image[] tileset_air = new Image[100]; private Image temp; private static int myWidth, myHeight; private int snakeSpeed = 1, snakeSpeedCounter = 0; private Rectangle rec; private int level = 1; private int testing = -1; public static boolean isFirst = true; public static boolean startMove = false; private boolean levelFinished = false; private boolean levelFailed = false; public static Room room; public static Snake snake; public static Levels levels; public Screen () { thread.start (); } public void define () { room = new Room ( cols, rows, blockSize ); levels = new Levels (); snake = new Snake (); // those loops cut the set to 100 pieces, cutting 26X2600 image to 100 images of 26X26, each is a different tile temp = new ImageIcon ( "res/tileset_ground2.png").getImage(); createSet ( tileset_ground, temp ); temp = new ImageIcon ( "res/tileset_air.png").getImage(); createSet ( tileset_air, temp ); levels.loadMaze( new File ( "save/maze" + level + ".mz" ) ); } public void paintComponent ( Graphics g ) { // will be called by default by the JPanel if ( isFirst ) { myWidth = getWidth (); myHeight = getHeight (); define (); isFirst = false; } else if ( levelFinished ) { // g.setColor( Color.WHITE ); // g.fillRect ( 0, 0, myWidth, myHeight ); g.setColor ( Color.BLACK ); g.setFont ( new Font ( "Courier New", Font.BOLD, 24 ) ); g.drawString ( "Level Completed! ", myWidth / 2 - 130 , myHeight / 2 ); } else { g.setColor ( new Color ( 60, 60, 60 ) ); g.fillRect( 0, 0, getWidth(), getHeight() ); g.setColor ( new Color ( 60, 60, 60 ) ); // will create a default background beyond the images - background g.fillRect( 0, 0, getWidth(), getHeight() ); // drawing the entire background of the game room.draw ( g ); snake.draw ( g ); // g.drawString ( "" + snake.getX() + "," + snake.getY(), 60, 30 ); // g.drawString ( "" + testing , 200, 30 ); } if ( startMove ) snakeMove (); } private int testPos () { for ( int y = 0 ; y < rows ; y ++ ) { for ( int x = 0 ; x < cols ; x ++ ) { if ( room.block[y][x].contains( snake.getPos() ) ) // if the current block is a wall return ( room.block[y][x].getBgId() ); } } return -1; } private void snakeMove () { if ( snakeSpeedCounter >= snakeSpeed ) { snake.go (); snakeSpeedCounter = 0; } else snakeSpeedCounter ++; } public static int getPerfectWidth ( int x ) { return ( ( myWidth / 2 ) - ( ( cols * blockSize) / 2 ) + ( x * blockSize ) ); } private int getRightBlockSize () { return ( blockSize / 2 ); } private void createSet ( Image[] img, Image temp ) { for ( int i = 0 ; i < img.length ; i ++ ) { img[i] = createImage ( new FilteredImageSource ( temp.getSource(), new CropImageFilter ( 0, getRightBlockSize () * i, getRightBlockSize (), getRightBlockSize () ) ) ); } } public static int getRows () { return rows; } public static int getCols () { return cols; } public static Image[] getImageSet ( int set ) { if ( set == 0 ) return tileset_ground; else return tileset_air; } // run() will auto run as soon as the thread() is called public void run () { // will create the actual game - loop while ( true ) { repaint(); if ( !isFirst ) testing = testPos(); if ( testing == 5 ) { levelFinished = true; } if ( testing == 1 ) { levelFailed = true; } if ( levelFinished ) { try { Thread.sleep( 3000 ); } catch ( Exception ex ) {} level ++; define (); levelFinished = false; startMove = false; snake.resesetPos(); } if ( levelFailed ) { levelFailed = false; startMove = false; snake.resesetPos(); } try { Thread.sleep(1); } catch ( Exception ex ) { } } } }