java编程软件游戏画面用什么软件做

汇聚2000万达人的兴趣社区下载即送20张免费照片冲印
扫码下载App
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(351)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'功能强大的PC电脑端JAVA手机游戏模拟器KEmulator使用教程',
blogAbstract:'KEmulator是目前最为强大的PC电脑端手机J2ME(java)游戏或软件的模拟器,&你可以在电脑上直接运行众多的JAVA游戏了。而且可以运行任意分辨率的JAVA软件和游戏!&游戏好不好玩,不用急着安装到手机上,可以先用电脑运行试试看。&对于某些害怕扣费的游戏,也可以放心的先用电脑打开测试一下。&截图什么的也都很方便。&KEmulator对各版本的JAVA游戏的兼容也做的很好,对于3D画面类型的游戏支持也非常好。&而且画面分辨率、键盘按键定义等等全部都可以自行设置。且支持联网!玩手机网游也不在话下。很多地方都要比以前的SJBOY这款模拟器要更强许多。&软件下载:&KEmulator&',
blogTag:'',
blogUrl:'blog/static/6',
isPublished:1,
istop:false,
modifyTime:0,
publishTime:6,
permalink:'blog/static/6',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}当前位置: >
基于Java游戏设计打飞机程序
来源:论文资源网 作者:admin 添加日期:日 点击数:
论文资源网编辑。
本程序需要解决的主要技术问题
1.& 游戏程序是一项精度要求很高的程序系统,因为其代码利用率很高。一个实时运行的最终作品,每秒都会运行成千上万行程序,绘图事件、键盘事件都会以极高的频率在后台等待响应,若有丝毫的差别都将很容易导致程序在运行不久后可能出现严重错误,甚至死循环。因此,其逻辑设计应当相当严谨,需将所有可能发生的事件及意外情况考虑在设计中。
2.& 游戏中为了美观,适用性强,可能需要采用外部文件引入的图片贴图,有关贴图,在MIDP2.0中提供了用于增强游戏功能的game包,使得解决静态或动态、画面背景、屏幕刷新的双缓冲等都有较好的解决方案。
3. 玩家飞机的运行可以通过键盘响应事件控制,但敌方则因为是自动运行,就需要有一定的智能性;敌人飞机的运行算法也要进行相关的设置,已免游戏过于简单。
4.对于双方发射的子弹应该赋予不同的速度,同时,程序应该设定敌人飞机的子弹不与敌人的飞机进行碰撞检测,已增加游戏的可玩性。
5. 双方的飞机在前进时也需要考虑到是否碰撞到对方飞机,以免重叠运行,造成许多物理上不可能的情况,缺乏真实感。每一次刷新页面、每前进一步都需要进行相关的碰撞检测。
6.为了增加界面的美观,在程序中添加了白云。由于手机屏幕大小有限,所以白云的数量和出现的位置要经过相关的设置,才能实现白云不规则出现的效果。
7.& 游戏的地图不可能通过绘图来解决。否则,不仅难于控制和处理过多的元素,也会因过多的大型图片而不能限制程序的大小,失去手机上程序的原则和Java的优势。
8.& Java是基于虚拟机的半解释型编译系统,其执行效率较C++等完全编译后的程序会低很多,程序如果不进行精简和优化,将可能导致运行的不流畅。除开发过程中对结构上的控制、变量的使用、算法的优化等优化外,还可以使用混淆器(Obfuscator)进行程序打包后的优化。
9.& 游戏的结束、开始、动态信息画面作为构成一个程序都是必不可少的重要部分。良好的用户界面更是吸引用户的硬指标,相关的美术构图和人性化设置也需要有一定的考虑。
以上相关技术细节和整体流程将分别在以下小节阐述。
3.2& 程序流程
MIDlet suite是MIDP应用程序的最小单位,JAM负责将手机内的MIDlet suite以图形化的方式呈现,让用户能够选取欲执行的MIDlet suite,一旦选取了某个MIDlet suite,操作系统就会激活KVM执行里面的MIDlet。MIDlet及相关的支持类组成了MIDP应用程序的实际内容。而
每个MIDlet都必须继承javax.microedition.midlet.MIDlet这个抽象类。在MIDP规范中定义了MIDlet的生命周期,以及可以存在的三种状态,包括Paused、Active以及Destroyed,每一个MIDlet在任何时刻只可能处于其中的一个状态。这三种状态的转换关系如图3-1所示:MIDlet有三个状态,分别是pause、active和destroyed。在启动一个MIDlet的时
候,应用管理软件会首先创建一个MIDlet实例并使得他处于pause状态,当startApp()方法被调用的时候MIDlet进入active状态,也就是所说的运行状态。在active状态调用destroyApp(boolean unconditional)或者pauseApp()方法可以使得MIDlet进入destroyed或者pause状态。值得一提的是destroyApp(boolean unconditional)方法,事实上,当destroyApp()方法被调用的时候,AMS通知MIDlet进入destroyed状态。在destroyed状态的MIDlet必须释放了所有的资源,并且保存了数据。如果unconditional为false的时候,MIDlet可以在接到通知后抛出MIDletStateChangeException而保持在当前状态,如果设置为true的话,则必须立即进入destroyed状态。
本程序采用面向对象的设计模式,对游戏中的所有物体赋予对象的概念和属性。运行程序后允许用户选择执行选项菜单,在开始游戏后将先从外部文件载入地图文件,对背景的所有物体进行绘图。在主程序运行的线程中,画面刷新将以一定的频率采用双缓冲技术对屏幕重绘,实时反映整个游戏的进行状态。
游戏开始后先绘制地图,并将各个对象实例化。在主程序运行的线程中,游戏中所有的对象都应该运行在同一个线程下。当敌人或者用户的子弹达到射程范围后,并不删除子弹对象,而是使用setVisable(false)使其不能显示,当用户或敌人在次发射子弹时,只需使用setVisable(true)设置成可以显示即可。在屏幕重绘的主程序中,将在每次的循环中判断若干事件,以便程序进入相关的分支执行相关的反应代码。如:玩家剩余飞机数是为0、敌人、玩家飞机是否被击中、屏幕上相关信息的绘制等。
程序为需要完成独立功能的模块设置了单独的类。lzhhdm类继承自Midlet,gameScrenn类、MenuScreen类继承自GameCanvas,mybullets继承自Sprite类。载入程序后首先启动的是程序介绍的信息画面。点击ok后调用MenuScreen类实现菜单。
如果选择进入游戏,则调用gameScreen类,并且中止MenuScreen类中的线程运行,已提高运行速度。
Mybullets类为玩家子弹类。
3.3 Canvas类
为了能有程序开发人员控制接口的外观和行为,需要使用大量的初级用户接口类,尤其在游戏程序中,几乎完全依赖的就是Canvas抽象类进行绘图。从程序开发的观点看,Canvas类可与高级Screen类交互,程序可在需要时在Canvas中掺入高级类的组件。Canvas提供了键盘事件、指点杆事件(如果设备支持),并定义了允许将键盘按键映射为游戏控制键的函数。键盘事件由键代码指定,但这样控制游戏会导致缺乏通用性,并不是每个设备的键盘布局都适合游戏的操作。应当将键代码转换为游戏键的代码,以便硬件开发商能定义他们自己的游戏键布局。
3.4 Graphics类
Graphics类提供了简单的2D绘图功能。它具有24位深度色彩的绘制能力,以三原色分别各占一个字节表示其颜色。程序只能在paint()函数中使用Graphics绘制,GameCanvas可调用getGraphics()函数直接绘制在缓冲区上,可以在任何时间请求传输到前台。其对象会被传给Canvas的paint()函数,以便最终显示。
3.5 MIDP1.0技术下的绘制背景技术
在没有MIDP2.0前,进行游戏绘图一般需要手动编程使用双缓冲。需要在paint()方法内将所想要画的图形画在一张预先准备好的背景上,等所有绘图操作都完成后再将背景的数据拷贝到实际的屏幕上。Image类提供了一个建立背景的静态方法createImage(int width, int height),再利用getGraphics()方法取得属于这个背景的Graphics对象,所进行的绘图操作都会作用在背景上,等到全部的绘图操作完成后,再调用drawImage()方法将背景的数据复制到实际显示的屏幕上。
这样的技术在绘制动画时特别有用。绘制动画时经常需要不断地更新画面,而更新画面的操作就是先将屏幕以fillRect()的方式清除,再将下一张图片画在屏幕上,然而反复的清除及重绘会造成屏幕的闪烁现象(flicker),因此使用双重缓冲的好处就是在背景进行这个清除及重绘的操作,再将完成的绘图拷贝到屏幕上,由于用户看不到清除的操作,因此就不会出现闪烁的现象了。不过在某些MIDP的实现上已经加上了双重缓冲的支持,因此在处理前应先利用Canvas类的isDoubleBuffer()方法来判断。
3.6 MIDP2.0新增的GameCanvas包
&&& J2ME的流行促进几个运营商和制造商开发了一些支持游戏的类,但是,这却造成了游戏缺乏可移植性的问题,例如,很难将使用Siemens的Sprite类的游戏移植到Nokia上。
&&& 在MIDP2.0版本发布后,这些游戏移植性问题初步得到了解决。MIDP2.0新加入了
GameCanvas、Sprite、Layer、LayerManager、TiledLayer五个与游戏开发相关的类。其中 Layer类一般不会直接用到。
&&& Game类的出现不仅降低了错误出现的几率,也使游戏代码变的更小,因为开发者不需要自己编写象Sprite这种例子。下面将简要介绍Game类。
&&& GameCanvas类继承自Canvas,所以具有Canvas所具有的功能,还额外增加了一些便于游戏设计的功能。比如: GameCanvas类直接提供了getKeyStates(),使程序员可以在同一个线程自己侦测按键的状态。GameCanvas类提供了flushGraphics()的功能,实现了双缓冲技术。
&&& 所谓的Sprite,就是画面上独立移动的图形。
Sprite类是继承自Layer的用于存储多桢的基本可视元素。不同的frame可交相显示,构成动态的效果。图片可翻转、颠倒、由一个主角图片就可以方便的得到所有方向的显示状态,相比原先只能使用Canvas绘图,需要将所有方向的主角图象都绘制在png图象中简化了许多。Sprite也可以从整合的图象中读图,读图时将把大图分解为若干等宽等高的小图。每个小图按照其排列顺序有相应的序号,在程序中调用其序号,就可以绘制出相应的图片。本程序中的双方飞机、子弹、白云都由Sprite继承得到。
LayerManager提供控制整体画面层的控制。它包括了一系列自动获取了代号和位置的层,简化了各层加入游戏画面的过程,提供了自动排序和绘制的能力。
LayerManager存储了一个层的列表,新的层可以用函数附加、删除和插入。层的序号相当于坐标的Z轴,0层表示最接近用户视觉,层数越高,离用户越远。层号总是连续的,即使有中间的层被移除,其他层的序号会作相应的调整以保持整体的完整性。LM中的View Window控制着与LM相对坐标的可视区域。改变View Window的位置可以制造出滚动屏幕的效果。
TiledLayer是有一组图象格元素组成的整块虚拟图象。该类使不需要高分辨率的图象就能创建大幅图面成为可能。这项技术通常应用在2D游戏平台的滚动背景的绘图。一块整图可被分割成等大小的图象格,每块格有其对应的序号,按照行列递增。多块小格可由大块同时替换组合而模拟动态的背景,这不需要逐块替换所有的静态图象格而显得非常方便。
3.7 PNG图片格式
PNG(Portable Network Graphics)格式是MIDlet唯一支持的图象格式,PNG具体格式由PNG Specification,Version 1.0定义的。PNG格式提供透明背景的图象,这对绘制游戏画面和被操纵主角极有帮助。飞机之间或与白云碰撞时就不会因为背景有特定的颜色,显示出的效果像贴上的图片而缺乏真实感,物体之间轻微重叠时最上层图片也不会覆盖超过其有效象素外的部分。
PNG格式图片中包含许多定义其图片特性的冗余部分(Chunks)。这些代码包含在每一个单独的png格式图象中,然而如果将多个png图象合并在一张幅面稍大一些的整图中,多个chunks就可以得到精简,图片的大小可以得到控制。使用Image类中的createImage函数可从整图中分割出所需要的元素。在Game包中的TiledLayer和Sprite类都整合了这样的功能。本程序中的地图元素都集成在一张beijing.png图片中,实现了方便的管理和程序体积的精简。
3.8 玩家飞机的控制方式和敌人方的智能运行
&&& GameCanvas提供getKeyStates函数可获取当前键盘上的信息。将以位的形式返回键盘上所有键的按与释放的状态,当bit为1时,按键就是被按下的状态,为0时则为释放状态。只需要此一个函数的返回值就可以返回所有键的状态。这保证了快速的按键和释放也会被循环所捕捉。同时,这样的机制也可检测到几个键同时按下的状态,从而提供斜向运行等相应功能(本程序没有实现斜上运行功能)。
&&& 程序运行时应该对玩家飞机是否飞出屏幕的范围进行检测,如果飞出屏幕,就应该重新设定玩家飞机的位置。
&&& 玩家飞机被击中后,为了平衡游戏的可玩性,玩家飞机将有短暂时间无敌,即不进行碰撞检测,同时在屏幕右上角显示无敌时间。
&&& 根据游戏设定,敌人飞机。不能与玩家飞机重合,则他每走一步都需要检测一下是否与玩家飞机碰撞。Sprite类中提供了collidesWith函数,用于判断是否与某个Sprite、TiledLayer、Image的对象有图象上的重合(即游戏中的碰撞)。同理,还需要检测玩家子弹与敌机、敌机与玩家子弹是否碰撞。如果发生碰撞,将相关精灵图片替换为爆炸图片。
敌人飞机需要具有一定的智能性,以便对玩家攻击,使游戏具有一定的可玩性。敌人可以在适当时候转向或者开炮火,同时,程序应该检测敌机是否飞出了界外。
在普通敌机中,有一组敌机的其中一架具有跟踪功能,其原理为:当其进入屏幕后,根据玩家飞机的X、Y坐标不断调整自己的X、Y坐标,已达成跟踪的效果。由于线程的关系,敌机器的改变方向有时并不是实时的,这就可以使玩家有躲开撞击的可能,增强了游戏的可玩性。
在游戏进行中出现的大型飞机,由于其不可能立即被击落,所以应该设置其的运行方法,理论上讲还是根据玩家飞机的坐标,但是,在此设置一个标志位,使得敌人在取的玩家位置后即开始玩家方向运动,这期间,将不执行取得玩家飞机位置重设飞行方向的步骤。这样做,即防止了大飞机变成跟踪飞机,又使得大飞机的运行具有不确定性。
在关尾出现的BOSS,其在屏幕上方左右移动并发射子弹。实际上,此时BOSS应该通过玩家在游戏运行中的习惯性的运行方向,使用遗传算法,来动态判断玩家下一步的运行方向,并且指挥普通飞机出现在预测的位置上。可惜由于时间关系没有实现。
3.9 子弹的运行和控制
&&& 玩家的子弹是个精灵数组,有9个元素,表示玩家一次最多可以发射3组9发子弹,对于一个完整的游戏来讲,应该根据关卡的不同而给予玩家不同的飞机,飞机性能的差别在于子弹的射程不同。由于本游戏仅有一关,所以子弹速度设定的差别没有体现出来。
&&& 当玩家一次发射了3组子弹,而这3组子弹并没有消失时,玩家将无法发射子弹。
&&& 使用每组子弹的第一发作为与敌人进行碰撞检测的精灵,同时相关的标志位也设在第一发子弹中。如果玩家子弹与敌机相撞,则敌机消失时,子弹精灵的图片替换为爆炸图片,直到第二次发射该组子弹时,才将图片替换为子弹图片。
毕业论文搜集整理:
&| &| &| &| &| &| &| &| &| &|Java游戏开发项目及游戏源码_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
评价文档:
Java游戏开发项目及游戏源码
J​a​v​a​项​目​开​发
阅读已结束,如果下载本文需要使用
想免费下载本文?
把文档贴到Blog、BBS或个人站等:
普通尺寸(450*500pix)
较大尺寸(630*500pix)
你可能喜欢KEmulator(JAVA手机游戏模拟器)下载 1.0 免安装版_JAVA手机软件模拟工具 - pc6下载站【纯JAVA语言做个RPG游戏】2.游戏界面及角色移动的基本实现 - 推酷
【纯JAVA语言做个RPG游戏】2.游戏界面及角色移动的基本实现
继上次做的地图编辑器,我大致的做了一个的游戏地图数组,不过只画了一部分,以后要加什么新东西继续编辑这个地图就行了,保存在了一个文件中.
&&& 现在便可以继续下一步,做出游戏的大致界面了.
现在的2D游戏界面常见的大致有两种形式:
&&& 1.一种是地图在游戏窗体上固定,人在地图中走动(也就是人相对屏幕移动了);
&&&&2.而另一种则是游戏人物位置固定,游戏的地图在移动,这样看起来也是人物移动了。
&&& 前一种方式地图的大小都给限定死了,不能超出屏幕,要显示大地图的话,通常都是将一个大地图分成若干个区域,然后通过设置门或者传送阵之类的进行整个地图的切换。而后者则没有限定地图的大小,人物可以安逸的走到任意大小地图的任意一个角落。
&&& 当然也有一些游戏是将上面两种模式结合起来了,比如人物走到超过某一个位置时,就开始移动地图,这种混合的模式比较广泛的应用于卷轴式游戏中,例如冒险岛,dnf之类的.
&&& 这里我选择的是第二种形式,因为我觉得将地图分区太麻烦了,用前面做的地图编辑器一次性做一张大的地图更省事。
&&& 那么,首先确定好任务的位置在游戏窗体的正中央,游戏的地图数组是一个二维数组,游戏地图不会小于我们的游戏窗体,所以游戏窗体在任意的一个时刻显示的都仅仅是一个游戏地图的一部分(我们在游戏窗体上显示的时候,仅仅需要读取和操作地图二维数组的一部分值就够了)。
&&& 我们如何来知道目前该显示哪一片地图数组中的内容到游戏面板上呢?这就要靠我们控制的角色了,通过上下左右控制角色相对整张地图的坐标,我们可以将整个游戏面板区域看作是我们操作的角色的视野,通过角色相对与整张地图的坐标,来得到角色相对地图数组的位置(即角色在数组中的i,j),这样就可以找到角色i,j旁边的一系列数组元素了。
&&& 当然,只照上面那样做的话,游戏的画面就会是一格一格动的,因为一个数组元素代表的是一个正方形的图片,角色的视野元素每变一次都至少一变化了一排的元素,不可能说只变化2分之一或者3分之一排的元素,这样画面就是按元素格移动,而不是像素点,看起来就会很恶心,一点都不流畅,要让游戏的画面按像素点移动该怎么做呢?
&&& 首先,还是和前面一样的思维,按照角色相对数组的坐标,找出角色位置旁边的数组元素,但在显示这些元素的时候就不能通过角色相对数组的坐标来画了,要用角色相对地图的坐标来画。由于角色相对地图的坐标变化是连续的,所以这样画出来的图像也是连续的.
下面上代码:
1.首先写一个游戏界面和元素的配置接口,其他类需要用到一些这里面的基本配置信息时只需实现这个接口。
* 游戏配置接口
* @author yy
public interface gameConfig {
//游戏主窗体名字
String title = &场景移动小游戏&;
//游戏主窗体的大小
int frameX = 700;
int frameY = 700;
//游戏面板大小
int panelX = 650;
int panelY = 650;
//游戏素材大小
int elesize = 50;
//人物大小
int playersize = 50;
//------------[游戏素材]----------
//-----第一层
ImageIcon icon0 = new ImageIcon(&000空白.png&);
ImageIcon icon1 = new ImageIcon(&001草地.png&);
ImageIcon icon2 = new ImageIcon(&002地砖.png&);
ImageIcon icon3 = new ImageIcon(&003召泽地板副本.png&);
ImageIcon icon100 = new ImageIcon(&100红树.png&);
ImageIcon icon101 = new ImageIcon(&101绿树.png&);
ImageIcon icon102 = new ImageIcon(&102绿竹.png&);
ImageIcon icon103 = new ImageIcon(&103高绿树.png&);
ImageIcon icon150 = new ImageIcon(&150岩浆.png&);
// ImageIcon shadow = new ImageIcon(&镜头阴影.png&);
ImageIcon shadow2 = new ImageIcon(&镜头阴影2.png&);
2.写一个类用来读取之前做好的游戏地图数组文件(读入的顺序和前面写入时一样):
* 读入地图文件
* @author yy
public class ReadMapFile {
//定义静态的三个数组,用来保存从地图文件中读取到的三个地图数组
static int[][] map1;
static int[][] map2;
static int[][] map3;
* 读入地图
* @param path 地图文件位置
static void readfile(String path){
//从path路径下的地图文件中得到文件输入流
FileInputStream fis = new FileInputStream(path);
//将文件输入流包装成基本数据输入流
DataInputStream dis = new DataInputStream(fis);
//按保存时候的顺序依次读出地图文件中的三个地图数组
int i = dis.readInt();
int j = dis.readInt();
map1 = new int[i][j];
map2 = new int[i][j];
map3 = new int[i][j];
for(int ii=0;ii&i;ii++){
for(int jj=0;jj&j;jj++){
map1[ii][jj] = dis.readInt();
map2[ii][jj] = dis.readInt();
map3[ii][jj] = dis.readInt();
dis.close();
fis.close();
}catch(Exception e){
e.printStackTrace();
3.写一个玩家类,来确定玩家在游戏地图中的位置(角色位移偏移量对50求余,用来补充两个元素之间的间隔无法连续显示的间隙,从而达成像素点移动)。
* @author yy
public class Player extends Thread implements gameConfig{
//角色中点相对游戏面板的位置(在游戏中是不变的)
static int px = panelX/2;
static int py = panelY/2;
//角色中点在整张地图中的位置(设置人最开始中点的位置一定要是一个元素中心的位置,要不然这种移动就会出问题 - -!)
static int x = 25;
static int y = 25;
//角色的偏移量(实现像素点移动关键的部分)
static int mx = 0;
static int my = 0;
//角色的步长
static int step = 1;
//角色是否移动
static boolean up =
static boolean down =
static boolean left =
static boolean right =
public void run() {
while(true){
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
* 角色移动的方法
public void move(){
//改变角色在地图中的位置
//改变角色移动相对于固定元素点的偏移量
if(right){
//得到角色在数组中的位置I
public static int getI(){
return (y-(playersize/2))/50;
//得到角色在数组中的位置J
public static int getJ(){
return (x-(playersize/2))/50;
4.一个工具类,用来让程序能用过读取到数组中的int数据,找到相匹配的元素图片对象。
* 游戏面板通过读取数组中的int来匹配到相应的元素图片方法类
* @author yy
public class GetMap implements gameConfig{
//通过数字匹配图片
static ImageIcon int2icon(int num){
if(num==0){
return icon0;
}else if(num==1){
return icon1;
}else if(num==2){
return icon2;
}else if(num==3){
return icon3;
}else if(num==100){
return icon100;
}else if(num==101){
return icon101;
}else if(num==102){
return icon102;
}else if(num==103){
return icon103;
}else if(num==150){
return icon150;
5.写一个游戏窗体类,游戏就在这个窗体上运行。
(1)一个窗体上放一个游戏面板,这个游戏面板需要我们自己写一个MyPanel类继承JPanel,重写里面的paint方法,在这paint方法里面通过数组画地图,用来更新游戏的地图信息,这样就可以保证面板repaint的时候,地图一直存在。再用一个刷新线程来不停的对面板进行刷新;
(2)然后对窗体安装按键监听器,目前只监听负责移动的上下左右按键,来实现人物的移动,当然这里也可以认为是控制地图的移动,因为这是相对的(物理学相对运动
& (=@__@=) &
),至于怎么提升移动的流畅度也是通过线程处理的,
以前已经考虑过了..
* 游戏主窗体
* @author yy
public class mainFrame extends JFrame implements gameConfig{
//游戏面板
public mainFrame() {
* 设置窗体
public void init(){
this.setTitle(title);
this.setSize(frameX, frameY);
this.setLayout(new FlowLayout());
this.setDefaultCloseOperation(3);
//创建游戏面板
panel = setpanel();
this.add(panel);
this.setVisible(true);
//安装键盘监听器
PanelListenner plis = new PanelListenner();
this.addKeyListener(plis);
//启动人物移动线程
Player player = new Player();
player.start();
//启动刷新面板线程
UpdateThread ut = new UpdateThread(panel);
ut.start();
* 设置游戏面板
public JPanel setpanel(){
JPanel panel = new MyPanel();
panel.setPreferredSize(new Dimension(panelX, panelY));
panel.setLayout(null);
panel.setBackground(Color.black);
* 内部游戏按键监听类
* @author yy
class PanelListenner extends KeyAdapter{
//当按键按下
public void keyPressed(KeyEvent e){
int code = e.getKeyCode();
switch (code) {
case KeyEvent.VK_UP:
Player.up =
case KeyEvent.VK_DOWN:
Player.down =
case KeyEvent.VK_LEFT:
Player.left =
case KeyEvent.VK_RIGHT:
Player.right =
//当按键释放
public void keyReleased(KeyEvent e){
int code = e.getKeyCode();
switch (code) {
case KeyEvent.VK_UP:
Player.up =
case KeyEvent.VK_DOWN:
Player.down =
case KeyEvent.VK_LEFT:
Player.left =
case KeyEvent.VK_RIGHT:
Player.right =
* 自定义内部游戏面板类
* @author yy
class MyPanel extends JPanel{
public void paint(Graphics g) {
super.paint(g);
//找到角色旁边的素材,上下左右各5格
for(int i=Player.getI()-6;i&=Player.getI()+6;i++){
for(int j=Player.getJ()-6;j&=Player.getJ()+6;j++){
//如果这一格没有超界(由于还没处理碰撞,这一条暂时没用
if(i&=0&&j&=0&&i&ReadMapFile.map1.length&&j&ReadMapFile.map1[0].length){
//画第一层元素
ImageIcon icon = GetMap.int2icon(ReadMapFile.map1[i][j]);
g.drawImage(icon.getImage(), (Player.px-elesize/2)+((j-Player.getJ())*elesize)-(Player.mx%elesize), (Player.py-elesize/2)+((i-Player.getI())*elesize)-(Player.my%elesize), elesize, elesize, null);
ImageIcon icon2 = GetMap.int2icon(ReadMapFile.map2[i][j]);
g.drawImage(icon2.getImage(), (Player.px-elesize/2)+((j-Player.getJ())*elesize)-(Player.mx%elesize), (Player.py-elesize/2)+((i-Player.getI())*elesize)-(Player.my%elesize), elesize, elesize, null);
ImageIcon icon3 = GetMap.int2icon(ReadMapFile.map3[i][j]);
g.drawImage(icon3.getImage(), (Player.px-elesize/2)+((j-Player.getJ())*elesize)-(Player.mx%elesize), (Player.py-elesize/2)+((i-Player.getI())*elesize)-(Player.my%elesize), elesize, elesize, null);
g.setColor(Color.black);
g.fillRect(0, 0, 50, 650);
g.fillRect(0, 0, 650, 50);
g.fillRect(600, 0, 50, 650);
g.fillRect(0, 600, 650, 50);
//由于暂时还没弄好游戏角色的移动图,所以角色先用一个黑色的小球代替一下....
g.fillOval(Player.px-elesize/2, Player.py-elesize/2, elesize, elesize);
//个人的一个小想法,做一个黑色的图片,然后中间挖空一个圆,加上模糊效果,来模拟人的视野
g.drawImage(shadow2.getImage(), 0, 0, 650, 650, null);
6.补充上面的面板刷新线程类(注意游戏面板刷新线程的休眠时间一定要是最小的,且其他休眠时间是它的整数倍)
public class UpdateThread extends Thread{
public UpdateThread(JPanel panel) {
this.panel =
public void run() {
while(true){
panel.repaint();
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
7.最后再来个启动类,来启动程序(首先读取到地图数组,再打开窗口)
* 开始游戏
* @author yy
public class test {
public static void main(String[] args) {
//首先从地图文件中读入地图数组
ReadMapFile.readfile(&D:\\mygame\\map\\map1.map&);
//用读到的地图数组创建游戏窗体,开始游戏
mainFrame mf = new mainFrame();
这样下来,一个游戏基本的框架便完成了,接下来的任务便是加入碰撞处理部分了..
运行这个程序(焦点离开那个小黑球吧,那是人物角色的替代品& = =!):
试了一下啊,转化的gif画质简直惨不忍睹,不过还是发上来试试,gif图中有卡顿,实际程序中是没有的,虽然我不知道iteye是否能支持gif...⊙﹏⊙‖∣&....
源代码丢下面了,有兴趣的可以一起玩玩... 搞到这个点,我特么也是醉了....还好明天没课└(^o^)┘
已发表评论数()
&&登&&&陆&&
已收藏到推刊!
请填写推刊名
描述不能大于100个字符!
权限设置: 公开
仅自己可见}

我要回帖

更多关于 java编程软件 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信