Java绘制气球上升的动画

1. 创建一个基本的窗口

首先,我们需要创建一个窗口来显示绘制的气球。我们可以使用JFrame类来创建一个窗口,并将一个Canvas添加到窗口中。

import java.awt.Canvas;
import javax.swing.JFrame;

public class BalloonWindow extends JFrame {

    public BalloonWindow() {
        // 设置窗口标题
        super("Balloon Window");

        // 创建并添加一个Canvas
        Canvas canvas = new BalloonCanvas();
        getContentPane().add(canvas);
    }

    public static void main(String[] args) {
        // 创建窗口并显示它
        BalloonWindow window = new BalloonWindow();
        window.setSize(400, 600);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
    }
}

在这个代码中,BalloonWindow类继承自JFrame,并在构造函数中创建了一个BalloonCanvas的实例,并将其添加到窗口的内容面板中。在main方法中,我们创建了一个BalloonWindow实例,并设置了窗口的大小和关闭操作。

2. 绘制气球

接下来,我们需要在BalloonCanvas类中实现paint方法来绘制气球。首先,我们需要定义代表气球位置和大小的成员变量。

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;

public class BalloonCanvas extends Canvas {

    // 气球圆心坐标和半径
    private int x = 200;
    private int y = 400;
    private int radius = 50;

    @Override
    public void paint(Graphics g) {
        // 设置气球颜色
        g.setColor(Color.RED);

        // 绘制气球
        g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius);
    }
}

paint方法中,我们将画笔的颜色设置为红色,然后使用fillOval方法绘制一个"填充"红色的圆形。我们使用成员变量xy表示气球的圆心坐标,radius表示气球的半径。

如果现在运行程序,将会在窗口中显示一个红色的气球。

3. 使气球上升

为了使气球开始上升,我们需要在BalloonCanvas类中添加一些状态变量和更新它们的代码。我们可以添加一个布尔变量rising来表示气球当前是否正在上升。在run方法中,我们将气球的y坐标减小一定量(即dy),从而使气球上升。当气球到达顶部(即y - radius <= 0)时,我们将rising变量设置为false,从而停止上升。然后,气球将开始下降。

public class BalloonCanvas extends Canvas implements Runnable {

    // 气球圆心坐标和半径
    private int x = 200;
    private int y = 400;
    private int radius = 50;

    private int dy = 5;     // 上升速度
    private boolean rising = true;

    public BalloonCanvas() {
        Thread thread = new Thread(this);
        thread.start();
    }

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.RED);
        g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius);
    }

    @Override
    public void run() {
        while (true) {
            if (rising) {
                y -= dy;
                if (y - radius <= 0) {
                    rising = false;
                }
            } else {
                y += dy;
                if (y + radius >= getHeight()) {
                    break;
                }
            }
            repaint();
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在上面的代码中,我们实现了Runnable接口,从而可以在BalloonCanvas的构造函数中创建一个新线程,并在其中执行run方法。在run方法中,我们检查气球是否正在上升(即rising变量为true),如果是,我们将y坐标减去dy,即上升气球的速度。当气球到达顶部时,我们将rising变量设置为false,表示气球需要开始下降。然后在下降状态下,我们将y坐标增加dy。我们使用getHeight方法来获取窗口的高度,以确保气球不会超出窗口的底部。

最后,我们在run方法的末尾调用repaint方法,以便在改变气球位置后重新绘制它。我们在每个循环中使用Thread.sleep方法来暂停执行一段时间,以便我们可以看到气球上升和下降的效果。

4. 运行程序

现在我们已经完成了气球上升的Java程序。要运行程序,就会看到一个红色的气球在窗口中上升和下降。

以下为完整代码

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JFrame;

public class BalloonWindow extends JFrame {

    public BalloonWindow() {
        // 设置窗口标题
        super("Balloon Window");

        // 创建并添加一个Canvas
        Canvas canvas = new BalloonCanvas();
        getContentPane().add(canvas);
    }

    public static void main(String[] args) {
        // 创建窗口并显示它
        BalloonWindow window = new BalloonWindow();
        window.setSize(400, 600);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setVisible(true);
    }
}

class BalloonCanvas extends Canvas implements Runnable {

    // 气球圆心坐标和半径
    private int x = 200;
    private int y = 400;
    private int radius = 50;

    private int dy = 5;     // 上升速度
    private boolean rising = true;

    public BalloonCanvas() {
        Thread thread = new Thread(this);
        thread.start();
    }

    @Override
    public void paint(Graphics g) {
        g.setColor(Color.RED);
        g.fillOval(x - radius, y - radius, 2 * radius, 2 * radius);
    }

    @Override
    public void run() {
        while (true) {
            if (rising) {
                y -= dy;
                if (y - radius <= 0) {
                    rising = false;
                }
            } else {
                y += dy;
                if (y + radius >= getHeight()) {
                    break;
                }
            }
            repaint();
            try {
                Thread.sleep(50);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值