Welcome to the Java Programming Forums


The professional, friendly Java community. 21,500 members and growing!


The Java Programming Forums are a community of Java programmers from all around the World. Our members have a wide range of skills and they all have one thing in common: A passion to learn and code Java. We invite beginner Java programmers right through to Java professionals to post here and share your knowledge. Become a part of the community, help others, expand your knowledge of Java and enjoy talking with like minded people. Registration is quick and best of all free. We look forward to meeting you.


>> REGISTER NOW TO START POSTING


Members have full access to the forums. Advertisements are removed for registered users.

Results 1 to 3 of 3

Thread: Having Trouble With My Key Listener

  1. #1
    Junior Member
    Join Date
    May 2014
    Posts
    5
    Thanks
    1
    Thanked 0 Times in 0 Posts

    Default Having Trouble With My Key Listener

    Hi, I have recently been trying to make a game, however when I just implemented my key listener, only on key out of 4 works. I will put the code on here, as well as a download to the jar so you can see what it is doing for yourself. Sorry for this next part being so long, I did't know how else to show you.

    This Is The Main Class
    package ca.trey.game;
     
    import java.awt.BorderLayout;
    import java.awt.Canvas;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.image.BufferStrategy;
    import java.awt.image.BufferedImage;
    import java.awt.image.DataBufferInt;
     
    import javax.swing.JFrame;
     
    import ca.tey.game.gfx.Screen;
    import ca.tey.game.gfx.SpriteSheet;
     
    public class Game extends Canvas implements Runnable{
     
    	private static final long serialVersionUID = 1L;
    // Screen Size
    	public static final int WIDTH = 160;
    	public static final int HEIGHT = WIDTH/12*9;
    	public static final int SCALE=3;
    	//Game Name
    	public static final String NAME = "Exploration";
    	//JFrame (Hope It Works!)
     
    	private JFrame frame;
     
    	public boolean running = false;
    	public int tickCount = 0;
     
    	private BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_INT_RGB);
    	private int[] pixels = ((DataBufferInt) image.getRaster().getDataBuffer()).getData();
     
    	private Screen screen;
    	public InputHandler input;
     
     
    	public Game(){
    		setMinimumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
    		setMaximumSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
    		setPreferredSize(new Dimension(WIDTH * SCALE, HEIGHT * SCALE));
     
    		frame = new JFrame(NAME);
     
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		frame.setLayout(new BorderLayout());
     
    		frame.add(this, BorderLayout.CENTER);
    		frame.pack();
     
    		frame.setResizable(false);
    		frame.setLocationRelativeTo(null);
    		frame.setVisible(true);
     
    	}
     
    	public void init(){
    		screen = new Screen(WIDTH, HEIGHT, new SpriteSheet("/sprite_sheet.png"));
    	input = new InputHandler(this);
     
     
    	}
     
    	private synchronized void start() {
    		new Thread(this).start();
    	}
    	private synchronized void stop() {
    		running = false;
    	}
     
    	public void run(){
    		long lastTime = System.nanoTime();
    		double nsPerTick =1000000000D/60D;
    		int ticks = 0;
    		int frames = 0;
     
     
    		long lastTimer = System.currentTimeMillis();
    		double delta = 0;
     
    		init();
     
    		while(true){
    			long now = System.nanoTime();
    			delta += (now - lastTime) / nsPerTick;
    			lastTime = now;
    			boolean shouldRender = false;
    			while(delta >= 1){
    			ticks++;
    			tick();
    			delta -= 1;
    			shouldRender = true;
     
    			}
    			try {
    				Thread.sleep(2);
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		if(shouldRender){
    	     frames++;
    		render();
    		}
    		if(System.currentTimeMillis() - lastTimer >= 1000){
    			lastTimer +=1000;
    			System.out.println(frames + " Frames " + ticks + " Ticks");
    			frames = 0;
    			ticks = 0;
     
    		}
    		}
     
    	}
     
     
     
    	public void tick(){
    	tickCount++;
     
    	if(input.up.isPressed()){ 
    		screen.yOffset--;}
     
    	if(input.down.isPressed()){ 
     
    		screen.yOffset++;}
    	if(input.left.isPressed()){ 
    		screen.xOffset--;}
    	if(input.right.isPressed()){ 
    		screen.xOffset++;}
     
     
    	 for(int i=0;i < pixels.length;i++){
    		 pixels[i]=i+tickCount;
     
    	 }}
    		public void render(){
    		  BufferStrategy bs = getBufferStrategy();
    		  if (bs == null){
    			 createBufferStrategy(3); 
    			 return;
    		  }
     
    		  screen.render(pixels, 0, WIDTH);
     
    			Graphics g = bs.getDrawGraphics();
     
     
     
    			g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
     
     
    			g.setColor(Color.BLACK);
    			g.drawRect(0, 0, getWidth(), getHeight());
    			g.dispose();
    			bs.show();
    	}
    	public static void main(String[] args){
    	new Game().start();
    }
     
     
     
     
     
    	}

    This is the screen class
    package ca.tey.game.gfx;
     
    public class Screen {
     
    	public static final int MAP_WIDTH = 64;
    	public static final int MAP_WIDTH_MASK = MAP_WIDTH -1;
     
    	public int[]tiles = new int[MAP_WIDTH* MAP_WIDTH];
    	public int[]colours = new int[MAP_WIDTH* MAP_WIDTH* 4];
     
    	public int xOffset = 0;
    	public int yOffset = 0;
     
    	public int width;
    	public int height;
     
    	public SpriteSheet sheet;
     
    	public Screen(int width, int height, SpriteSheet sheet){
    		this.width = width;
    		this.height = height;
    		this.sheet = sheet;
     
    		for(int i = 0;i<MAP_WIDTH* MAP_WIDTH; i++){
    			colours[i*4+0] = 0xff00ff;
    			colours[i*4+1] = 0x00ffff;
    			colours[i*4+2] = 0xffff00;
    			colours[i*4+3] = 0xffffff;
     
    		}
    	}
    	public void render(int[] pixels, int offset, int row){
    		for(int yTile = yOffset >>3;yTile <= (yOffset + height) >> 3;yTile++){
    			int yMin = yTile*8-yOffset;
    			int yMax = yMin + 8;
    			if(yMin <0)yMin= 0;
    			if (yMax > height) yMax = height;
     
    			for(int xTile = xOffset >>3;xTile <= (xOffset + width) >> 3;xTile++){
    				int xMin = xTile*8-xOffset;
    				int xMax = xMin + 8;
    				if(xMin <0)xMin= 0;
    				if (xMax > width) xMax = width;	
     
    				int tileIndex = (xTile & (MAP_WIDTH_MASK)) + (yTile & (MAP_WIDTH_MASK))*MAP_WIDTH;
     
     
    			for(int y = yMin; y < yMax; y++ ){
    				int sheetPixel = ((y+yOffset)& 7) * sheet.width + ((xMin+xOffset) & 7);
    				int tilePixel = offset + xMin + y*row;
    				for(int x = xMin; x <xMax; x++){
    					int colour = tileIndex *4 + sheet.pixels[sheetPixel++];
    					pixels[tilePixel++] = colours[colour];
    				}
    			}
    			}
     
    	}
    	}
    }

    This is my keyHandler class
    package ca.trey.game;
     
     
     
    import java.awt.event.KeyEvent;
    import java.awt.event.KeyListener;
    import java.util.ArrayList;
    import java.util.List;
     
    public class InputHandler implements KeyListener {
     
    	public InputHandler(Game game){
    	game.addKeyListener(this);
     
    }
    public class Key{
    	private boolean pressed = false;
     
     
    	public boolean isPressed(){
    		return pressed;
    	}
    	public void toggle(boolean isPressed){
    		pressed= isPressed;
    	}
    }
     
    	public List<Key> keys = new ArrayList<Key>();
     
    	public Key up = new Key();
    	public Key down = new Key();
    	public Key left = new Key();
    	public Key right = new Key();
     
    	public void keyPredded(KeyEvent e){
     
    	}
     
    	public void keyPressed(KeyEvent e) {
    		toggleKey(e.getKeyCode(), true);
     
    	}
     
     
    	public void keyReleased(KeyEvent e) {
    		toggleKey(e.getKeyCode(), false);
     
    	}
     
    	public void keyTyped(KeyEvent e) {
     
    	}
     
    	public void toggleKey(int keyCode, boolean isPressed){
    		if(keyCode == KeyEvent.VK_W){ up.toggle(isPressed);
    		if(keyCode == KeyEvent.VK_S){ down.toggle(isPressed);
    		if(keyCode == KeyEvent.VK_A){ left.toggle(isPressed);
    		if(keyCode == KeyEvent.VK_D){ right.toggle(isPressed);
    		}
    		}
     
    		}
    	}}}


  2. #2
    Super Moderator
    Join Date
    Jun 2013
    Location
    So. Maryland, USA
    Posts
    5,520
    My Mood
    Mellow
    Thanks
    215
    Thanked 698 Times in 680 Posts

    Default Re: Having Trouble With My Key Listener

    Sorry to be a broken record, but a while( true ) loop could (and probably is) contributing to your problem. The while( true ) loop captures the attention of the CPU and causes the rest of the GUI to become unresponsive and "locked out." You should also know that Swing apps are meant to be run on the Event Dispatch Thread (EDT) and there is a specific way to handle other threads in Swing, if they are needed at all. You can learn these particulars by studying the Java Swing Tutorials.

  3. #3
    Junior Member
    Join Date
    May 2014
    Posts
    5
    Thanks
    1
    Thanked 0 Times in 0 Posts

    Default Re: Having Trouble With My Key Listener

    Do you know any quick fix?

Similar Threads

  1. Problem with Key listener to JComboBox
    By kc120us in forum Java Applets
    Replies: 6
    Last Post: February 11th, 2012, 11:50 AM
  2. Strange issue with Key Listener and Applets
    By StormWingDelta in forum Java Applets
    Replies: 6
    Last Post: January 31st, 2012, 09:22 PM
  3. Key Listener problem!
    By DouboC in forum What's Wrong With My Code?
    Replies: 1
    Last Post: January 17th, 2012, 07:47 PM
  4. Key Listener not working in jinternalframe
    By furqankhan in forum What's Wrong With My Code?
    Replies: 1
    Last Post: February 12th, 2010, 09:48 AM
  5. Key listener help
    By airsim15 in forum AWT / Java Swing
    Replies: 2
    Last Post: December 13th, 2009, 03:15 PM