/*
* 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:
Posting Komentar