小球碰撞

采用java awt以及swing写的小球碰撞

线程是一个非常重要的知识块!!!

//球类
public class Ball {

    //1.属性:所有球的共同的字段
    int x;
    int y;
    int d;//球的半径
    int speed;//速度
    int dir; //方向
    Color c;//颜色

    //定义四个方向
    public static final int LEFT_UP = 1;//左上
    public static final int LEFT_DOWN = 2;//左下
    public static final int RIGHT_UP = 3;//右上
    public static final int RIDHT_DOWN = 4;//右下

    //构造器 随机构造
    public Ball() {

         x = (int) (Math.random()*800);

         y = (int)(Math.random()*600);

         d = (int)(Math.random()*50) + 50;

         c = new Color(
                 (int)(Math.random()*256),
                 (int)(Math.random()*256),
                 (int)(Math.random()*256));

        dir = (int)(Math.random()*4) + 1;

        speed = (int)(Math.random()*5) + 5;

    }

    //行为:
    //画
    /*  fillOval方法:
            使用当前颜色填充外接指定矩形框的椭圆。
        参数:
        x - 要填充椭圆的左上角的 x 坐标。
        y - 要填充椭圆的左上角的 y 坐标。
        width - 要填充椭圆的宽度。
        height - 要填充椭圆的高度。
     */
    public void draw(Graphics g) {
        g.setColor(c);//设置颜色
        g.fillOval(x, y, d, d);
    }

    //根据方向更改坐标
    //碰撞检测
    public void change() {
        switch(dir) {

        case RIGHT_UP://向右上方向移动
            x += speed;//以speed的速度移动
            y -= speed;
            if(y < 0) {
                dir = RIDHT_DOWN;
            }
            if(x > 800-d) {
                dir = LEFT_UP;
            }
            break;
        case RIDHT_DOWN://向右下方向移动
            x += speed;
            y += speed;
            if(x > 800-d) {
                //dir = RIDHT_DOWN;
                dir = LEFT_DOWN;
            }
            if(y > 600-d) {
                dir = RIGHT_UP;
            }
            break;
        case LEFT_UP://向左上方向移动
            x -= speed;
            y -= speed;
            if(x < 0) {
                dir = RIGHT_UP;
            }
            if(y < 0) {
                dir = LEFT_DOWN;
            }
            break;
        case LEFT_DOWN://向左下方向移动
            x -= speed;
            y += speed;
            if(x < 0) {//当碰到左边界,让小球方向改为右下
                dir = RIDHT_DOWN;
            }
            if(y > 600-d) {//当碰到下边界,让小球方向改为左上
                dir = LEFT_UP;
            }

            break;
        default:
            System.out.println("error");
            System.exit(0);
        }
    }
}
//窗体public class BallFrame extends JFrame{

    //构造器
    public BallFrame() {
        //创建窗体 最底层
//        JFrame frame = new JFrame("窗体"); //让BallFrame继承JFrame 则直接用this调用
        //设置窗体的位置和大小
//        frame.setBounds(500,200,800,600);//x y 宽 高
        this.setBounds(500,200,800,600);

        //容器类
        //JPanel panel = new JPanel();
        BallPanel panel = new BallPanel();

        //设置背景颜色
        panel.setBackground(Color.black);

        //将容器添加到窗体上  容器在窗体上层
//        frame.add(panel);
        this.add(panel);

        panel.move();//球体移动方法

        //设置窗体显示
//        frame.setVisible(true);
        this.setVisible(true);

        //设置窗体关闭
//        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

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

}
/*
 * 1 创建数组,存放多个球
 * 2 在构造方法中,对数组进行初始化
 * 3 在paint方法中,用for循环遍历每个球
 * 4 在move中 通过遍历到的球
 *
 */
//自定义容器类
public class BallPanel extends JPanel{

    //创建一个球的对象
    Ball b1 = new Ball();

    Ball[] balls = new Ball[20];

    //构造
    public BallPanel() {
        for(int i = 0 ; i < balls.length ; i++) {
            balls[i] = new Ball();
        }
    }
    //重写父类绘图方法
    //Graphics 画笔类
    public void paint(Graphics g) {
        super.paint(g);

        b1.draw(g);

        for(int i = 0 ; i < balls.length ; i++) {
            balls[i].draw(g);
        }

    }

