通过线程来实现动态的小球是一个比较复杂的过程,首先是能够让小球碰到壁后弹起来,这个方法的实现有一些技巧在里面,就是定义的的哥方方向变量,通过把方向赋予一定的值从而来使用switch语句或是if语句进行判断。以达到转变方向的过程。这是弹球的主要思想
首先是定义了一个面板类.
/** * 定义一个画画类,用来生成面板和画画。 * @author 周建权 20130713 * */ public class Draw extends JFrame { private JPanel jpanel; private Graphics g; /** * @param args */ public static void main(String[] args) { Draw draw = new Draw(); draw.initUI(); } public void initUI(){ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.setTitle("弹球"); this.setSize(600, 600); this.setLayout(new BorderLayout()); JPanel jp = new JPanel(); jpanel = new JPanel(); this.add(jp,BorderLayout.NORTH); this.add(jpanel,BorderLayout.CENTER); JButton jbu1=new JButton("增加"); JButton jbu2=new JButton("继续"); JButton jbu3=new JButton("暂停"); JButton jbu4=new JButton ("随机删除"); JButton jbu5=new JButton("顺序删除"); JButton jbu6=new JButton("点鼠标删除"); jp.add(jbu1); jp.add(jbu2); jp.add(jbu3); jp.add(jbu4); jp.add(jbu5); jp.add(jbu6); jbu4.setForeground(Color.blue); jbu1.setForeground(Color.blue); jbu2.setForeground(Color.blue); jbu3.setForeground(Color.blue); jbu5.setForeground(Color.blue); jbu6.setForeground(Color.blue); this.setVisible(true); ThreadListener l=new ThreadListener(jpanel); jbu1.addActionListener(l); jbu2.addActionListener(l); jbu3.addActionListener(l); jbu4.addActionListener(l); jbu5.addActionListener(l); jbu6.addActionListener(l); /** * 打算添加图片,还没实现此功能。 */ jpanel.setUI(new PanelUI(){ ImageIcon image=new ImageIcon(); public void paint(Graphics g,JComponent c){ g.drawImage(image.getImage(),0,0,null); } }); } }
接着就是实现小球主要功能的方法了。小球的各个功能都以此为基础
/** * 线程类 * @author 周建权 2013.7.18 * */ public class DrawThread extends Thread { private Graphics g; private JPanel jp; private static ArrayList<DrawThread> ball = new ArrayList<DrawThread>(); //定义方向 private static final int UP=1; private static final int DOWN=2; private static final int LEFT=3; private static final int RIGHT=4; //定义小球位置 private int x,lastx; private int y,lasty; public int getX() { return x; } public void setX(int x) { this.x = x; } public int getY() { return y; } public void setY(int y) { this.y = y; } // 定义半径 private int radius; public int getRadius() { return radius; } public void setRadius(int radius) { this.radius = radius; } //定义停止暂停 private boolean pauseFlag=false; private boolean stopFlag=false; //定义速度 private int xspeed; private int yspeed; //球的运动方向 private int xdirection=RIGHT; private int ydirection=DOWN; //定义颜色 private Color co; public DrawThread(JPanel jpanel){ this.jp=jpanel; this.g=jpanel.getGraphics(); } public static ArrayList<DrawThread> getList() { return ball; } /** * run函数 */ public void run(){ init(); while(true){ try{ Thread.sleep(200); }catch(Exception ef){} if(pauseFlag==true){ continue; } if(stopFlag==true){ clear(); return; } clear(); move(); draw(); } } /** * 定义变量的初始值 */ public void init(){ Random random=new Random(); xspeed=30+random.nextInt(20); yspeed=10+random.nextInt(40); radius=15+random.nextInt(30); co=new Color(random.nextInt(256),random.nextInt(256),random.nextInt(256)); } /** * 小球移动的方法 */ public void move(){ if(x<radius/2){xdirection=RIGHT;} else if(x>jp.getWidth()-3*radius/2){xdirection=LEFT;} if(y<radius/2){ydirection=DOWN;} else if(y>jp.getHeight()-3*radius/2){ydirection=UP;} lastx=x; lasty=y; if(this.xdirection==LEFT){ x-=this.xspeed; if(collsion(LEFT)){ xdirection=RIGHT; } } else if(this.xdirection==RIGHT){ x+=this.xspeed; if(collsion(RIGHT)){ xdirection=LEFT; } if(this.ydirection==UP){ y-=this.yspeed; if(collsion(UP)){ ydirection=DOWN; } } else if(this.ydirection==DOWN){ y+=this.yspeed; if(collsion(DOWN)){ ydirection=UP; } } } } public void fillcircle(int x,int y,int radius){ g.fillOval(x-radius, y-radius, 2*radius, 2*radius); } /** * 绘制小球的方法 */ public void draw(){ g.setColor(co); fillcircle(x, y, radius); int r=co.getRed(); int G=co.getGreen(); int b=co.getBlue(); int radius=this.radius;//很诡秘的代码。 while(radius>3){ radius-=2; G+=10; r+=10; b+=10; if(G>255){G=255;} if(r>255){r=255;} if(b>255){b=255;} Color d=new Color(r,G,b); g.setColor(d); fillcircle(x,y,radius); } } /** * 擦除小球的方法 */ public void clear(){ g.setColor(this.jp.getBackground()); fillcircle(x, y, 2*radius); } /** * 定义一个设置暂停布尔值的方法 * @param flag */ public void setPause(boolean flag){ pauseFlag=flag; } /** * 设置停止方法中的布尔值一直为true,线程不可重复开始,停止后直接退出 */ public void setStop(boolean flag){ this.stopFlag = flag; } /** * 定义一个碰撞方法,该方法用于判断两个小球是否碰撞。 * @param direction * @return若两球碰撞则返回true,若不碰撞则返回false */ private boolean collsion(int direction){ for(int i=0;i<ball.size();i++){System.out.println(ball.size()); DrawThread Thread=ball.get(i); if(this==Thread){ continue;} int m=Math.abs(this.getX()-Thread.getX()); int n=Math.abs(this.getY()-Thread.getY()); int o=(int)Math.sqrt(m*m+n*n); if(o<=this.radius+Thread.radius); if(direction==LEFT||direction==RIGHT) Thread.xdirection=direction; else {Thread.ydirection=direction; } int xsp=this.xspeed; int ysp=this.yspeed; this.xspeed=Thread.xspeed; this.yspeed=Thread.yspeed; Thread.xspeed=xsp; Thread.yspeed=ysp; x=lastx; y=lasty; return true; } return false; } }
下面就是添加监听器了
/** * 创建一个按钮监听器,按钮画小球 * * @author 周建权 2013.7.14 * */ public class ThreadListener extends Thread implements ActionListener { private JPanel jp; private Graphics g; public ThreadListener(JPanel jp) { this.jp = jp; } // 创建一个队列,用来存放线程 ArrayList<DrawThread> allBall = new ArrayList<DrawThread>(); public void actionPerformed(ActionEvent e) { String s = e.getActionCommand(); if (s.equals("增加")) { DrawThread Thread = new DrawThread(jp); // allBall.add(Thread); Thread.start(); allBall.add(Thread); } if (s.equals("继续")) { for (int i = 0; i < allBall.size(); i++) { DrawThread Thread = allBall.get(i); Thread.setPause(false); } } if (s.equals("暂停")) { for (int i = 0; i < allBall.size(); i++) { DrawThread Thread = allBall.get(i); Thread.setPause(true); } } if (s.equals("随机删除")) { int m = allBall.size(); System.out.println(allBall.size()); Random random = new Random(); int n = random.nextInt(m); System.out.println(n); DrawThread Thread = allBall.remove(n); Thread.setStop(true); System.out.println(n); } if (s.equals("顺序删除")) { if (!allBall.isEmpty()) { DrawThread Thread = allBall.remove(0); Thread.setStop(true); } } if(s.equals("点鼠标删除")){System.out.println("怎么不可以删除"); MouseListener mouse=new MouseListener(){ public void mouseClicked(MouseEvent e){ System.out.println(allBall.size()); for(int i=0;i<allBall.size();i++){ DrawThread Thread=allBall.get(i); int x=Math.abs(Thread.getX()-e.getX()); int y=Math.abs(Thread.getY()-e.getY()); if(x<Thread.getRadius()&&y<Thread.getRadius()){ allBall.remove(i); Thread.setStop(true); Thread.clear(); } } } public void mousePressed(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} };jp.addMouseListener(mouse); } } }
一个弹球就做好了。还有待改进的是两个小球之间的效果,这个弹出来的效果一点也不好。。。
相关推荐
本主题聚焦于“Java编写的小球线程动画”,这涉及到Java多线程编程和图形用户界面(GUI)的设计。Java作为一种面向对象的编程语言,提供了强大的支持来创建这种动态效果。 首先,我们要理解什么是线程。线程是程序...
在计算机科学领域,尤其是操作系统和并发编程中,"移动小球/多线程控制"是一个经典的教学示例,用于演示和理解多线程的概念。在这个实验中,我们看到一个简单的应用,它创建了三个小球并让它们按照特定的轨迹进行...
标题中的“多线程 小球 运行程序(eclipse工程可导入)”表明这是一个与多线程编程相关的项目,可能是用Java语言实现的,因为Eclipse是Java开发的常用集成开发环境。这个程序可能设计了一个模拟小球运动的场景,通过多...
4. **绘图与同步**:为了让用户看到小球的运动,我们需要在GUI(图形用户界面)上绘制小球。Java提供了许多库来创建GUI,如Swing或JavaFX。需要注意的是,由于线程安全问题,对GUI组件的操作通常需要在事件调度线程...
java 线程 动画
在这个场景中,每个小球可以代表一个独立运行的线程,它们在虚拟空间中移动并可能发生碰撞,这需要线程之间的协调与同步。 首先,我们要理解什么是多线程。在单线程环境中,程序执行是顺序的,而在多线程环境中,多...
本实验通过“字符移动”和“小球碰撞”两个实例,深入浅出地展示了Java多线程的概念、创建与管理。 首先,我们要理解什么是线程。线程是操作系统分配CPU时间的基本单位,一个进程可以有多个线程,它们共享进程的...
通过JAVA运用多线程控制球的运动,通过窗口中的滑条,对球的大小和颜色进行选择后,随机从窗口左右两方择一进入,小球在遇到障碍或边界后会折回。
用线程实现小球跳动,展示多线程技术,可选两种颜色的小球
在多线程环境下实现小球的运动,每个线程可能负责一个小球的运动逻辑,包括计算小球的位置变化、边界检测以及与其他小球的碰撞处理。通过定时器或者sleep()方法控制线程的执行间隔,使得小球按照设定的速度移动。这...
VC 创建多个 Thread多线程,用以执行不同任务的例子,运行程序后你可看到分别有红色、蓝色的小球,在沿各自不同的轨迹做运动,在代码中,我们创建了一个小球运动线程的主函数,分别用两个线程调用这个函数,但设定的...
在IT领域,尤其是在游戏开发与动画效果实现中,小球碰撞反弹算法是一个常见的技术要点,尤其是在J2ME(Java 2 Micro Edition)平台上的应用。本文将深入解析“小球碰撞反弹经典算法”这一主题,从算法的设计思路、...
用户能通过GUI组件指定生成小球的数量,每个小球将从随机的位置出现,并具有随机颜色,随机速度以及随机的运动方向,小球沿初始方向匀速运动,当碰到窗口边缘时,小球将依据受力原理改变运动方向(可简化考虑,受力...
本程序是多线程小球的运动案例 是用J2ME开发的 本程序是多线程小球的运动案例 是用J2ME开发的 本程序是多线程小球的运动案例 是用J2ME开发的 本程序是多线程小球的运动案例 是用J2ME开发的 本程序是多线程小球的运动...
在"多线程两个小球"的示例中,我们将会看到如何创建并管理两个并发执行的线程,每个线程控制一个小球的运动。 首先,我们需要理解多线程的概念。在单线程程序中,所有的任务按顺序执行,而多线程则允许程序同时执行...
该系统的主要功能是展示一个小球在屏幕上不断摇摆,并与其他小球发生碰撞,同时球的颜色、速度和运动方向都会因碰撞而发生变化。以下是对该项目涉及的技术点进行的详细解释: 1. **多线程**:多线程是Java的一个...
6. **线程与并发**:如果小球需要实时地在屏幕上移动,可能需要在单独的线程上执行,以避免阻塞主程序的执行。同样,时钟的计时也可能在一个后台线程上进行,确保计时的准确性。 7. **碰撞检测**:在小球的运动过程...
用户可以通过GUI与程序交互,例如启动/停止小球的运动,改变重力或小球数量等。 7. **事件处理**:在GUI应用中,事件处理是必不可少的,比如鼠标点击事件可能用于启动或暂停小球的运动。Java的AWT和Swing库提供了...
在这个游戏中,开发者可能为每个小球创建了一个单独的线程,使得每个小球都能独立地处理它的运动逻辑,而不会相互干扰。 接着,为了实现小球的运动效果,开发者需要编写计算每个小球位置变化的逻辑。这通常涉及到...
这可以通过比较小球的边界与窗口边界进行计算得出。如果发生碰撞,就需要改变小球的x或y速度的符号,以模拟反向运动。速度也可以作为类的成员变量,便于调整和检查。 在事件处理方面,我们需要监听窗口关闭事件,...