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); } } } }}}