Sabtu, 02 Mei 2026

JAVA - Quadcopter Game - Shape Circle

 





/*

 * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license

 * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Main.java to edit this template

 */

package quadcopteranimation;

import javax.swing.*;

import java.awt.*;

import java.awt.event.*;

import java.awt.geom.AffineTransform;


public class QuadcopterSim extends JPanel implements ActionListener, KeyListener {

    private int x = 250, y = 250; // Body position

    private double angle = 0;      // Rotor rotation angle

    private final int speed = 5;   // Movement speed

    private Timer timer;


    public QuadcopterSim() {

        setFocusable(true);

        addKeyListener(this);

        // Timer fires every 16ms (~60 FPS)

        timer = new Timer(16, this);

        timer.start();

    }


    @Override

    protected void paintComponent(Graphics g) {

        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

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


        int bodyWidth = 35;

        int bodyHeight = 35;

        int spokeLen = 30;


        // 1. Draw the Body (Rectangle)

        g2d.setColor(Color.BLACK);

        g2d.drawOval(x - bodyWidth/2, y - bodyHeight/2, bodyWidth, bodyHeight);


        // 2. Draw Spokes and Rotors

        // Relative positions for the 4 corners

        int[][] offsets = {{-1, -1}, {1, -1}, {-1, 1}, {1, 1}};

        

        for (int[] pos : offsets) {

            int endX = x + (pos[0] * spokeLen);

            int endY = y + (pos[1] * spokeLen);


            // Draw Spoke

            g2d.setColor(Color.GRAY);

            g2d.drawLine(x, y, endX, endY);


            // Draw Rotating Rotor

            drawRotor(g2d, endX, endY, angle);

        }

    }


    private void drawRotor(Graphics2D g2d, int cx, int cy, double angle) {

        AffineTransform old = g2d.getTransform();

        g2d.translate(cx, cy);

        g2d.rotate(angle);

        

        g2d.setColor(Color.RED);

        // Draw the rotor circle

        g2d.drawOval(-15, -15, 30, 30);

        // Draw a line across the circle to show rotation

        g2d.drawLine(-15, 0, 15, 0);

        

        g2d.setTransform(old);

    }


    @Override

    public void actionPerformed(ActionEvent e) {

        angle += 0.3; // Spin the rotors

        repaint();

    }


    @Override

    public void keyPressed(KeyEvent e) {

        int key = e.getKeyCode();

        if (key == KeyEvent.VK_W) y -= speed;

        if (key == KeyEvent.VK_S) y += speed;

        if (key == KeyEvent.VK_A) x -= speed;

        if (key == KeyEvent.VK_D) x += speed;

    }


    @Override public void keyReleased(KeyEvent e) {}

    @Override public void keyTyped(KeyEvent e) {}


    public static void main(String[] args) {

        JFrame frame = new JFrame("Quadcopter GUI Control");

        frame.add(new QuadcopterSim());

        frame.setSize(600, 600);

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        frame.setVisible(true);

    }

}

Tidak ada komentar: