I metodi "vuoti" nel mio codice non sono vuoti, qui li ho scritti così perchè non volevo scrivere una cosa troppo lunga che poi non si capisce niente... keyPressed e keyReleased cambiano dei valori che nel void movePlayer() vengono usati per far muovere il giocatore...
Comunque ora posto tutto il codice:
Questa è la classe principale (Main.java):
	codice:
	import java.awt.CardLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Main {
    
    public static int WIDTH = 1920, HEIGHT = WIDTH / 16 * 9;
    public static boolean playing = false;
    public static void main(String[] args) throws InterruptedException{
        Menu menu = new Menu();
        Game game = new Game();
        
        CardLayout cl = new CardLayout();
        JPanel panel = new JPanel();
        panel.add(menu, "1");
        panel.add(game, "2");
        panel.setLayout(cl);
        
        JFrame f = new JFrame("Game Walking");
        f.setSize(WIDTH, HEIGHT);
        f.add(panel);
        f.setResizable(false);
        f.setLocationRelativeTo(null);
        f.setVisible(true);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        while(true){
            if(!playing){
                cl.show(panel, "1");
                menu.update();
                menu.repaint();
            }else{
                cl.show(panel, "2");
                game.update();
                game.repaint();
            }
            Thread.sleep(10);
        }
    }
}
 
Questa è la classe del menu (Menu.java):
	codice:
	import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MouseInfo;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.RenderingHints;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class Menu extends JPanel implements MouseListener, MouseMotionListener{
    
    public String imenupath = "/images/menu.png";
    public String imenuselectionpath = "/images/menuselection.png";
    public int mousex, mousey;
    public boolean isPlaySelected = false, isExitSelected = false;
    
    public void paint(Graphics g){
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.drawImage(getMenuImage(), 0, 0, Main.WIDTH, Main.HEIGHT, null);
        g2d.setColor(Color.red);
        if(isPlaySelected){
            g2d.drawImage(getMenuSelectionImage(), (Main.WIDTH*165)/1000, (Main.HEIGHT*148)/562, (Main.WIDTH*75)/1000, (Main.HEIGHT*50)/562, null);
        }
        if(isExitSelected){
            g2d.drawImage(getMenuSelectionImage(), (Main.WIDTH*545)/1000, (Main.HEIGHT*348)/562, (Main.WIDTH*75)/1000, (Main.HEIGHT*50)/562, null);
        }
        //g2d.drawRect((Main.WIDTH*149)/1000, (Main.HEIGHT*99)/562, (Main.WIDTH*302)/1000, (Main.HEIGHT*135)/562);
        //g2d.drawRect((Main.WIDTH*530)/1000, (Main.HEIGHT*298)/562, (Main.WIDTH*302)/1000, (Main.HEIGHT*137)/562);
    }
    
    public Image getMenuImage(){
        ImageIcon imenu = new ImageIcon(getClass().getResource(imenupath));
        return imenu.getImage();
    }
    
    public Image getMenuSelectionImage(){
        ImageIcon imenuselection = new ImageIcon(getClass().getResource(imenuselectionpath));
        return imenuselection.getImage();
    }
    
    public void cursorInButton(){
        Rectangle rplay = new Rectangle((Main.WIDTH*149)/1000, (Main.HEIGHT*99)/562, (Main.WIDTH*302)/1000, (Main.HEIGHT*135)/562);
        Rectangle rexit = new Rectangle((Main.WIDTH*530)/1000, (Main.HEIGHT*298)/562, (Main.WIDTH*302)/1000, (Main.HEIGHT*137)/562);
        
        if(rplay.contains(mousex, mousey)){
            isPlaySelected = true;
        }else{
            isPlaySelected = false;
        }
        if(rexit.contains(mousex, mousey)){
            isExitSelected = true;
        }else{
            isExitSelected = false;
        }
    }
    
    public void update(){
        addMouseMotionListener(this);
        setFocusable(true);
        addMouseListener(this);
        setFocusable(true);
        
        cursorInButton();
    }
    @Override
    public void mouseClicked(MouseEvent e) {
        if(e.getButton() == 1 && isPlaySelected){
            Main.playing = true;
        }
        if(e.getButton() == 1 && isExitSelected){
            System.exit(0);
        }
    }
    @Override
    public void mouseEntered(MouseEvent e) {}
    @Override
    public void mouseExited(MouseEvent e) {}
    @Override
    public void mousePressed(MouseEvent e) {}
    @Override
    public void mouseReleased(MouseEvent e) {    }
    @Override
    public void mouseDragged(MouseEvent e) {}
    @Override
    public void mouseMoved(MouseEvent e) {
        mousex = e.getX();
        mousey = e.getY();
    }
}
 