    //move方法
    public void move() {

        //开辟新的线程
        new Thread() {
            public void run() {
                while(true) {
                    b1.change();

                    for(int i = 0 ; i < balls.length ; i++) {
                        balls[i].change();
                    }
                    //重构
                    repaint();
                    try {
                        Thread.sleep(50);
                    }catch(Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        }.start();

    }
}

原文地址:https://www.cnblogs.com/jiang0123/p/11285986.html

时间: 2024-11-13 09:56:05

小球碰撞的相关文章

小球碰撞墙壁----干掉误差

之前一直在沿用之前听课学来的"千篇一律"的小球碰撞墙壁或者地板的计算方法. 忽然发现,小球碰撞的时候,其实小球有一部分是进入了墙的里面,在小球速度并不快的情况下,或许不明显,但是当小球速度变的更快,小球半径也更大的时候,就没法看了 效果如下 代码如下(所有代码都只在chrome或者safari下能用,因为requestAnimationFrame方法我并没有写兼容): <!doctype html> <html> <head> <meta ch

HTML5 Canvas彩色小球碰撞运动特效

脚本简介 HTML5 Canvas彩色小球碰撞运动特效是一款基于canvas加面向对象制作的运动小球动画特效. 效果展示 http://hovertree.com/texiao/html5/39/ 效果图如下: 代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>HTML5 Canvas彩色小球碰撞运动特效

Canvas+Js制作动量守恒的小球碰撞

目的:通过js实现小球碰撞并实现动量守恒 canvas我们就不多说了,有用着呢. 我们可以通过canvas画2D图形(圆.方块.三角形等等)3D图形(球体.正方体等待). 当然这只是基础的皮毛而已,canvas的强大之处在于可以做游戏,导入模型,粒子效果,实现漫游又或者全景和VR. 这里我们介绍纯js写的2D小球碰撞.(主要是博主的Three.js不咋地) 好吧,老规矩,先上图! 额...很尴尬的是博主的截图功底不咋地,没有截下碰撞的瞬间. 话不多说,开始教程. 首先我们需要创建画布给它一个id

1-2018-3-2小球碰撞

http://118.190.20.162/view.page?gpid=T72 试题编号: 201803-2 试题名称: 碰撞的小球 时间限制: 1.0s 内存限制: 256.0MB 问题描述: 问题描述 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上,速度方向向右,速度大小为1单位长度每秒. 当小球到达线段的端点(左端点或右端点)的时候,会立即向相反的方向移动,速度大小仍然为原来大小. 当两个小球撞到一起

Unity学习笔记 之 发射小球碰撞物体的代码记录

绑定在摄像机上的脚本 using UnityEngine; using System.Collections; public class abc : MonoBehaviour { //设置移动速度 public int speed = 5; //设置将被初始化载入的对象 public Transform newobject = null; // Use this for initialization void Start () { } // Update is called once per

【鸡年大吉】,不知道写点啥,放个demo(小球碰撞)吧,有兴趣的看看

最初的想法是仿写win7的泡泡屏保效果,但是对于小球的斜碰问题一直没搞明白(如果你会这个,欢迎留言或者做个demo),所以只是简单处理了碰撞后的速度,有时候会看起来很搞笑~~~funny guy 话不多说,先上demo https://win7killer.github.io/can_ps/src/demo/ball.html 效果如下: code: 1 <!DOCTYPE html> 2 <html lang="zh"> 3 4 <head> 5

JS (canvas) 两个小球碰撞

<style media="screen"> * { margin: 0; padding: 0; } canvas { box-shadow: 0 0 40px black; margin: 50px; } </style> <canvas id="canvas" width="500" height="500">您的浏览器不支持canvas</canvas> <scri

java实现小球碰撞反弹

首先我们要在一个窗口里面显示这个功能,因此引入JFrame类然后创建一个窗口代码如下:JFrame win=new JFrame();//新建窗口 win.setLocation(250,100);//设置窗口位置 win.setSize(800,600);//设置窗口大小 win.show();//显示窗口win.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置关闭退出显示如下:要实现这个功能做基础的就是要有一个小球,就像人吃饭这句话,少了

多线程之碰撞小球

弹球游戏是一款模拟多线程运行的游戏,利用继承Thread实现多线程. 效果图:小球之间会相互碰撞并交换速度在弹开.按钮能实现随机添加.移除小球并暂停小球移动. 具体实现: 1.创建界面(包含主函数). public class BallFrame extends JFrame {public static void main(String[] args) { BallFrame bf = new BallFrame(); bf.initUI(); } public void initUI(){