@Override
	public void render(Graphics2D g) {
		Graphics2D gState = (Graphics2D) gameState.getGraphics();
		Graphics2D gHud = (Graphics2D) hud.getGraphics();

		// Background
		Background bg = state.getBg();
		gState.drawImage(bg.getImage(), 0, 0, TileMap.MAP_WIDTH, TileMap.MAP_HIGHT, null);

		// HUD
		gHud.setFont(hudFont);
		gHud.setColor(new Color(0x243121));
		gHud.fillRect(0, 0, TileMap.MAP_WIDTH / 2, TileMap.MAP_HIGHT / 2);
		gHud.setColor(new Color(0xefeB91));
		gHud.drawString("Lifes: " + state.getLifes(), 320 / 4, 10);
		gHud.drawString("Score: " + state.getScore(), 320 / 2, 10);

		gState.drawImage(hud, 0, 0, TileMap.MAP_WIDTH, HUD_HEIGHT, null);

		// Map
		TileMap tileMap = state.getTileMap();
		Tile[][] map = tileMap.getMap();
		gState.setColor(Color.BLACK);
		for (int i = 0; i < TileMap.COLUMNS; i++) {
			for (int j = 0; j < TileMap.ROWS; j++) {
				Tile tile = map[i][j];
				if (tile.getTileType() != TileType.EMPTY) {
					gState.drawImage(tileMap.getTileSet()[tile.getId()], tile.getX(), tile.getY(),
							tile.getWidth(), tile.getHeight(), null);
					gState.drawRect(tile.getX(), tile.getY(), tile.getWidth() - 1,
							tile.getHeight() - 1);
				}
			}
		}

		// Racket
		Racket racket = state.getPlatform();
		gState.drawImage(racket.getLeftPart(), racket.getX(), racket.getY(), racket.getPartWidth(),
				racket.getHeight(), null);
		gState.drawImage(racket.getMiddlePart(), racket.getMiddlePartX(), racket.getY(),
				racket.getMiddlePartWidth(), racket.getHeight(), null);
		gState.drawImage(racket.getRightPart(), racket.getRightPartX(), racket.getY(),
				racket.getPartWidth(), racket.getHeight(), null);

		// Balls
		List<Ball> balls = state.getBalls();
		for (Ball ball : balls) {
			gState.drawImage(ball.getImage(), ball.getX(), ball.getY(), ball.getWidth(),
					ball.getHeight(), null);
		}

		// Explosions
		List<Explosion> explosions = state.getExplosions();
		for (Explosion explosion : explosions) {
			gState.drawImage(explosion.getImage(), explosion.getX(), explosion.getY(),
					explosion.getWidth(), explosion.getHeight(), null);
		}

		// Bonuses
		List<Bonus> bonuses = state.getBonuses();
		for (Bonus bonus : bonuses) {
			gState.drawImage(bonus.getImage(), bonus.getX(), bonus.getY(), bonus.getWidth(),
					bonus.getHeight(), null);
		}

		// Shield
		Shield shield = state.getShield();
		if (state.getShield().isActivated()) {
			gState.drawImage(shield.getImage(), shield.getX(), shield.getY(), shield.getWidth(),
					shield.getHeight(), null);
		}

		// Bullets
		List<Bullet> bullets = state.getBullets();
		for (Bullet bullet : bullets) {
			gState.drawImage(bullet.getImage(), bullet.getX(), bullet.getY(), bullet.getWidth(),
					bullet.getHeight(), null);
		}

		// Render
		g.drawImage(gameState, 0, 0, null);
	}