collisiontest.java

来自「java learn PPT java learn PPT java learn」· Java 代码 · 共 134 行

JAVA
134
字号
     import java.applet.*;
     import java.awt.*;
     import java.awt.geom.*; 
     import java.awt.event.*;
     import java.util.*;
       
     public class CollisionTest extends Applet implements MouseListener, MouseMotionListener
     {  
          // 画面中所包含的矩形的数量
          private final int NUM_RECTS = 10;

          // 矩形队列
          private LinkedList rectangles;

          // 用来显示半透明矩形的AlphaCompisite
          private AlphaComposite alpha;          
         
          // 当前所选择的矩形
          private Rectangle2D pick;

          public void init()
          {
               rectangles = new LinkedList();
               pick = null;

               // 用50%的透明度来创建一个AlphaComposite
               alpha = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.5f);

               // 在随机位置创建NUM_RECTS个矩形并把它们添加到队列中
               Random r = new Random();
               int width = (int)getSize().getWidth();
               int height = (int)getSize().getHeight();

               for(int i = 0; i < NUM_RECTS; i++)
               {
                    rectangles.add(new Rectangle2D.Double(
                           (double)(   Math.abs(r.nextInt())%width),
                           (double)(   Math.abs(r.nextInt())%height),
                           (double)(20+Math.abs(r.nextInt())%50), 
                           (double)(20+Math.abs(r.nextInt())%50)));
               } 

               // 不要忘记注册applet,让它监听鼠标事件
               addMouseListener(this);
               addMouseMotionListener(this);
          }

          public void paint(Graphics g)
          {
               Graphics2D g2d = (Graphics2D)g;

               // 告诉我们的Graphics2D容器使用透明度
               g2d.setComposite(alpha);

               // 绘制矩形
               g2d.setPaint(Color.BLACK);
               for(int i = 0; i < NUM_RECTS; i++)
               {
                    g2d.draw((Rectangle2D.Double)rectangles.get(i));
               }
 
               // 如果所选取的是一个有效的矩形,则对它进行冲突检测
               if(pick != null)
               {
                    Rectangle2D rect;
                    g2d.setPaint(Color.RED.darker());
                    for(int i = 0; i < NUM_RECTS; i++)
                    {
                         // 得到队列中的第 i个矩形
                         rect = (Rectangle2D)rectangles.get(i);
                                
                         // 检测重叠-- 注意我们不能检测被选取的矩形自身
                         if(pick != rect && pick.intersects(rect))
                         {
                              // 填充冲突部分
                              g2d.fill(rect);
                         }                                          
                    } 

                    // 填充所选取的矩形
                    g2d.setPaint(Color.BLUE.brighter());
                    g2d.fill(pick);
               }
          }

          // 从MouseListener接口继承来的方法
          public void mouseClicked(MouseEvent e) { }

          public void mouseEntered(MouseEvent e) { }

          public void mouseExited(MouseEvent e)  { }

          public void mousePressed(MouseEvent e)
          {
               // 尝试选取一个矩形 
               if(pick == null)
               {
                    Rectangle2D rect;
                    for(int i = 0; i < NUM_RECTS; i++)
                    {
                         rect = (Rectangle2D)rectangles.get(i);

                         // 如果矩形包含鼠标位置,则选取它
                         if(rect.contains(e.getPoint()))
                         {
                              pick = rect;
                              return;
                         }
                    } 
               }
          }

          public void mouseReleased(MouseEvent e)
          {
               // 释放所选取的矩形并重绘画面
               pick = null;
               repaint();
          } 

          // 从MouseMotionListener接口继承来的方法

          public void mouseDragged(MouseEvent e)
          {
               // 如果我们已经选取了一个矩形,则把它的位置设置为当前鼠标位置并重绘
               if(pick != null)
               {
                    pick.setRect(e.getX(), e.getY(), pick.getWidth(), pick.getHeight());
                    repaint();
               }
          }

          public void mouseMoved(MouseEvent e)  { } 

     }    // CollisionTest

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?