Minggu, 14 September 2025

JAVA - Physics Falling Ball

 



File : PhysicsSimulation.java

package physicssimulation;

import javax.swing.*;

import java.awt.*;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.ArrayList;

import java.util.List;


public class PhysicsSimulation extends JFrame {


    private final SimulationPanel simulationPanel;

    private final Timer timer;


    public PhysicsSimulation() {

        setTitle("2D Physics Simulation");

        setSize(800, 600);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        setLocationRelativeTo(null);


        simulationPanel = new SimulationPanel();

        add(simulationPanel);


        timer = new Timer(16, new ActionListener() { // ~60 FPS

            @Override

            public void actionPerformed(ActionEvent e) {

                simulationPanel.updatePhysics();

                simulationPanel.repaint();

            }

        });

        timer.start();

    }


    public static void main(String[] args) {

        SwingUtilities.invokeLater(() -> new PhysicsSimulation().setVisible(true));

    }

}


class SimulationPanel extends JPanel {


    private final List<SimulatedObject> objects;

    private final double gravity = 0.5; // Example gravity


    public SimulationPanel() {

        objects = new ArrayList<>();

        // Add some initial objects

        objects.add(new SimulatedObject(100, 100, 20, 0, 0));

        objects.add(new SimulatedObject(300, 50, 30, 0, 0));

    }


    public void updatePhysics() {

        for (SimulatedObject obj : objects) {

            // Apply gravity

            obj.velocityY += gravity;


            // Update position

            obj.x += obj.velocityX;

            obj.y += obj.velocityY;


            // Simple boundary collision (bounce)

            if (obj.y + obj.size > getHeight()) {

                obj.y = getHeight() - obj.size;

                obj.velocityY *= -0.8; // Reduce velocity on bounce

            }

            if (obj.x + obj.size > getWidth() || obj.x < 0) {

                obj.velocityX *= -1;

            }

        }

    }


    @Override

    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);


        // Draw objects

        for (SimulatedObject obj : objects) {

            g2d.fillOval((int) obj.x, (int) obj.y, (int) obj.size, (int) obj.size);

        }

    }

}

======================================================

File : SimulatedObject.java

package physicssimulation;

class SimulatedObject {

    double x, y;

    double size;

    double velocityX, velocityY;


    public SimulatedObject(double x, double y, double size, double velocityX, double velocityY) {

        this.x = x;

        this.y = y;

        this.size = size;

        this.velocityX = velocityX;

        this.velocityY = velocityY;

    }

}


Tidak ada komentar: