球撞随机出现的墙反弹
来源:互联网 发布:英语网络外教 编辑:程序博客网 时间:2024/04/28 07:00
/*
* 球在屏幕内做反弹运动,遇到随机画出的墙以后反弹,但是边沿处理得不够完美,在运动的边角的时候会出现很微小的异常状况,
*只要调整好坐标,就能够解决这个问题。
* 运行分辨率为1280*800
*/
以下是效果截图:
以下是效果的视频:
以下是代码部分:↓
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
}
}
- 球撞随机出现的墙反弹
- 27-反弹的球
- 求球的反弹高度
- 遇墙反弹的球(练习4)
- 小练习 ---- 球的落下反弹
- 面向对象解决球的反弹问题
- 随机出现定义的文字
- 港股出现强劲反弹
- 1118 反弹的小球
- 自动反弹的HorizontalScrollView
- ScrollView的反弹效果
- collectionView的反弹效果
- 随机出现的图片小程序
- 统计随机生成的数出现次数
- 三消模块出现随机的办法
- 【随机出现玫瑰图片的gif】
- 利用printf()实现简单动画,触界反弹的球
- 习题:求一个球反弹高度与经过的距离
- 都是我的错4
- 通过鼠标拖拽来画矩形(练习6)
- 中国足球,这场比赛你赢了,但是我看出你已经输得麻木了!
- 豆瓣的Url结构方式一览
- 小资料集锦
- 球撞随机出现的墙反弹
- 打字母游戏
- 都是我的错5
- cordova项目创建
- 用ArrayList存储HashSet中的随机数并排序、查找
- 用IO流对文件进行复制操作
- 打印目录及文件
- 都是我的错6
- 《卡特教练》观后感