import javax.swing.*; import java.awt.event.*; import java.awt.*; import java.util.*; public class CMACGUI extends JFrame implements KeyListener { CMAC cmac; HashMap<Long,Point> tileLocs; int x = 0, y = 0; double scale = 0.5; public CMACGUI(CMAC cmac) { super("Tile Coding Test"); this.cmac = cmac; tileLocs = new HashMap<Long,Point>(); for(int i=0; i<cmac.tilings; i++) { for(int j=0; j<Math.ceil((double) cmac.xWorld/cmac.xTile + 1); j++) { for(int k=0; k<Math.ceil((double) cmac.yWorld/cmac.yTile + 1); k++) { long id = 0; id += i; id *= Math.ceil((double) cmac.xWorld/cmac.xTile + 1); id += j; id *= Math.ceil((double) cmac.yWorld/cmac.yTile + 1); id += k; tileLocs.put(id, new Point((int)(j*cmac.xTile*scale) + (int)Math.round(scale*i*cmac.xTile/cmac.tilings - scale*cmac.xTile) + 10, (int)((cmac.yWorld-k*cmac.yTile)*scale) - (int)Math.round(scale*i*cmac.yTile/cmac.tilings) + 10)); }//for }//for }//for setSize((int)(cmac.xWorld*scale) + 20, (int)(cmac.yWorld*scale) + 50); DisplayPanel disp = new DisplayPanel(); disp.setBounds(0,0,(int)(cmac.xWorld*scale), (int)(cmac.yWorld*scale)); getContentPane().add(disp); addKeyListener(this); setVisible(true); }//CMACGUI() public void paint(Graphics g) { super.paint(g); paintComponents(g); }//paint() public void keyPressed(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_UP) { if(y+1<cmac.yWorld) y++; } if(e.getKeyCode() == KeyEvent.VK_DOWN) { if(y-1>=0) y--; } if(e.getKeyCode() == KeyEvent.VK_LEFT) { if(x-1>=0) x--; } if(e.getKeyCode() == KeyEvent.VK_RIGHT) { if(x+1<cmac.xWorld) x++; } System.out.println("(" + x + ", " + y + ")"); repaint(); }//keyPressed() public void keyReleased(KeyEvent e) { } public void keyTyped(KeyEvent e) { } class DisplayPanel extends JPanel { public DisplayPanel() { setBackground(new Color(0.9f, 0.9f, 0.9f)); }//DisplayPanel() public void paint(Graphics g) { super.paint(g); Graphics2D g2 = (Graphics2D) g; long[] tiles = cmac.getTiles(x, y); for(int i=0; i<tiles.length; i++) { g2.setColor(new Color(0, ((float)(i+2)/(cmac.tilings+2)), 0)); g2.fillRect(tileLocs.get(tiles[i]).x, tileLocs.get(tiles[i]).y, (int)(cmac.xTile*scale), (int)(cmac.yTile*scale)); }//for g2.setColor(Color.BLUE); g2.drawRect(10, 10, (int)(cmac.xWorld*scale), (int)(cmac.yWorld*scale)); g2.setColor(Color.RED); g2.drawRect((int)(x*scale)+9, (int)((cmac.yWorld - y)*scale) + 7, 2, 2); }//paint() }//DisplayPanel public static void main(String[] args) { CMACGUI gui = new CMACGUI(new CMAC(10, 50, 50, 1000, 1000)); }//main() }//CMACGUI