使用鼠标单击生成球 [英] Using Mouse Click to Generate Balls

查看:171
本文介绍了使用鼠标单击生成球的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下代码,我需要更改它,以便通过鼠标点击生成球,而不是一次生成所有球。我知道我需要使用鼠标监听器,但我不知道如何在没有破坏应用程序的情况下将其集成到我所拥有的内容中。

I have below code, I need to alter it so that the balls are generated with a mouse click rather than all of them generating at once. I know I need to use a mouse listener but I do not know how I can integrate that into what I have without "breaking" the app.

无需更改

import javax.swing.JFrame;
import java.awt.Canvas;
import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferStrategy;



public class Display {
    public final int width;
    public final int height;

    private JFrame frame;

    private boolean closeRequested;

    private long lastFrameTime;

    private BufferStrategy bufferStrategy;
    private Graphics2D graphics;

    public Display(int width, int height){
        this.width = width;
        this.height = height;
        initialize();
    }

    private void initialize() {
        frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        frame.setAutoRequestFocus(true);
        frame.setResizable(false);

        frame.addWindowListener(new WindowAdapter(){
            @Override
            public void windowClosing(WindowEvent e){
                    closeRequested = true;
    }
        });

        Canvas canvas = new Canvas();
        canvas.setIgnoreRepaint(true);
        canvas.setPreferredSize(new Dimension(width, height));

        frame.getContentPane().add(canvas);
        frame.setVisible(true);
        frame.pack();
        frame.setLocationRelativeTo(null);

        canvas.createBufferStrategy(2);
        bufferStrategy = canvas.getBufferStrategy();
        graphics = (Graphics2D) bufferStrategy.getDrawGraphics();

        lastFrameTime = System.currentTimeMillis();

    }
    public boolean isCloseRequested(){
        return closeRequested;
    }
    public void destroy() {
        frame.dispose();
    }

    public void update(){
        if (bufferStrategy.contentsLost()){
            graphics.dispose();
            graphics = (Graphics2D) bufferStrategy.getDrawGraphics();
        }
        bufferStrategy.show();
    }

    public Graphics2D getGraphics() {
        return graphics;
    }

    public void sync(int fps) {
        if (fps < 1){
            return;
        }
        long currentFrameTime = System.currentTimeMillis();
        long deltaTime = currentFrameTime - lastFrameTime;
        long timeToSleep = (1000/fps) - deltaTime;

        while (System.currentTimeMillis() - currentFrameTime < timeToSleep){
            try{
                Thread.sleep(1L);
            } catch (InterruptedException e) {
            }
        }
        lastFrameTime = System.currentTimeMillis();
    }

}

无需更改

    import java.awt.Color;

public class Ball {

    public float x;
    public float y;

    public float sX;
    public float sY;

    public int radius;

    public Color color;

    public Ball(float x, float y, float sX, float sY, int radius, Color color){
        this.x = x;
        this.y = y;
        this.sX = sX;
        this.sY = sY;
        this.radius = radius;
        this.color = color;
    }

}

这是我的地方我认为会添加鼠标监听器来生成新球。

如何更改 addBalls()用鼠标点击生成球的逻辑?

How to change addBalls() logic to generate ball with mouse click?

import java.awt.Color;
import java.awt.Graphics2D;
import java.util.ArrayList;
import java.util.Random;


public class BouncingBallsApp {

    private Display display;

    private ArrayList<Ball> balls = new ArrayList<>();

    public BouncingBallsApp() {
        display = new Display(800,600);
        addBalls();
        mainLoop();
        display.destroy();
    }

    private void mainLoop() {
        while (!display.isCloseRequested()){
            updatePhysics();
            draw(display.getGraphics());
            display.update();
            display.sync(60);
        }
    }
    //Question????How to change this logic to generate ball with mouse click
    private void addBalls() {
        int numberOfBalls = 20;
        Random random = new Random();

        for (int i = 0; i < numberOfBalls; i++){
            int radius = random.nextInt(40) + 10;

            int x = random.nextInt(display.width - radius * 2) + radius;
            int y = random.nextInt(display.height - radius * 2) + radius;

            float sX = random.nextFloat() * 10f + 3f;
            float sY = random.nextFloat() * 10f + 3f;

            Color color;
            switch (random.nextInt(4)){
                case 0:
                    color = Color.red;
                    break;
                case 1:
                    color = Color.green;
                    break;
                case 2:
                    color = Color.yellow;
                    break;
                default:
                    color = Color.blue;
                    break;                   
            }
            Ball ball = new Ball(x, y, sX, sY, radius, color);
            balls.add(ball);
        }
    }

    private void updatePhysics() {
        for (Ball ball : balls){

            ball.x += ball.sX;
            ball.y += ball.sY;

            if (ball.x - ball.radius < 0){
                ball.sX = Math.abs(ball.sX);
            } else if (ball.x + ball.radius > display.width){
                ball.sX = -Math.abs(ball.sX);
            }
            if (ball.y - ball.radius < 0){
                ball.sY = Math.abs(ball.sY);
            } else if (ball.y + ball.radius > display.height){
                ball.sY = -Math.abs(ball.sY);
            }
        }
    }

    private void draw(Graphics2D g) {
        g.setBackground(Color.black);
        g.clearRect(0,0, display.width, display.height);

        for (Ball ball : balls){
        g.setColor(ball.color);

        int x = (int) (ball.x - ball.radius);
        int y = (int) (ball.y - ball.radius);
        int size = ball.radius * 2;

        g.fillOval(x, y, size, size);
        }
    }

    public static void main(String[] args) {
        new BouncingBallsApp();
    }

}


推荐答案

BouncingBallsApp 构造函数中进行以下更改:

In BouncingBallsApp constructor do the following changes:

public BouncingBallsApp() {
    display = new Display(800,600);

    //instead of calling add balls directly, use a mouse listener 
    //addBalls();  
    display.addMouseListener(getListener());

    mainLoop();
    display.destroy();
}

添加 getListener()方法 BouncingBallsApp

private MouseListener getListener() {

    return new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            addBalls(1); //call add balls when mouse pressed 
        }
    };
}

稍微改变 addBalls()以便 numberOfBalls 成为参数:

And slightly change addBalls() so that numberOfBalls becomes an argument:

private void addBalls(int numberOfBalls) {
   //int numberOfBalls = 20;
   .....

将鼠标监听器支持添加到显示

Add mouse listener support to Display:

//add mouse listener to canvas 
void addMouseListener(MouseListener listener) {

    canvas.addMouseListener(listener);  //requiers to make canvas a field  
}

全部完成。

要生成球,只需单击画布即可。

链接修改后的代码)

All done.
To generate balls, simply click the canvas.
(A link to the modified code)

这篇关于使用鼠标单击生成球的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