球撞随机出现的墙反弹

来源:互联网 发布:英语网络外教 编辑:程序博客网 时间:2024/04/28 07:00

/*
 * 球在屏幕内做反弹运动,遇到随机画出的墙以后反弹,但是边沿处理得不够完美,在运动的边角的时候会出现很微小的异常状况,

 *只要调整好坐标,就能够解决这个问题。

 * 运行分辨率为1280*800
 */

以下是效果截图:

球撞随机出现的墙反弹 - lishirong - The CTO of LiShirong

 以下是效果的视频:

以下是代码部分:↓


import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class BallHitWall extends JWindow{
 BallHitWall(){
  this.setSize(1440,900);
  this.setVisible(true);
 }
 public static void main(String args[]){
  BallHitWall bhw=new BallHitWall();
  MyHitBall mhb=new MyHitBall();
  mhb.setBackground(Color.green);
  bhw.add(mhb);
  bhw.addMouseListener(mhb);
  mhb.addMouseListener(mhb);
  bhw.addMouseMotionListener(mhb);
  mhb.addMouseMotionListener(mhb);
  Thread t=new Thread(mhb);
  t.start();
  bhw.show();
 }
}

class MyHitBall extends Panel implements Runnable,MouseListener,MouseMotionListener{
 int startX,startY,endX,endY;
 int count=0;
 int x=20;
 int y=20;
 int f=0;
 int rect[][]=new int[1000][4];
 public void paint(Graphics g){
  g.setColor(Color.orange);
  g.fillOval(x, y, 50, 50);
  g.setColor(Color.blue);
  g.drawRect(startX, startY, endX-startX, endY-startY);
  for(int i=0;i<count;i++){
   g.fillRect(rect[i][0], rect[i][1], rect[i][2]-rect[i][0], rect[i][3]-rect[i][1]);
  }
 }
 public void run() {
  // TODO Auto-generated method stub
  while(true){
   if(f==0){
    x++;
    y++;
    if(x>1230){
     f=1;
    }
    if(y>750){
     f=3;
    }
    for(int i=0;i<count;i++){
     /*
      * 首先判定球进入某一个矩形区域
      * 如果不判断那将是至边框的一个很大的边界
      * 从此处可以看出,编程的确是很灵活的O(∩_∩)O哈哈~
      */
     //判断是否从左上至右下进入某一矩形区域
     if(x+50>rect[i][0]&&y+50>rect[i][1]&&x+50<rect[i][2]&&y+50<rect[i][3]){
      if(Math.abs(x+50-rect[i][0])==0&&Math.abs(y+50-rect[i][1])==0){
       f=2;//如果撞到边框左上角直接反弹
      }
      if(Math.abs(x+50-rect[i][0])>Math.abs(y+50-rect[i][1])){
       f=3;//撞到上边,此处用绝对值来判定的
      }
      if(Math.abs(x+50-rect[i][0])<Math.abs(y+50-rect[i][1])){
       f=1;//撞到左边,此处也是用绝对值来判定的
      }
     }
    }
   }
   if(f==1){
    x--;
    y++;
    if(x<0){
     f=0;
    }
    if(y>750){
     f=2;
    }
    for(int i=0;i<count;i++){
     //判断是否从右上至左下进入某一矩形区域
     if(x>rect[i][0]&&y+50>rect[i][1]&&x<rect[i][2]&&y+50<rect[i][3]){
      if(Math.abs(x-rect[i][2])==0&&Math.abs(y+50-rect[i][1])==0){
       f=3;//如果撞到边框右上角直接反弹
      }
      if(Math.abs(x-rect[i][2])>Math.abs(y+50-rect[i][1])){
       f=2;//撞到上边,此处用绝对值来判定的
      }
      if(Math.abs(x-rect[i][2])<Math.abs(y+50-rect[i][1])){
       f=0;//撞到右边,此处也是用绝对值来判定的
      }
     }
    }
   }
   if(f==2){
    x--;
    y--;
    if(x<0){
     f=3;
    }
    if(y<0){
     f=1;
    }
    for(int i=0;i<count;i++){
     //判断是否从右下至左上进入某一矩形区域
     if(x>rect[i][0]&&y>rect[i][1]&&x<rect[i][2]&&y<rect[i][3]){
      if(Math.abs(x-rect[i][2])==0&&Math.abs(y-rect[i][3])==0){
       f=0;//如果撞到边框右下角直接反弹
      }
      if(Math.abs(x-rect[i][2])>Math.abs(y-rect[i][3])){
       f=1;//撞到下边,此处用绝对值来判定的
      }
      if(Math.abs(x-rect[i][2])<Math.abs(y-rect[i][1])){
       f=3;//撞到右边,此处也是用绝对值来判定的
      }
     }
    }
   }
   if(f==3){
    x++;
    y--;
    if(x>1230){
     f=2;
    }
    if(y<0){
     f=0;
    }
    //判断是否从左下至右上进入某一矩形区域
    for(int i=0;i<count;i++){
     if(x+50>rect[i][0]&&y>rect[i][1]&&x+50<rect[i][2]&&y<rect[i][3]){
      if(Math.abs(x+50-rect[i][0])==0&&Math.abs(y-rect[i][3])==0){
       f=1;//如果撞到边框左下角直接反弹
      }
      if(Math.abs(x+50-rect[i][0])>Math.abs(y-rect[i][3])){
       f=0;//撞到下边,此处用绝对值来判定的
      }
      if(Math.abs(x+50-rect[i][2])<Math.abs(y-rect[i][1])){
       f=2;//撞到左边,此处也是用绝对值来判定的
      }
     }
    }
   }
   try {
    Thread.sleep(3);
   } catch (InterruptedException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
   repaint();
  }
 }

 public void mouseClicked(MouseEvent arg0) {
  // TODO Auto-generated method stub
  
 }

 public void mouseEntered(MouseEvent arg0) {
  // TODO Auto-generated method stub
  
 }

 public void mouseExited(MouseEvent arg0) {
  // TODO Auto-generated method stub
  
 }

 public void mousePressed(MouseEvent arg0) {
  // TODO Auto-generated method stub
  startX=arg0.getX();
  startY=arg0.getY();
 }

 public void mouseReleased(MouseEvent arg0) {
  // TODO Auto-generated method stub
  endX=arg0.getX();
  endY=arg0.getY();
  rect[count][0]=startX;
  rect[count][1]=startY;
  rect[count][2]=endX;
  rect[count][3]=endY;
  count++;
  repaint();
 }

 public void mouseDragged(MouseEvent arg0) {
  // TODO Auto-generated method stub
  endX=arg0.getX();
  endY=arg0.getY();
  repaint();
 }

 public void mouseMoved(MouseEvent arg0) {
  // TODO Auto-generated method stub
  
 }
 
}

0 0
原创粉丝点击