import javax.swing.*;
import javax.swing.text.View;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

class Viewport extends JPanel {
    private final int VIEWPORT_WIDTH = 640;
    private final int VIEWPORT_HEIGHT = 480;

    // Параметры облака
    private int cloudPositionX = 10;
    private int cloudPositionY = 30;
    private int cloudSizeX = 200;
    private int cloudSizeY = 80;
    private int cloudMovementDir = 1;

    // Параметры машины
    private int carPositionX = -100; // Начальная позиция автомобиля за пределами экрана
    private final int carPositionY = 380;
    private final int CAR_WIDTH = 80;
    private final int CAR_HEIGHT = 40;
    private final int carMovementSpeed = 50; // Скорость движения автомобиля

    // Фоновый цвет и размеры рисуемой области
    public Viewport() {
        setBackground(new Color(215, 255, 252));
        setPreferredSize(new Dimension(VIEWPORT_WIDTH, VIEWPORT_HEIGHT));
    }

    public void update(float delta) {
        // Обновление позиции облака
        final int CLOUD_MOVEMENT_SPEED = 100;
        // delta - сколько времени прошло с прошлого кадра.
        // Если мы умножаем какую-то скорость на delta, то можем использовать
        // удобные единицы (например, "пиксель в секунду").
        cloudPositionX += delta * CLOUD_MOVEMENT_SPEED * cloudMovementDir;

        // Если облако вышло за границы экрана, меняем направление движения
        // на противоположное.
        if (cloudPositionX > VIEWPORT_WIDTH) {
            cloudMovementDir = -1;
        } else if (cloudPositionX + cloudSizeX < 0) {
            cloudMovementDir = 1;
        }

        // Обновление позиции машины
        carPositionX += delta * carMovementSpeed;
        if (carPositionX > VIEWPORT_WIDTH + CAR_WIDTH) {
            carPositionX = -CAR_WIDTH; // Возвращаем машину за левую границу после выхода за правую
        }
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        drawLandscape(g);
        drawHouse(g);
        drawCloud(g);
        drawCar(g);
        drawSun(g);
    }
    // Рисуем ландшафт
    private void drawLandscape(Graphics g) {
        g.setColor(new Color(109, 141, 35));
        g.fillRect(0, VIEWPORT_HEIGHT / 2, VIEWPORT_WIDTH, VIEWPORT_HEIGHT / 2);
    }

    private void drawHouse(Graphics g) {
        final int HOUSE_ORIGIN_X = 300;
        final int HOUSE_ORIGIN_Y = 320;
        final int HOUSE_WIDTH = 100;
        final int HOUSE_HEIGHT = 100;
        final int HOUSE_ROOF_HEIGHT = 50;

        // Корпус дома
        g.setColor(new Color(255, 228, 196)); // Бежевый цвет
        g.fillRect(HOUSE_ORIGIN_X, HOUSE_ORIGIN_Y, HOUSE_WIDTH, HOUSE_HEIGHT);

        // Крыша дома
        Polygon roof = new Polygon();
        roof.addPoint(HOUSE_ORIGIN_X, HOUSE_ORIGIN_Y);
        roof.addPoint(HOUSE_ORIGIN_X + HOUSE_WIDTH / 2, HOUSE_ORIGIN_Y - HOUSE_ROOF_HEIGHT);
        roof.addPoint(HOUSE_ORIGIN_X + HOUSE_WIDTH, HOUSE_ORIGIN_Y);
        g.setColor(new Color(139, 69, 19)); // Коричневый цвет
        g.fillPolygon(roof);

        // Окно
        g.setColor(Color.CYAN);
        g.fillRect(HOUSE_ORIGIN_X + (HOUSE_WIDTH / 2) - 15, HOUSE_ORIGIN_Y + 25, 30, 30);

        // Дверь
        g.setColor(new Color(139, 69, 19)); // Коричневый цвет
        g.fillRect(HOUSE_ORIGIN_X + (HOUSE_WIDTH / 3), HOUSE_ORIGIN_Y + 50, 20, 50);

        // Разделитель между крышей и корпусом дома
        g.setColor(Color.BLACK);
        g.drawLine(HOUSE_ORIGIN_X, HOUSE_ORIGIN_Y, HOUSE_ORIGIN_X + HOUSE_WIDTH, HOUSE_ORIGIN_Y);
    }

    private void drawCloud(Graphics g) {
        g.setColor(new Color(127, 127, 127));
        g.fillOval(cloudPositionX, cloudPositionY, cloudSizeX, cloudSizeY);
    }

    private void drawCar(Graphics g) {
        g.setColor(Color.RED);
        g.fillRect(carPositionX, carPositionY, CAR_WIDTH, CAR_HEIGHT);

        // Колеса у машины
        g.setColor(Color.BLACK);
        g.fillOval(carPositionX + 10, carPositionY + CAR_HEIGHT - 10, 20, 20);
        g.fillOval(carPositionX + 50, carPositionY + CAR_HEIGHT - 10, 20, 20);
    }

    private void drawSun(Graphics g) {
        final int SUN_RADIUS = 40;
        final int SUN_POSITION_X = VIEWPORT_WIDTH - 100;
        final int SUN_POSITION_Y = 50;

        // Рисование солнца
        g.setColor(Color.YELLOW);
        g.fillOval(SUN_POSITION_X, SUN_POSITION_Y, SUN_RADIUS * 2, SUN_RADIUS * 2);
    }
}

public class Main extends JFrame {
    private Timer timer;
    private final Viewport viewport = new Viewport();

    public Main() {
        super("Hello, graphics!");
// Запрещаем масштабирование
        setResizable(false);
// Останавливаем процесс приложения при закрытии окна
        setDefaultCloseOperation(EXIT_ON_CLOSE);
// Добавляем рисуемую область на окно
        getContentPane().add(viewport);
        // Перемасштабируем все элементы, чтобы их размер
        // соответствовал заданному
        pack();
        // Создаём таймер, который будет "тикать" раз в 33 миллисекунды.
        // В каждом тике вызываем обновление сцены (для анимации)
        // и перерисовку сцены.
        timer = new Timer(33, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                viewport.update(1.0f / 33.0f);
                viewport.repaint();
            }
        });
// Показываем окно на экране
        setVisible(true);
// Запускаем таймер
        timer.start();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(Main::new);
    }
}
добавь в этот код небольшое дерево и дорогу по которой едет машина