由于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环境中实现一个交互式的2D游戏。这个程序可能包含了一些基础的编程概念和技术,如对象导向设计、事件处理、图形绘制以及简单的物理模拟。...
Java桌球游戏是一种基于Java编程语言开发的模拟真实桌球运动的计算机游戏。在这个游戏中,玩家可以使用虚拟的球杆击打球,目标是将球打入指定的球洞,与真实的桌球规则相似。通过Java技术,开发者能够创建出具有交互...
【JAVA桌球小游戏代码】项目是一个基于JAVA编程语言的实战应用,旨在帮助开发者提升对JAVA基础知识的理解,同时体验游戏开发的乐趣。在这个项目中,你将学习到如何利用JAVA的图形用户界面(GUI)来创建一个交互式的...
【JAVA台球游戏源码】是一款使用Java编程语言开发的台球游戏项目,它展示了如何在计算机上模拟台球运动的物理规则和交互操作。这个项目对于学习Java编程、游戏开发以及理解图形用户界面(GUI)设计有很好的参考价值...
Java实现的桌球游戏源码是一个典型的编程项目,它展示了如何使用Java语言来构建一个简单的交互式游戏。这个游戏可能是基于二维图形界面,让玩家通过键盘控制一个或两个“球拍”来击打桌面上的“球”,模拟真实的桌球...
【Java桌球游戏】是一种基于Java编程语言开发的模拟真实桌球运动的计算机游戏。它利用Java的强大功能和丰富的图形库来实现桌面游戏的交互体验。在这个游戏中,玩家可以通过键盘控制球杆,模拟击打球的动作,使球在...
Java台球游戏是一款经典的计算机程序设计项目,它利用了Java编程语言的强大功能,展示了2D图形用户界面(GUI)的设计以及物体动态模拟的实现。这款国外作品提供了丰富的学习资源,让开发者可以深入理解游戏逻辑、...
在本项目中,"简单的java台球游戏源码" 提供了一个基础的台球游戏实现,它可以帮助我们理解如何在Java编程语言中创建交互式的图形用户界面(GUI)和模拟物理运动。让我们深入探讨这个项目中的关键知识点。 1. **...
《基于Java的Android桌球游戏开发详解》 在Android应用开发的世界中,Java是一门广泛使用的编程语言。本文将深入探讨一个使用Java编写的Android桌球游戏,它是在Eclipse集成开发环境中创建的,适用于JDK 2.2平台。...
- **Java2D**:虽然Java2D主要用于2D图形,但在3D游戏开发中,可以用来绘制3D模型的2D投影,处理用户输入和游戏逻辑。 - **JavaFX**:提供更强大的3D功能,可以直接在Java环境中创建复杂的3D场景,支持3D对象的...
在Java开发中,桌球小游戏可以涵盖许多核心概念和技术,包括对象导向编程(OOP)、图形用户界面(GUI)设计、事件处理、物理模拟以及游戏逻辑。以下是一些可能涉及的关键知识点: 1. **对象导向编程(OOP)**:Java...
在本文中,我们将深入探讨如何使用Java Swing进行游戏开发,以桌球游戏为例。Java Swing是Java的一个图形用户界面(GUI)工具包,它提供了丰富的组件和功能,使得开发者能够创建出美观且交互性强的桌面应用程序,...
总的来说,这个Java桌球小游戏项目涵盖了Java语言的基础知识,包括GUI编程、事件处理、面向对象设计、数学和物理的应用、线程同步以及文件操作等。通过分析和理解这个项目,开发者可以进一步提升自己的Java编程技能...
这个程序模拟了台球游戏的基本规则和交互,对于初学者来说,它是一个很好的实践平台,可以帮助理解面向对象编程、图形用户界面(GUI)设计以及事件处理等核心Java概念。 1. **Java语言基础**: - **类与对象**:...
4. **Java**:Java是Android平台的主要编程语言,其面向对象的特性及跨平台能力使其成为开发Android应用的首选语言。 【文件名】:Billiard_2D可能代表了这个项目的主程序文件或者源代码包,包含了游戏的所有逻辑和...
总的来说,“小小桌球界面”是一个适合初学者上手的项目,能够帮助他们建立起对Java GUI编程的基础认知,同时也能锻炼到基本的图形绘制和用户交互处理能力。尽管对于资深开发者来说可能过于基础,但对于新手来说,...
综上所述,这个单机台球游戏的代码设计涉及到了游戏逻辑、用户交互、图形绘制、物理模拟等多个方面,是学习C语言编程和游戏开发的好例子。通过这个项目,开发者可以深入理解面向对象的设计思想,掌握如何利用C语言...
这是一款2D桌球游戏,旨在模拟真实的台球体验。我们将讨论该项目的关键组成部分,包括游戏逻辑、图形渲染、用户交互和性能优化。 首先,让我们关注游戏逻辑。在这个2D桌球游戏中,核心的算法将涉及物理模拟,如球的...
这包括绘制逼真的台球桌、球体以及控制杆。Android的`Canvas`类和`Paint`对象可用于绘制2D图形,而`SurfaceView`或`GLSurfaceView`则用于实现游戏画面的高效渲染。 2. **物理引擎(Physics Engine)**:为了让台球...