Questa è la classe del gioco vero e proprio (Game.java):
	codice:
	import java.awt.Component;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.ImageIcon;
import javax.swing.JPanel;
public class Game extends JPanel implements KeyListener {
    
    private String ibackgroundpath = "/images/background.png";
    private String ibackground1path = "/images/background1.png";
    private String iplayerpath = "/images/player.png";
    private int bgx = 0, bgy = 0, bg1x = 0, bg1y = bgy - Main.HEIGHT;
    private int playerx = 360, playery = 400, velX = 0, velY = 0;
    public boolean up = false, down = false, left = false, right = false;
    public void paint(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D) g;
        g2d.drawImage(getBackgroundImage(), bgx, bgy, Main.WIDTH, Main.HEIGHT,
                null);
        g2d.drawImage(getBackground1Image(), bg1x, bg1y, Main.WIDTH,
                Main.HEIGHT, null);
        g2d.drawImage(getPlayerImage(), (Main.WIDTH * playerx) / 1000,
                (Main.HEIGHT * playery) / 562, (Main.WIDTH * 75) / 1920,
                (Main.HEIGHT * 150) / 1080, null);
    }
    public Image getBackgroundImage() {
        ImageIcon ibackground = new ImageIcon(getClass().getResource(
                ibackgroundpath));
        return ibackground.getImage();
    }
    public Image getBackground1Image() {
        ImageIcon ibackground1 = new ImageIcon(getClass().getResource(
                ibackground1path));
        return ibackground1.getImage();
    }
    public Image getPlayerImage() {
        ImageIcon iplayer = new ImageIcon(getClass().getResource(iplayerpath));
        return iplayer.getImage();
    }
    public void moveBackground() {
        bgy += 2;
        bg1y += 2;
        if (bgy >= Main.HEIGHT) {
            bgy = bg1y - Main.HEIGHT;
        }
        if (bg1y >= Main.HEIGHT) {
            bg1y = bgy - Main.HEIGHT;
        }
    }
    
    public void movePlayer(){
        if(up){
            velY = -2;
        }
        if(down){
            velY = 2;
        }
        if(right){
            velX = 2;
        }
        if(left){
            velX = -2;
        }
    }
    
    @Override
    public void keyPressed(KeyEvent e) {
    
        int key = e.getKeyCode();
        if (key == KeyEvent.VK_W) {
            up = true;
        }
        if (key == KeyEvent.VK_S) {
            down = true;
        }
        if (key == KeyEvent.VK_A) {
            left = true;
        }
        if (key == KeyEvent.VK_D) {
            right = true;
        }
    }
    @Override
    public void keyReleased(KeyEvent e) {
        
        int key = e.getKeyCode();
        if (key == KeyEvent.VK_W) {
            up = false;
        }
        if (key == KeyEvent.VK_S) {
            down = false;
        }
        if (key == KeyEvent.VK_A) {
            left = false;
        }
        if (key == KeyEvent.VK_D) {
            right = false;
        }
    }
    @Override
    public void keyTyped(KeyEvent e) {}
    
    public void update() {
        addKeyListener(this);
        setFocusable(true);
        moveBackground();
        movePlayer();
        
        playerx += velX;
        playery += velY;
    }
}