`
wangxiaohigh
  • 浏览: 1463229 次
文章分类
社区版块
存档分类
最新评论

Java模拟桌球打击处理及绘制

 
阅读更多
由于Java可以很轻易的完成比较复杂的数学运算,所以我们经常能看到物理领域的问题借助Java实现效果演示,下面我给出一个桌球碰撞的处理及绘制实例。

packageorg.test.mail;

importjava.awt.Color;
importjava.awt.Frame;
importjava.awt.Graphics;
importjava.awt.Image;
importjava.awt.Panel;
importjava.awt.event.MouseEvent;
importjava.awt.event.MouseListener;
importjava.awt.event.MouseMotionListener;
importjava.awt.event.WindowAdapter;
importjava.awt.event.WindowEvent;
importjava.awt.image.BufferedImage;

/***//**
*<p>
*Title:LoonFramework
*</p>
*<p>
*Description:Java桌球演示
*</p>
*<p>
*Copyright:Copyright(c)2007
*</p>
*<p>
*Company:LoonFramework
*</p>
*
*
@authorchenpeng
*@email:ceponline@yahoo.com.cn
*
@version0.1
*/


publicclassJavaBilliardsextendsPanelimplementsRunnable,MouseListener,
MouseMotionListener
...{

/***//**
*
*/

privatestaticfinallongserialVersionUID=-5019885590391523441L;

//
privatedouble_ball;

//缓存用背景
privateImage_screen;

//画布
privateGraphics_graphics;

//台桌
privateImage_table;

privatedoublec[];

privatedoubled[];

privatedoublee[];

privatedoublef[];

privateintcountBall;

privateinth;

privatedoublei[];

privatedoublej[];

privatedoublek[];

privatedoublel[];

privatedoublem[];

privatedoublen[];

privatedoubleo[];

privatedoublep[];

privatebooleanq[];

privatedoubler;

privateinta;

privateintu;

privateintv;

privateintw;

privateintx;

privatebooleany;

privateintz;

privateintA;

/***//**
*初始化
*
*/

publicJavaBilliards()...{
a
=0;
r
=10D;
z
=300;
A
=0;
setBounds(
50,50,700,350);
Frameframe
=newFrame("Java桌球演示");
frame.add(
this);
frame.setBounds(
0,0,700,380);
frame.setResizable(
false);
frame.setVisible(
true);
frame.addWindowListener(
newWindowAdapter()...{
publicvoidwindowClosing(WindowEvente)...{
System.exit(
0);
}

}
);
requestFocus();
initialize();
}


publicvoidinitialize()...{
//基础数据
base();
//注入实例
immit();
//缓存背景
_screen=newBufferedImage(this.getWidth(),this.getHeight(),1);
//背景图形
_graphics=_screen.getGraphics();
//绘制台桌
makeTable();
//设置监听
addMouseListener(this);
addMouseMotionListener(
this);
//启动
newThread(this).start();
}


/***//**
*初始化数据
*
*/

publicvoidbase()...{

//球体
_ball=16D;
c
=(newdouble[]...{40D,(double)(getWidth()-40)});
d
=(newdouble[]...{c[0],(double)getHeight()-c[0]});
e
=(newdouble[]...{c[0]+20D,(double)(getWidth()/2),c[1]-20D});
f
=(newdouble[]...{d[0]+20D,d[1]-20D});
}


/***//**
*注入实例
*
*/

publicvoidimmit()...{
countBall
=16;
i
=newdouble[countBall];
j
=newdouble[countBall];
k
=newdouble[countBall];
l
=newdouble[countBall];
m
=newdouble[countBall];
n
=newdouble[countBall];
o
=newdouble[countBall];
p
=newdouble[countBall];
q
=newboolean[countBall];
//打击对象
hitObject();
//打击用球
hitBall();
}


/***//**
*打击用球数值
*
*/

publicvoidhitBall()...{
i[
0]=(1.0D*(e[2]-e[0]))/3D;
j[
0]=this.getHeight()/2;
k[
0]=0.0D;
l[
0]=0.0D;
q[
0]=true;
}


/***//**
*打击对象
*
*/

publicvoidhitObject()...{
intil=1;
h
=countBall-1;
//求平方根
doubledl=Math.sqrt(3.5D);
for(intj1=0;j1<5;j1++)...{
doubled2=((double)getWidth()*2D)/3D+(double)j1*dl*r;
doubled3=(double)(getHeight()/2)-(double)j1*r;
for(intk1=0;k1<=j1;k1++)...{
i[il]
=d2;
j[il]
=d3;
k[il]
=0.0D;
l[il]
=0.0D;
q[il]
=true;
d3
+=2D*r;
il
++;
}


}


}



这么点代码居然不能一次都发了……

/***//**
*绘制台球桌
*
*/

publicvoidmakeTable()...{
_table
=newBufferedImage(this.getWidth(),this.getHeight(),1);
Graphicsg
=_table.getGraphics();
g.setColor(Color.GRAY);
g.fillRect(
0,0,getWidth(),getHeight());
g.setColor((
newColor(200,100,50)).darker());
g.fill3DRect((
int)c[0],(int)d[0],(int)(c[1]-c[0]),
(
int)(d[1]-d[0]),true);
g.setColor(Color.BLACK);
g.fill3DRect((
int)e[0],(int)f[0],(int)(e[2]-e[0]),
(
int)(f[1]-f[0]),false);
g.setColor(Color.GREEN.darker());
g.drawLine((
int)((1.0D*(e[2]-e[0]))/3D),(int)f[0],
(
int)((1.0D*(e[2]-e[0]))/3D),(int)f[1]);
g.fillOval((
int)((1.0D*(e[2]-e[0]))/3D)-2,
(
int)((f[1]+f[0])/2D)-2,4,4);
g.drawArc((
int)((1.0D*(e[2]-e[0]))/3D)-20,
(
int)((f[1]+f[0])/2D)-20,40,40,90,180);
g.setColor(Color.BLACK);
doubled1=_ball-2D;
for(inti1=0;i1<3;i1++)...{
for(intj1=0;j1<2;j1++)...{
g.fillOval((
int)(e[i1]-d1),(int)(f[j1]-d1),
(
int)(2D*d1),(int)(2D*d1));
}

}

}


/***//**
*线程处理
*/

publicvoidrun()...{
longtimeStart;
timeStart
=System.currentTimeMillis();
//死循环反复处理
for(;;)...{
longtimeEnd=System.currentTimeMillis();
switch(a)...{
default:
break;

case1:
//根据时间换算运动轨迹
conversion(timeEnd-timeStart);
//过程处理
course();
break;

case2:
conversion(timeEnd
-timeStart);
//过程处理
course();
booleanflag=true;
for(inti1=0;flag&&i1<countBall;i1++)
flag
=k[i1]==0.0D&&l[i1]==0.0D;

if(flag)...{
a
=1;
//击球
if(!q[0])...{
hitBall();
}

}

if(h==0)
a
=3;
break;

case3:
hitObject();
hitBall();
a
=0;
break;
}


repaint();
timeStart
=timeEnd;
try...{
Thread.sleep(
10L);
}
catch(InterruptedExceptione1)...{
e1.printStackTrace();
}

}


}


publicvoidcourse()...{
//限制区域
limit();
//入袋处理
pocket();
//运动演算
play();
for(inti1=0;i1<countBall;i1++)
if(q[i1])...{
i[i1]
=m[i1];
j[i1]
=n[i1];
}

}


/***//**
*变换时间为动作数据
*
*
@paramvalue
*/

publicvoidconversion(longvalue)...{
doubled1=(double)value/1000D;
for(inti1=0;i1<countBall;i1++)
if(q[i1])...{
m[i1]
=i[i1]+k[i1]*d1;
n[i1]
=j[i1]+l[i1]*d1;
k[i1]
*=0.98999999999999999D;
l[i1]
*=0.98999999999999999D;
if(Math.abs(Math.hypot(k[i1],l[i1]))<2D)...{
k[i1]
=0.0D;
l[i1]
=0.0D;
}

}


}


publicvoidpocket()...{
for(inti1=0;i1<countBall;i1++)
if(q[i1])...{
for(intj1=0;j1<3;j1++)...{
for(intk1=0;k1<2;k1++)
if(Math.hypot(e[j1]-i[i1],f[k1]-j[i1])<_ball)...{
q[i1]
=false;
if(i1!=0)...{
h
--;
}

k[i1]
=0.0D;
l[i1]
=0.0D;
}


}


}


}


publicvoidplay()...{
for(inti1=0;i1<countBall;i1++)
if(q[i1])...{
for(intj1=i1+1;j1<countBall;j1++)...{
booleanflag;
if(q[j1]&&(flag=randball(i1,j1)))...{
for(intk1=0;k1<10&&flag;k1++)...{
m[i1]
=(m[i1]+i[i1])/2D;
n[i1]
=(n[i1]+j[i1])/2D;
m[j1]
=(m[j1]+i[j1])/2D;
n[j1]
=(n[j1]+j[j1])/2D;
flag
=randball(i1,j1);
}


if(flag)...{
m[i1]
=i[i1];
n[i1]
=j[i1];
m[j1]
=i[j1];
n[j1]
=j[j1];
}

doubled1=m[j1]-m[i1];
doubled2=n[j1]-n[i1];
doubled3=Math.hypot(m[i1]-m[j1],n[i1]-n[j1]);
doubled4=d1/d3;
doubled5=d2/d3;
o[j1]
=k[j1]-k[j1]*d4*d4;
o[j1]
-=l[j1]*d4*d5;
o[j1]
+=k[i1]*d4*d4;
o[j1]
+=l[i1]*d4*d5;
p[j1]
=l[j1]-l[j1]*d5*d5;
p[j1]
-=k[j1]*d4*d5;
p[j1]
+=k[i1]*d4*d5;
p[j1]
+=l[i1]*d5*d5;
o[i1]
=k[i1]-k[i1]*d4*d4;
o[i1]
-=l[i1]*d4*d5;
o[i1]
+=k[j1]*d4*d4;
o[i1]
+=l[j1]*d4*d5;
p[i1]
=l[i1]-l[i1]*d5*d5;
p[i1]
-=k[i1]*d4*d5;
p[i1]
+=k[j1]*d4*d5;
p[i1]
+=l[j1]*d5*d5;
k[i1]
=o[i1];
l[i1]
=p[i1];
k[j1]
=o[j1];
l[j1]
=p[j1];
}

}


}


}


publicbooleanrandball(inti1,intj1)...{
//hypot随机决定两值之一
returnMath.hypot(m[i1]-m[j1],n[i1]-n[j1])<2D*r;
}


/***//**
*限制区域
*
*/

publicvoidlimit()...{
for(inti=0;i<countBall;i++)
if(q[i])...{
if(m[i]-r<e[0])...{
m[i]
=e[0]+r;
k[i]
*=-1D;
}
elseif(m[i]+r>e[2])...{
m[i]
=e[2]-r;
k[i]
*=-1D;
}

if(n[i]-r<f[0])...{
n[i]
=f[0]+r;
l[i]
*=-1D;
}
elseif(n[i]+r>f[1])...{
n[i]
=f[1]-r;
l[i]
*=-1D;
}

}


}


publicvoidmakeScreen(GraphicsscreenGraphics)...{

screenGraphics.drawImage(_table,
0,0,null);
if(q[0])...{
_graphics.setColor(Color.WHITE);
_graphics.fillOval((
int)(i[0]-r),(int)(j[0]-r),
(
int)(r*2D),(int)(r*2D));
}

screenGraphics.setColor(Color.RED);
for(inti1=1;i1<countBall;i1++)
if(q[i1])
screenGraphics.fillOval((
int)(i[i1]-r),(int)(j[i1]-r),
(
int)(r*2D),(int)(r*2D));

screenGraphics.setColor(Color.BLACK);
for(intj1=0;j1<countBall;j1++)
if(q[j1])...{
screenGraphics.drawOval((
int)(i[j1]-r),(int)(j[j1]-r),
(
int)(r*2D),(int)(r*2D));
}


if(a==1)...{
makeHelper(screenGraphics);
}

if(a==0)...{
intk1=getWidth()/2-85;
intl1=getHeight()/2;
screenGraphics.setColor(Color.BLACK);
screenGraphics.drawString(
"点击画面开始",k1+2,l1+2);
if((System.currentTimeMillis()/1000L&1L)==0L)...{
screenGraphics.setColor(Color.YELLOW);
}

else...{
screenGraphics.setColor(Color.CYAN);
}

screenGraphics.drawString(
"点击画面开始",k1,l1);
}

}


/***//**
*绘制球杆及辅助线
*
*
@paramscreenGraphics
*/

publicvoidmakeHelper(GraphicsscreenGraphics)...{
doubled1=Math.hypot(i[0]-(double)u,j[0]-(double)v);
doubled2=((double)u-i[0])/d1;
doubled3=((double)v-j[0])/d1;
doubled4=y?n()/10D:1.0D;
doubled5=i[0]+d2*(r+d4);
doubled6=i[0]+d2*(r+(double)z+d4);
doubled7=j[0]+d3*(r+d4);
doubled8=j[0]+d3*(r+(double)z+d4);
screenGraphics.setColor(Color.ORANGE);
screenGraphics.drawLine((
int)d5,(int)d7,(int)d6,(int)d8);
inti1=0;
intj1=y?(int)(150D*(d4/1000D)):15;
doubled9;
doubled10=(d9=30D)*d2;
doubled11=d9*d3;
doubled12=i[0]+(double)A*d2;
doubled13=j[0]+(double)A*d3;
A
--;
A
%=d9;
screenGraphics.setColor(Color.WHITE);
for(;i1<j1;i1++)...{
if(d12<e[0])...{
d12
=e[0]-d12;
d12
=e[0]+d12;
d10
*=-1D;
}
elseif(d12>e[2])...{
d12
-=e[2];
d12
=e[2]-d12;
d10
*=-1D;
}

if(d13<f[0])...{
d13
=f[0]-d13;
d13
=f[0]+d13;
d11
*=-1D;
}
elseif(d13>f[1])...{
d13
-=f[1];
d13
=f[1]-d13;
d11
*=-1D;
}

screenGraphics.fillOval((
int)d12-2,(int)d13-2,4,4);
d12
-=d10;
d13
-=d11;
}


}


publicdoublen()...{
if(y)...{
returnMath.min(1000D,10D*Math.hypot(i[0]-(double)w,j[0]
-(double)x));
}
else...{
returnMath.min(1000D,10D*Math.hypot(u-w,v-x));
}

}


publicvoidupdate(Graphicsg)...{
paint(g);
}


publicvoidpaint(Graphicsg)...{
makeScreen(_graphics);
g.drawImage(_screen,
0,0,null);
}


publicvoidmousePressed(MouseEventmouseevent)...{
y
=true;
}


publicvoidmouseReleased(MouseEventmouseevent)...{
if(a==1)...{
doubled1=Math.hypot(i[0]-(double)u,j[0]-(double)v);
doubled2=(i[0]-(double)u)/d1;
doubled3=(j[0]-(double)v)/d1;
doubled4;
if((d4=n())>0.0D)...{
a
=2;
k[
0]=d4*d2;
l[
0]=d4*d3;
}

}

y
=false;
}


publicvoidmouseClicked(MouseEventmouseevent)...{
if(a==0)
a
=1;
}


publicvoidmouseEntered(MouseEventmouseevent)...{
}


publicvoidmouseExited(MouseEventmouseevent)...{
}


publicvoidmouseMoved(MouseEventmouseevent)...{
w
=mouseevent.getX();
x
=mouseevent.getY();
u
=w;
v
=x;
}


publicvoidmouseDragged(MouseEventmouseevent)...{
w
=mouseevent.getX();
x
=mouseevent.getY();
}


publicstaticvoidmain(Stringargs[])...{
newJavaBilliards();
}


}

运行结果如下:



PS:本来今天想写个关于javamail方面的,后来觉得要写的东西太多临时改主意了……
分享到:
评论

相关推荐

    Java写的桌球程序

    Java编写的桌球程序是一个基于计算机图形学的模拟游戏,主要展示了如何在Java环境中实现一个交互式的2D游戏。这个程序可能包含了一些基础的编程概念和技术,如对象导向设计、事件处理、图形绘制以及简单的物理模拟。...

    java桌球游戏代码

    Java桌球游戏是一种基于Java编程语言开发的模拟真实桌球运动的计算机游戏。在这个游戏中,玩家可以使用虚拟的球杆击打球,目标是将球打入指定的球洞,与真实的桌球规则相似。通过Java技术,开发者能够创建出具有交互...

    JAVA桌球小游戏代码

    【JAVA桌球小游戏代码】项目是一个基于JAVA编程语言的实战应用,旨在帮助开发者提升对JAVA基础知识的理解,同时体验游戏开发的乐趣。在这个项目中,你将学习到如何利用JAVA的图形用户界面(GUI)来创建一个交互式的...

    JAVA台球游戏源码

    【JAVA台球游戏源码】是一款使用Java编程语言开发的台球游戏项目,它展示了如何在计算机上模拟台球运动的物理规则和交互操作。这个项目对于学习Java编程、游戏开发以及理解图形用户界面(GUI)设计有很好的参考价值...

    Java实现的桌球游戏源码

    Java实现的桌球游戏源码是一个典型的编程项目,它展示了如何使用Java语言来构建一个简单的交互式游戏。这个游戏可能是基于二维图形界面,让玩家通过键盘控制一个或两个“球拍”来击打桌面上的“球”,模拟真实的桌球...

    java桌球游戏

    【Java桌球游戏】是一种基于Java编程语言开发的模拟真实桌球运动的计算机游戏。它利用Java的强大功能和丰富的图形库来实现桌面游戏的交互体验。在这个游戏中,玩家可以通过键盘控制球杆,模拟击打球的动作,使球在...

    java台球游戏源代码

    Java台球游戏是一款经典的计算机程序设计项目,它利用了Java编程语言的强大功能,展示了2D图形用户界面(GUI)的设计以及物体动态模拟的实现。这款国外作品提供了丰富的学习资源,让开发者可以深入理解游戏逻辑、...

    简单的java台球游戏源码

    在本项目中,"简单的java台球游戏源码" 提供了一个基础的台球游戏实现,它可以帮助我们理解如何在Java编程语言中创建交互式的图形用户界面(GUI)和模拟物理运动。让我们深入探讨这个项目中的关键知识点。 1. **...

    java写的android桌球游戏

    《基于Java的Android桌球游戏开发详解》 在Android应用开发的世界中,Java是一门广泛使用的编程语言。本文将深入探讨一个使用Java编写的Android桌球游戏,它是在Eclipse集成开发环境中创建的,适用于JDK 2.2平台。...

    java 台球开发教程

    - **Java2D**:虽然Java2D主要用于2D图形,但在3D游戏开发中,可以用来绘制3D模型的2D投影,处理用户输入和游戏逻辑。 - **JavaFX**:提供更强大的3D功能,可以直接在Java环境中创建复杂的3D场景,支持3D对象的...

    桌球小游戏入门 java.zip

    在Java开发中,桌球小游戏可以涵盖许多核心概念和技术,包括对象导向编程(OOP)、图形用户界面(GUI)设计、事件处理、物理模拟以及游戏逻辑。以下是一些可能涉及的关键知识点: 1. **对象导向编程(OOP)**:Java...

    Java 游戏开发 桌球游戏源代码

    在本文中,我们将深入探讨如何使用Java Swing进行游戏开发,以桌球游戏为例。Java Swing是Java的一个图形用户界面(GUI)工具包,它提供了丰富的组件和功能,使得开发者能够创建出美观且交互性强的桌面应用程序,...

    用Java语言编写一个桌球小游戏.zip

    总的来说,这个Java桌球小游戏项目涵盖了Java语言的基础知识,包括GUI编程、事件处理、面向对象设计、数学和物理的应用、线程同步以及文件操作等。通过分析和理解这个项目,开发者可以进一步提升自己的Java编程技能...

    简单的台球桌面

    这个程序模拟了台球游戏的基本规则和交互,对于初学者来说,它是一个很好的实践平台,可以帮助理解面向对象编程、图形用户界面(GUI)设计以及事件处理等核心Java概念。 1. **Java语言基础**: - **类与对象**:...

    android一个2D桌球小游戏,非常适合游戏开发新手

    4. **Java**:Java是Android平台的主要编程语言,其面向对象的特性及跨平台能力使其成为开发Android应用的首选语言。 【文件名】:Billiard_2D可能代表了这个项目的主程序文件或者源代码包,包含了游戏的所有逻辑和...

    小小桌球界面

    总的来说,“小小桌球界面”是一个适合初学者上手的项目,能够帮助他们建立起对Java GUI编程的基础认知,同时也能锻炼到基本的图形绘制和用户交互处理能力。尽管对于资深开发者来说可能过于基础,但对于新手来说,...

    单机台球游戏代码

    综上所述,这个单机台球游戏的代码设计涉及到了游戏逻辑、用户交互、图形绘制、物理模拟等多个方面,是学习C语言编程和游戏开发的好例子。通过这个项目,开发者可以深入理解面向对象的设计思想,掌握如何利用C语言...

    android游戏开发源码 体育游戏-----2D迷你桌球

    这是一款2D桌球游戏,旨在模拟真实的台球体验。我们将讨论该项目的关键组成部分,包括游戏逻辑、图形渲染、用户交互和性能优化。 首先,让我们关注游戏逻辑。在这个2D桌球游戏中,核心的算法将涉及物理模拟,如球的...

    android学习台球源码

    这包括绘制逼真的台球桌、球体以及控制杆。Android的`Canvas`类和`Paint`对象可用于绘制2D图形,而`SurfaceView`或`GLSurfaceView`则用于实现游戏画面的高效渲染。 2. **物理引擎(Physics Engine)**:为了让台球...

Global site tag (gtag.js) - Google Analytics