⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 java游戏编程初步--英雄会之强强联手.htm

📁 编写游戏的初步知识
💻 HTM
📖 第 1 页 / 共 3 页
字号:
      <P>{<BR>backImgage[i] = getImage (getCodeBase (), "t1"+i+".gif");</P>
      <P>}<BR></P></TD></TR></TBODY></TABLE></P>
<P>  大家可参考JDK包中的Animation例子,它就是一个很好的播放一组图片文件的例子。</P>
<P><STRONG>事件处理</STRONG> </P>
<P></P>
<P>  <B>鼠标监听技术</B></P>
<P>  玩游戏时,不管是小型的扑克牌和大型的RPG游戏,都要参与者溶入到游戏的角色当中。不错,交互,游戏有了交互的功能才可以说是一个完整的游戏。即使是编程游戏如机器人足球,Robocode都要程序员参与编写代码,观察比赛。有两种主流方法可实现游戏的交互:鼠标和键盘。当然还包括手操杆等,但现在大部分Pc机上使用的还是鼠标和键盘。我们就以这两项为基础来说明游戏中事件的响应过程。</P>
<P>  要判断相应的鼠标所进行的动作:是点击,还是移动。我们必须对我们鼠标进行监听。要监听鼠标事件就必须调用这些接口之一,或扩展一个鼠标适配器(mouse 
adapters) 类. AWT 提供了两种监听接口(listener interface): java.awt.event.MouseListener 和 
java.awt.event.MouseMotionListener.</P>
<P>  现在我设计一个鼠标事件,当点击applet屏幕时,下降的球向反方向运动。以实现了对游戏的简单控制。</P>
<P>  MouseListener一共有5个方法,主要用来实现鼠标的点击事件。这里要注意一点:由于MouseListener是接口我们要在实现的类中重载它的所有方法. 
</P>
<P>  <B>Mouse点击事件</B></P>
<P>   · mousePressed() 当用户按下鼠标按钮时发生.</P>
<P>   · mouseReleased() 当用户松开鼠标按钮时发生.</P>
<P>   · mouseClicked() 当用户按下并松开鼠标按钮时发生. 用户在选择或双击图标的时候通常会点击鼠标按钮. 
用户如果在松开鼠标之前移动鼠标,点击不会导致鼠标相应事件出现.</P>
<P>   · 因为点击鼠标是按下鼠标和松开鼠标的结合, 在事件分配给 mouseClicked() 方法之前, mousePressed() 和 
mouseReleased() 方法已同时被调用.</P>
<P>  鼠标状态处理:</P>
<P>   mouseEntered() 当鼠标离开当前组件并进入你所监听的组件时激活事件.</P>
<P>   mouseExited() 当鼠标离开你所监听的组件时发生.</P>
<P>  <B>Mouse 移动事件</B></P>
<P>  鼠标移动主要通过接口MouseMotionListener来实现:</P>
<P>   mouseDragged() 当用户按下鼠标按钮并在松开之前进行移动时发生.在mouseDragged() 
后松开鼠标不会导致mouseClicked().</P>
<P>   mouseMoved() 当鼠标在组件上移动而 不时拖动时发生.</P>
<P>  依据我们的游戏设计,我们在这要使用到MouseListener接口。实现接口后。我们要在init()函数加入监听器addMouseLisener(),来监听对applet的响应事件。</P>
<P>  知道了鼠标事件的处理,我们再来回顾一下上面提到的球反弹设计,现在我们要如何处理了球的控制呢?让我们想一想,不错,可能你已经发现了,我们照样可通过改变speed方向来实现回弹控制操作。在mousePressed(){}事件中加入下面的代码,我们的回弹控制就设计完成。</P>
<P>speed = -4<BR></P>
<P>  记得在释放applet资源时,我们要释放mouseListener资源。在destory()中加入</P>
<P>removeMouseListener(this);</P>
<P>  可能有些朋友会使用mouseDown()方法,mouseDown()在此我建议大家不要再使用这个方法了,它已经是被淘汰的产品。是为了兼容JDK1.0而带到JDK1.4中来的。</P>
<P><STRONG>键盘监听技术</STRONG> </P>
<P></P>
<P></P>
<P>  知道了鼠标的操作处理,键盘的操作处理就很简单了。我们只要实现keyListener接口,并在相应的事件中加入我们要实现的代码。</P>
<P>   KeyPressed: 当按键时发生</P>
<P>   KeyReleased:当翻译键时发生</P>
<P>   KeyTyped:当打击键时发生</P>
<P></P>
<P>  由于在后面我们设计的游戏中我们不会使用到键盘操作,键盘事件处理我们就交给大家自己去实现。</P>
<P></P>
<P>  现在我们来回顾一下我们能做什么了?移动一个物体,加载声音和图片,用鼠标对游戏进行一定的控制。哦,我的天,我们已经可以做自己的很简单的游戏了。是的,你可以了,我认为在此,大家可以放下教程,把自己小时候一直想玩的游戏,把自己学程序时一直想做的游戏自己进行设计实现,这对你的帮助将是非常大的。对你的编程水平也是一个很大的提高。</P>
<P>  当然如果你仍然认为自己认识还不是很深,下面让我们来设计一个完整的游戏。这将是一个很有意思的过程。</P>
<P></P>
<P>  <B>第一个游戏-"保卫者"</B></P>
<P>  主线思路:</P>
<P>  真正做自己的游戏是总是很兴奋。在开始任何事情之前,我们都要有个好的设计,游戏更不例外。下面我们就以上面的例子为本。设计一个”保卫者”的游戏。游戏思路本身很简单,从屏幕的顶端不断的有炸弹落下来,而我们这些”保卫者” 
要在它们着地之前,用鼠标点击让它反弹回去,不让它落到地面上来,但是球在上升过程中我们也要注意不让它撞到顶上。如果撞到顶上或地画,你的生命点数都会减少。每点中一个炸弹你的分数就会增加。当你的生命点数为零。”Game 
Over”。</P>
<P>  设计结构:</P>
<P>  1.模块设计:</P>
<P>  游戏的结构很简单,由三个模块组成。</P>
<P>  Denfen类:Denfen类控制整个游戏主线程,初始化炸弹类,并绘制屏幕上的炸弹数量及处理炸弹的移动,并监听鼠标事件</P>
<P>  Bomb类:主要是判断炸弹的速度,方向,是否撞到地面和点击事件</P>
<P>  Denfense类:主要用来处理游戏者的记分和生命点数</P>
<P></P>
<P>  2.方法实现:</P>
<P>  Denfen:</P>
<P>  init(): 初始化所有对象,包括声音文件的加载,Bomb类的生成</P>
<P>  run(): 处理炸弹的下降运动</P>
<P>  paint(...):绘制炸弹及相关的数据记录显示</P>
<P>  update(...): 实现屏幕图像的双缓冲,消除闪烁</P>
<P>  mouseProcess (...): 利用mouseEvent事件监听来处理鼠标按下事件,并根据鼠标当时的x坐标和y坐标判断是否点中炸弹。</P>
<P>  addBomb():利用默认值来动态实现bomb的生成,这里我们利用了数组来记录的。默认值是3,大家可依据自己的爱好增加或减少记录。</P>
<P>  Denfenser:</P>
<P>  Score:积分</P>
<P>  Life:生命点</P>
<P>  AddScore():增加游戏者的积分</P>
<P>  Death():减少游戏者的生命点数</P>
<P>  getScore():获得当前的积分数</P>
<P>  getLife():获得当前的生命点数</P>
<P>  Bomb:</P>
<P>  Bomb(...): 构造函数,初始化炸弹的位置,声音,颜色等相关变量的值.</P>
<P>  down():处理bomb的下降</P>
<P>  isRebound ():反向回弹炸弹的方向,并根据积分来加快炸弹的下降速度</P>
<P>  userHit (int x, int y):游戏者是否点中炸弹。</P>
<P>  wasHitEarth(): 判断炸弹是否撞击到地面或顶面,如果是生命点将减少。</P>
<P>  DrawBomb(Graphics g): 绘制Bomb图象。</P>
<P>  3.工作原理:</P>
<P>  首先我们在init()方法中加载所有游戏必要的资源,包括声音,鼠标事件的监听、背景等相关设置。利用addBomb()方法增加bomb的数量、初始位置及初始化颜色。再利用start()启动线程。线程调用run()方法,处理炸弹下降运动down()。Repaint()会在每一个单位时间调用paint()方法不断的刷新屏幕,paint()调用Bomb.addBomb()绘制炸弹。当游戏者按下鼠标,mousePress()事件激活,判断是否点中了炸弹。如果点中addScore()自动加1分。如果没有点中炸弹,炸弹继续下降,当撞到屏幕wasHitEarth()方法激活,其内调用death()方法,减少Denfenser.life生命点,同时audio.play()处理声音的播放,用以提示游戏者。当你的生命点数小于0时”Game 
Over”。</P>
<P>  这个游戏并不是很完善。下面提到一些改进方法,大家可以动手试试。做出适合自己的游戏风格来。具体的源代码及实现过程请大家从这里下.</P>
<P>  4.游戏的改进:</P>
<P>  背景的替换,本例的背景用的是函数setBackground(),大家可用相应的图形来代替。</P>
<P>  炸弹数量的增加,为了减少复杂度,例子用到的炸弹数量是固定值3,我们可根据积分的多少,在游戏中动态的增加炸弹的数量。</P>
<P>  等级的设置,本游戏中没有等级的功能。如果大家在游戏中加入等级,依据不同的等级不断的变换游戏的模式,这将是很有意思的过程。</P>
<P>  模式改变。我们可以在游戏中实现自己的模式。如消灭炸弹。点一个炸弹,就让炸弹从屏幕上消灭。</P>
<P>  我们还可以增加一个游戏者,加大游戏的可玩性。增加键盘的处理功能。加大游戏的灵活性。</P>
<P>  还有很多很多的处理和玩法,这都等着你去发掘。相信java 游戏编程将会是一个很有意思的学习过程。</P>
<P><STRONG>附录:缓冲机制</STRONG> </P>
<P></P>
<P>  . 缓冲区 
缓冲区用来储存着色的像素(影像)在视频内存中的区域。缓冲区的大小由解析度和色深决定,例如800x600,16bit色的缓冲区就占用800x600x2(16bit=2bytes)的内存区域。</P>
<P>  (1) 前置Buffer是当前显示在萤幕上的缓冲区,后置Buffer是尚未显示在萤幕上的缓冲区。</P>
<P>  (2) Single Buffering使用一个前置缓冲区,在着色的同时影像立即显示在萤幕上。因此当萤幕更新影像时会出现闪烁的现象。Single 
Buffering在目前的程序中已很少使用。</P>
<P>  (3) Double 
Buffering则使用两个缓冲区,一个前置Buffer,一个后置Buffer。所谓前置和后置是相对而言的。前置缓存的像素在屏幕上显示的同时,显卡正在紧张地着色后置缓存中的像素。</P>
<P>  后置缓存的像素上色完毕后是以Vsync信号的形式等待。在前置缓存和后置缓存交换后,新一轮的着色工作又重新开始。这正如舞台话剧中前台和后台的演员一般。在前台演员表演时,后台的演员仍在进行最后的排练。前台的演员下场时正是后台演员登场的时间。唯一不同的是前置和后置缓存是循环轮番上阵,而演员表演完毕一般都不再出场。目前大多数游戏内定都使用Double 
Buffering。</P>
<P>  (4) Triple 
Buffering使用一个前置缓存和两个后置缓存。在着色完第一个后置缓冲区的数据后,立即开始处理第二个后置缓冲区。今天,不少新游戏都采用的是Triple 
Buffering,Trible Buffering正逐渐成为发展的趋势,因为它没有Vsync(萤幕的垂直刷新频率)等待的时间,游戏也将更加流畅。Triple 
Buffering也是3Dmark2000测试的内定值设定。</P>
<P></P>
<P class=diaryFoot>- 作者: <A 
title="姓名:空&#10;性别:其他&#10;出生年月:--&#10;所在地区:&#10;从事行业:空&#10;联系电话:空&#10;OICQ:空&#10;婚姻状况:保密&#10;" 
onclick="window.open('/jsp/control/userInfo/messageMgr/postMessage.jsp?receiverName=强强联手&amp;receiver=60836','发送短消息','width=310,height=265')" 
href="javascript:void(0);">强强联手</A> 2004年08月3日,星期二 11:18:14 </P></DIV>
<DIV class=operation><A name=trackback>
<H3>Trackback</H3></A>
<P class=trackback>你可以使用这个链接引用该篇日志 
http://www.blogdriver.com/service/tb.do?diaryID=267616 </P></DIV>
<DIV class=operation><A name=comment>
<H3>回复</H3></A></DIV>
<DIV class=operation>
<TABLE class=comment cellSpacing=0 cellPadding=0 width=700 border=0>
  <FORM id=replyForm method=post><INPUT type=hidden value=44157 name=bloggerID> 
  <INPUT type=hidden value=267616 name=diaryID> <INPUT type=hidden 
  value=heromeeting name=blogDomino> 
  <TBODY>
  <TR>
    <TD width=70>发布人:</TD>
    <TD width=150><INPUT class=inputStyle id=remarker maxLength=20 
      name=remarker> </TD>
    <TD width=70>邮箱:</TD>
    <TD width=435><INPUT class=inputStyle id=mail maxLength=40 
name=mail></TD></TR>
  <TR>
    <TD>主 页:</TD>
    <TD colSpan=3><INPUT class=inputStyle id=blog maxLength=40 size=63 
      name=blog></TD></TR>
  <TR align=left>
    <TD colSpan=4><TEXTAREA class=textStyle id=remark name=remark rows=8 cols=60></TEXTAREA> 
    </TD></TR>
  <TR align=left>
    <TD colSpan=4>              <INPUT onclick=reply() type=button value=提交 name=Submit>   <INPUT type=reset value=重置 name=Submit2> 
</TD></TR></FORM></TBODY></TABLE></DIV></DIV>
<SCRIPT src="" type=text/javascript></SCRIPT>

<DIV id=footer><A href="http://www.blogdriver.com/jsp/reg/register.jsp"><IMG 
class=logo src="Java游戏编程初步--英雄会之强强联手.files/logo3.gif" border=0></A><A 
href="http://www.blogdriver.com/">2003-2004 BLOGDRIVER.COM All rights 
reserved</A></DIV></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -