📄 java游戏编程初步.htm
字号:
<P> 当我们应用程序的逻辑要对系统界面进行更新时,调用 repaint() 方法来通知AWT线程进行刷新操作。repaint()
方法实际会让 AWT线程去调用另外一个方法,update。update方法在默认情况下会做两件事,一是清除当前区域内容,二是调用其
paint()方法完成实际绘制工作。paint、repaint、update 三个方法关系如图所示: <BR><BR><IMG
hspace=3 src="Java游戏编程初步.files/49722.gif" align=center vspace=1
border=1
onerror="this.src='http://www.yesky.com/image20010518/49722.gif';"><BR><BR></P>
<P></P>
<P></P>
<P> 但是如何让我们的圆运动呢?这里我们利用函数Graphics
类的fillOval函数来设置了圆的起始位置x,y。现在我们只要在线程run方法中每单位时间增大y的值,线程将在每一个单位时间内重画圆的位置。每单位时间y值越大,下降的速度就会越快。在屏幕上我们就将看到这个圆球做自由降落运动。
如下代码所示:</P>
<P>
<TABLE cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<P>while (true) </P>
<P>{ </P>
<P>// 设置动画移动速度 </P>
<P>y +=1;<BR>}</P>
<P>public void paint (Graphics g)<BR>{</P>
<P>//设置球的颜色<BR>g.setColor (Color.blue);</P>
<P>// 从x,y位置处画一个实心的圆<BR>g.fillOval (x , y, 2 * r, 2 * r);</P>
<P>}</P></TD></TR></TBODY></TABLE></P>
<P> 在这之前我们需要在开始处设置一些变量,定义好x,y的默认位置值。r 在此处是我们画的圆的半径大小。</P>
<P>
<TABLE cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>int x = 100;<BR>int y = 20;<BR>int r = 10;
</TD></TR></TBODY></TABLE></P>
<P> 我们的自由降落的动画就完了。是不是很简单,如果还有地方不明白,大家可在此处下载完整的代码及应用程序。看看真实的演示效果和代码。下面每一部分我们也将在最后附上相应的源代码及应用程序下载。如果大家有兴趣,可改变y的值,及x的值,你会得到不同的下降效果。</P>
<P><FONT size=3><STRONG>双缓冲,消除闪烁</STRONG> </FONT></P>
<P></P>
<P> 大家可能注意到了上面例子中的我们下降的圆看起来不是很清晰,带着很严重的闪烁。这种现象在写游戏程序中是普遍存在的现象。这是由于我们的repaint()函数导致的结果,由于它在调用paint()函数前会自动清除屏幕,所以在一个毫秒内我们会看到一个空白的屏幕,在快速的变换操作中就出现了闪烁现象。</P>
<P> 解决这种闪烁现象有几种方法,下面是两种方法的列举说明,其他的方式大家可以自己尝试。</P>
<P> 第一种:我们始终不清除屏幕显示,但是这个方法会带来个附作用,我们下降的圆不在是一个圆了,而是一条直线,因为它的下降过程中没有了断点,保留了所有的圆球的影象。我们只要在Ball.java内加上如下代码update(Graphics
g) {paint(g)},你就会看到一条很长的线拉出来。有兴趣的朋友可以试试。</P>
<P> 第二种:使用双缓冲机制(Double buffering)</P>
<P> 现在大部分的游戏都是采用双缓冲机制来解决屏幕的闪烁现象,我们就以此为例来进行说明,有关缓冲区及相关缓冲机制的概念,大家可参考附录的缓冲说明。</P>
<P> 而我们的程序中简单的说就是在显示我们想要的图画之前,把所有的图画先在后台绘制好并存放到相应的图像变量中去。当需要显示时直接复制到前台屏幕就可以了。</P>
<P> 具体实现:</P>
<P> 1.首先我们用createImage方法新建一后台图像类变量</P>
<P> 2.然后使用getGraphics()方法得到当前图像的图形关联</P>
<P> 3.在后台处理所有相关的处理,如清除屏幕,后台绘画等等</P>
<P> 当完成所有的后台工作后,复制已经绘制好的图像到前台,并覆盖前台的存在图像。这样我们的所有操作都是在后台前行,在屏幕显示新的图像前,这些内容都已经存在于后台了。所以你也将在任何时刻都看不到空屏幕的存在。也即代表闪烁消除了。</P>
<P> 下面我们来看看相关的代码说明: </P>
<P> 在开始之前我们得先在程序的开始部分声明两个实例变量用来存储后台图画。如下:</P>
<P>
<TABLE cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>private Image bgImage;<BR>private Graphics bg;
</TD></TR></TBODY></TABLE></P>
<P> 然后我们利用update()方法来实现双缓冲机制。</P>
<P> Update()方法要实现下面三个步骤:</P>
<P> 1.清除屏幕上的组件</P>
<P> 2.设置相关联组件的前景色</P>
<P> 3.调用paint方法重画屏幕</P>
<P>
<TABLE cellPadding=0 width="100%" bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<P>public void update (Graphics g)<BR>{</P>
<P>// 初始化buffer<BR>if (bgImage == null)<BR>{</P>
<P>bgImage = createImage (this.getSize().width,
this.getSize().height);<BR>bg = bgImage.getGraphics ();</P>
<P>}</P>
<P>// 后台清屏,即设置圆球组件和后台一样的颜色,大小<BR>bg.setColor (getBackground
());<BR>bg.fillRect (0, 0, this.getSize().width,
this.getSize().height);</P>
<P>// 绘制相应的元素组件<BR>bg.setColor (getForeground());<BR>paint
(bg);</P>
<P>// 在屏幕上重画已经绘制好的圆<BR>g.drawImage (bgImage, 0, 0, this);</P>
<P>}</P></TD></TR></TBODY></TABLE></P< p>
<P align=center><B><FONT color=red>[1]</FONT> <A
href="http://www.javaeasy.com/ArticleShow.asp?ArticleID=772&ArticlePage=2">[2]</A> <A
href="http://www.javaeasy.com/ArticleShow.asp?ArticleID=772&ArticlePage=3">[3]</A> <A
href="http://www.javaeasy.com/ArticleShow.asp?ArticleID=772&ArticlePage=2">下一页</A></B></P>
<P></P></TD>
<TD width=20> </TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center
bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD vAlign=top height=37>
<DIV align=center></DIV></TD></TR></TBODY></TABLE>
<TABLE class=border style="WORD-BREAK: break-all" cellSpacing=0
cellPadding=0 width="100%" align=center bgColor=#ffffff border=0>
<TBODY>
<TR class=tdbg>
<TD><IMG height=14 src="Java游戏编程初步.files/aer.gif" width=8
border=0>上一篇文章:<A
title="文章标题:Java学习 :第二十讲 动画制作及声音载入(三) 作 者:佚名 更新时间:2004-5-31 9:32:57 点击次数:163"
href="http://www.javaeasy.com/ArticleShow.asp?ArticleID=748">Java学习 :第二十讲 动画制作及声音载入(三)</A><BR><IMG
height=14 src="Java游戏编程初步.files/aer.gif" width=8 border=0>下一篇文章:没有了
</TD></TR></TBODY></TABLE>
<DIV align=right>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center
bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD>
<DIV align=right><A
href="http://www.javaeasy.com/Comment.asp?ArticleID=772"
target=_blank><IMG src="Java游戏编程初步.files/pl.jpeg" border=0></A><A
href="http://www.javaeasy.com/printpage.asp?ArticleID=772"><IMG
src="Java游戏编程初步.files/print.jpeg"
border=0></A></DIV></TD></TR></TBODY></TABLE></DIV>
<TABLE cellSpacing=0 cellPadding=0 width="100%" align=center
bgColor=#ffffff border=0>
<TBODY>
<TR>
<TD vAlign=top width="33%">
<TABLE class=border style="WORD-BREAK: break-all" cellSpacing=0
cellPadding=0 width="100%" border=0>
<TBODY>
<TR class=title>
<TD vAlign=top background=Java游戏编程初步.files/homedhbg.gif><IMG
height=34 src="Java游戏编程初步.files/xgwz.gif" width=173
border=0></TD></TR>
<TR class=tdbg>
<TD vAlign=top height=100>
<LI><A
title="文章标题:JAVA中通用JPEG缩影图Bean的制作与示例 作 者:AbnerChai 更新时间:2004-7-9 9:16:11 点击次数:538"
href="http://www.javaeasy.com/ArticleShow.asp?ArticleID=779">JAVA中通用JPEG缩影图Bean的制…</A>[<FONT
color=red>538</FONT>]<BR>
<LI><A
title="文章标题:JFreeChart -- 柱状图 作 者:王恩建 更新时间:2004-6-19 21:55:03 点击次数:1102"
href="http://www.javaeasy.com/ArticleShow.asp?ArticleID=778">JFreeChart -- 柱状图</A>[<FONT
color=red>1102</FONT>]<BR>
<LI><A
title="文章标题:JFreeChart-饼状图-中级 作 者:王恩建 更新时间:2004-6-19 21:53:09 点击次数:837"
href="http://www.javaeasy.com/ArticleShow.asp?ArticleID=777">JFreeChart-饼状图-中级</A>[<FONT
color=red>837</FONT>]<BR>
<LI><A
title="文章标题:JFreeChart-饼状图-初级 作 者:王恩建 更新时间:2004-6-19 21:50:58 点击次数:736"
href="http://www.javaeasy.com/ArticleShow.asp?ArticleID=776">JFreeChart-饼状图-初级</A>[<FONT
color=red>736</FONT>]<BR>
<LI><A
title="文章标题:文本编辑器源文件 作 者:大砍刀 更新时间:2004-6-19 21:37:07 点击次数:1055"
href="http://www.javaeasy.com/ArticleShow.asp?ArticleID=775">文本编辑器源文件</A>[<FONT
color=red>1055</FONT>]<BR></LI></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE class=border style="WORD-BREAK: break-all" cellSpacing=0
cellPadding=0 width="100%" align=center bgColor=#ffffff border=0>
<TBODY>
<TR class=title>
<TD vAlign=top width="5%" background=Java游戏编程初步.files/homedhbg.gif
height=34><IMG height=34 src="Java游戏编程初步.files/wzpl.gif"
width=126></TD>
<TD vAlign=center width="95%"
background=Java游戏编程初步.files/homedhbg.gif>
<TABLE cellSpacing=0 cellPadding=0 width="75%" border=0>
<TBODY>
<TR>
<TD>
<P></P>
<P>(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)</P></TD></TR></TBODY></TABLE></TD></TR>
<TR class=tdbg>
<TD colSpan=2> 没有任何评论
</TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE>
<TABLE cellSpacing=0 cellPadding=0 width="99%" align=center bgColor=#ffffff
border=0>
<TBODY>
<TR>
<TD>
<TABLE class=border cellSpacing=0 cellPadding=0 width=760 align=center
border=0>
<TBODY>
<TR class=title align=middle height=20>
<TD>┋ <A
onclick="this.style.behavior='url(#default#homepage)';this.setHomePage('http://www.javaeasy.com/');"
href="http://www.javaeasy.com/ArticleShow.asp?ArticleID=772#">设为首页</A> ┋ <A
href="javascript:window.external.addFavorite('http://www.javaeasy.com/','javaeasy')">加入收藏</A> ┋ <A
href="mailto:chen134888@sohu.com">联系站长</A> ┋ <A
href="http://www.javaeasy.com/FriendSite.asp"
target=_blank>友情链接</A> ┋ <A
href="http://www.javaeasy.com/admin/login.asp"
target=_blank>关于本站</A> ┋ <BR>版权所有 Copyright © 2004 <A
href="http://www.javaeasy.com/SiteUrl" target=_blank>JavaEasy.com ,
All Rights Reserved </A></TD></TR>
<TR class=tdbg vAlign=bottom align=middle height=20>
<TD></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -