仓酷云

标题: JAVA网页设计J2ME 2D小游戏进门之旅(四) 到场枪弹群... [打印本页]

作者: 分手快乐    时间: 2015-1-18 11:36
标题: JAVA网页设计J2ME 2D小游戏进门之旅(四) 到场枪弹群...
主要缺点就是:速度比较慢,没有C和C++快运算飞机类游戏中枪弹是必不成少的,他们数目良多且充溢着全部屏幕,这些随机大概有着必定AI的小物体,完成起来不是总那末简单,偶然候你不能不思索良多和效能有关的成绩。我们之前界说了GameObject,很年夜水平上就是为了便利的重用Sprite,由于我们有良多的枪弹,不成能没增添一个枪弹都是一个Sprite,我必要共享统一个Sprite。我们经由过程承继GameObject来完成。



上面剖析一下这个枪弹类:

它将承继自GameObject;

纪录枪弹的个数;

一个枪弹的形态数组,纪录各个枪弹的范例type,地位x,y,速率vx,vy,是不是存活alive等等。

初始化枪弹

一个绘制办法,将枪弹画到屏幕上。

一个碰撞检测办法。



好了先如许吧,以下是我们枪弹类的界说,注重这类头脑――重用Sprite,这很主要。(这里参考了tony的良多计划)

publicclassBulletsextendsGameObject{

privateint[][]bullets;//枪弹形态数组

privateintbulletstotal;//数组的length

privateRandomrnd;//随机数

publicstaticfinalintBULLET_TYPE_LEFT=0;//枪弹初始化的地位范例

publicstaticfinalintBULLET_TYPE_RIGHT=1;//分为高低摆布四种

publicstaticfinalintBULLET_TYPE_TOP=2;

publicstaticfinalintBULLET_TYPE_BOTTOM=3;

privateintwidth,height;//屏幕的高和宽,用于随机枪弹地位



publicBullets(Imageimg,intpicwidth,intpicheight,intbulletstotal,intwidth,intheight){

super(img,picwidth,picheight);

this.bulletstotal=bulletstotal;

bullets=newint[bulletstotal][6];

rnd=newRandom();

this.width=width;

this.height=height;

}



publicvoidinitBullets(){//初始化枪弹形态数组

for(inti=0;i<bullets.length;i++){

initBullet(i);

}

}



privatevoidinitBullet(inti){//初始化index号枪弹

bullets[i][0]=(rnd.nextInt()&0x7fffffff)%4;//type

bullets[i][5]=1;//alive1暗示存活,0暗示逝世往

switch(bullets[i][0]){

caseBULLET_TYPE_LEFT:

bullets[i][1]=-5;

bullets[i][2]=(rnd.nextInt()&0x7fffffff)%height;

bullets[i][3]=(rnd.nextInt()&0x7fffffff)%3+1;//vx

bullets[i][4]=(rnd.nextInt())%3;//vy

break;

caseBULLET_TYPE_RIGHT:

bullets[i][1]=width+5;

bullets[i][2]=(rnd.nextInt()&0x7fffffff)%height;

bullets[i][3]=((rnd.nextInt()&0x7fffffff)%3+1)*-1;//vx

bullets[i][4]=(rnd.nextInt())%3;//vy

break;

caseBULLET_TYPE_TOP:

bullets[i][1]=(rnd.nextInt()&0x7fffffff)%width;

bullets[i][2]=-5;

bullets[i][3]=(rnd.nextInt())%3;//vx

bullets[i][4]=(rnd.nextInt()&0x7fffffff)%3+1;//vy

break;

caseBULLET_TYPE_BOTTOM:

bullets[i][1]=(rnd.nextInt()&0x7fffffff)%width;

bullets[i][2]=height+5;

bullets[i][3]=(rnd.nextInt())%3;//vx

bullets[i][4]=((rnd.nextInt()&0x7fffffff)%3+1)*-1;//vy

break;

}

}



publicvoidupdata(inti){//依据速率更新i枪弹下一桢的地位,受阻反弹

bullets[i][1]+=bullets[i][3];

bullets[i][2]+=bullets[i][4];

if(bullets[i][1]<-5||bullets[i][1]>width+5){

bullets[i][3]*=-1;

}

if(bullets[i][2]<-5||bullets[i][2]>height+5){

bullets[i][4]*=-1;

}

}



privatevoidpaint(Graphicsg,inti){//绘画出第i个枪弹

updataspritepos(i);//更新地位

sprite.paint(g);//绘画Sprtie

}



publicvoidpaint(Graphicsg){//绘画全部枪弹组

for(inti=0;i<bullets.length;i++){

if(bullets[i][5]==0){//逝世往的枪弹不绘画

continue;

}

sprite.setPosition(bullets[i][1],bullets[i][2]);//更新地位

sprite.paint(g);

}

}



publicvoidrefreshBullets(Spriteplanesprite,booleanneedcollision){//革新字典数组的形态,并作碰撞处置

for(inti=0;i<bullets.length;i++){

if(bullets[i][5]==0){//逝世往的枪弹不更新

continue;

}

if(needcollision){//假如必要碰撞检测

if(isCollision(planesprite,i,10)){//假如碰撞,举行处置

//System.out.println("collision");

Navigate.mc.gameover=true;

Navigate.mc.explosion.sprite.setPosition(bullets[i][1]-16,

bullets[i][2]-16);

bullets[i][5]=0;//杀逝世碰撞的枪弹

continue;

}

}

updata(i);//更新形态

}

}



privatebooleanisCollision(Spritesprite,inti,intrange){

//判别是不是碰撞

//updataspritepos(i);

//returnsprite.collidesWith(this.sprite,true);

booleanresult=false;

intplaneXCenter=sprite.getX()+12;

intplaneYCenter=sprite.getY()+12;

intbulletXCenter=bullets[i][1]+3;

intbulletYCenter=bullets[i][2]+3;

if(Math.abs(planeXCenter-bulletXCenter)<range){

if(Math.abs(planeYCenter-bulletYCenter)<range){

result=true;

}

}

returnresult;

}



privatevoidupdataspritepos(inti){//将sprite更新到i字弹的地位

sprite.setPosition(bullets[i][1],bullets[i][2]);

}



/*nousenow

publicvoidresetDeadBullet(){

for(inti=0;i<bullets.length;i++){

if(bullets[i][5]==0){//deadbullet

initBullet(i);

}

}

}

*/



publicvoidkillbullets(Spriteplanesprite,intrange){杀逝世必定地区内的枪弹

for(inti=0;i<bullets.length;i++){

if(bullets[i][5]!=0){//alivebullets

if(isCollision(planesprite,i,range)){

bullets[i][5]=0;

initBullet(i);

}

}

}

}

}

枪弹怎样暗示?

起首我们用一个二维数组来纪录枪弹的信息:

bullets[i][0]暗示枪弹的范例,有上、下、左、右四种,分离暗示枪弹飞进屏幕前的四种地位;

bullets[i][1]暗示枪弹的x坐标;

bullets[i][2]暗示枪弹的y坐标

bullets[i][3]暗示枪弹的x偏向速率;

bullets[i][4]暗示枪弹的y偏向速率;

bullets[i][5]暗示枪弹的存活形态;



枪弹怎样初始化?

我们起首写了一个初始化单个枪弹的办法,然后便当数组挪用initBullet(i);来更新全部形态数组。



枪弹怎样绘制?

我们起首写了一个绘制单个枪弹的办法,然后便当数组挪用paint(g,i);来绘制全部形态数组。



枪弹怎样碰撞?

有良多种办法,个中sprite自己就供应了边框碰撞检测和基于像素的碰撞检测。前者不太合适我们的游戏,我们的飞机是不划定规矩物体,且航行游戏对碰撞对照敏感;尔后者的效力又得不到我们的信任,以是我们是用一种半径检测,把飞机近似的当作圆,拔取得当的半径,Math.abs(planeXCenter-bulletXCenter)<range则标明碰撞。

碰撞看似复杂,实际上是很庞大的成绩,值得光荣的是,二维碰撞比拟三维碰撞复杂很多。一个小技能是,宁肯让收缩检测半径变小也不要他变得年夜――遗漏检测,总比误检测要好很多。



枪弹更新?

我们使用refreshBullets举行更新,这是次要逻辑部分。这个办法卖力便当数组检测碰撞,假如碰撞就将处于碰撞地位的枪弹杀逝世,并作响应的处置,这里是停止游戏并爆炸飞机;不然更新枪弹的地位。

我们只是线性的遍历全部的数组,举行碰撞检测,以后是更新地位;可是如许做有一个条件,就是碰撞检测复杂并且处置部分也很复杂:在这个游戏中,碰撞检测只是枪弹群和飞机的检测,碰撞检测在游戏停止后就不实行了(经由过程把持booleanneedcollision);而处置更是复杂了一些――间接停止了游戏。假如不是云云,好比处置后并非复杂的停止游戏,我们就不能不计划的庞大一些。大概就不是将碰撞复杂的以飞机为中央了。我们必要计划好游戏事务,计划好碰撞体系。

假如碰撞自己对照庞大,大概枪弹数目,品种增添时,我们线性的遍历数组就不克不及老是对一切的枪弹都检测,大概屏幕必要分区,不处于一个地区的单元不检测。

总之当你想一想你的1934时,将不在是设想着枪弹,飞机甚么的,你要思索一个体系。

总结一会儿弹类的大众接口:

nBullets(Imageimg,intpicwidth,intpicheight,intbulletstotal,intwidth,intheight)机关函数

npublicvoidinitBullets()初始化枪弹数组

npublicvoidpaint(Graphicsg)paint枪弹数组

npublicvoidrefreshBullets(Spriteplanesprite,booleanneedcollision)更新枪弹数组形态,碰撞检测、处置等逻辑事情的综合

npublicvoidkillbullets(Spriteplanesprite,intrange)//稍后注释



到此为止,我们的游戏已初具范围了,下一步是到场效果类,嘿嘿有点意义了…




专门做了这个例子;而java的这个例子好像就是为了教学而写的,很多教学目的的例子是不考虑优化、性能的。
作者: 透明    时间: 2015-1-21 10:45
多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间,使得程序员不用再为内存管理而担忧。在 Java 1.5 版本中,Java 又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
作者: 金色的骷髅    时间: 2015-1-24 15:18
让你能够真正掌握接口或抽象类的应用,从而在原来的Java语言基础上跃进一步,更重要的是,设计模式反复向你强调一个宗旨:要让你的程序尽可能的可重用。
作者: 飘飘悠悠    时间: 2015-1-31 16:24
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
作者: 谁可相欹    时间: 2015-1-31 23:43
在全球云计算和移动互联网的产业环境下,Java更具备了显著优势和广阔前景。
作者: 仓酷云    时间: 2015-2-3 10:45
一直感觉JAVA很大,很杂,找不到学习方向,前两天在网上找到了这篇文章,感觉不错,给没有方向的我指了一个方向,先不管对不对,做下来再说。
作者: 爱飞    时间: 2015-2-6 16:37
Java是一种计算机编程语言,拥有跨平台、面向对java
作者: 深爱那片海    时间: 2015-2-11 02:55
另外编写和运行Java程序需要JDK(包括JRE),在sun的官方网站上有下载,thinking in java第三版用的JDK版本是1.4,现在流行的版本1.5(sun称作J2SE 5.0,汗),不过听说Bruce的TIJ第四版国外已经出来了,是专门为J2SE 5.0而写的。
作者: 变相怪杰    时间: 2015-3-1 19:55
吧,现在很流行的Structs就是它的一种实现方式,不过Structs用起来实在是很繁,我们只要学习其精髓即可,我们完全可以设计自己的MVC结构。然后你再研究一下软件Refactoring (重构)和极限XP编程,相信你又会上一个台阶。 做完这些,你不如整理一下你的Java代码,把那些经典的程序和常见的应用整理出来,再精心打造一番,提高其重用性和可扩展性。你再找几个志同道合的朋友成立一个工作室吧
作者: 精灵巫婆    时间: 2015-3-6 22:50
其实说这种话的人就如当年小日本号称“三个月拿下中国”一样大言不惭。不是Tomjava泼你冷水,你现在只是学到了Java的骨架,却还没有学到Java的精髓。接下来你得研究设计模式了。
作者: 活着的死人    时间: 2015-3-11 22:49
你快去找一份Java的编程工作来做吧(如果是在校学生可以去做兼职啊),在实践中提高自己,那才是最快的。不过你得祈祷在公司里碰到一个高手,而且他 还愿意不厌其烦地教你,这样好象有点难哦!还有一个办法就是读开放源码的程序了。我们知道开放源码大都出自高手,他们设计合理,考虑周到,再加上有广大的程序员参与,代码的价值自然是字字珠叽,铿锵有力(对不起,偶最近《金装四大才子》看多了)。
作者: 分手快乐    时间: 2015-3-12 19:08
学Java必读的两个开源程序就是Jive和Pet Store.。 Jive是国外一个非常著名的BBS程序,完全开放源码。论坛的设计采用了很多先进的技术,如Cache、用户认证、Filter、XML等,而且论坛完全屏蔽了对数据库的访问,可以很轻易的在不同数据库中移植。论坛还有方便的安装和管理程序,这是我们平时编程时容易忽略的一部份(中国程序员一般只注重编程的技术含量,却完全不考虑用户的感受,这就是我们与国外软件的差距所在)。
作者: 不帅    时间: 2015-3-14 07:33
Sun公司看见Oak在互联网上应用的前景,于是改造了Oak,于1995年5月以Java的名称正式发布。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
作者: 小女巫    时间: 2015-3-19 23:51
是一种突破用户端机器环境和CPU
作者: 老尸    时间: 2015-3-20 14:02
Pet Store.(宠物店)是SUN公司为了演示其J2EE编程规范而推出的开放源码的程序,应该很具有权威性,想学J2EE和EJB的朋友不要 错过了。
作者: 第二个灵魂    时间: 2015-3-25 05:40
我大二,Java也只学了一年,觉得还是看thinking in java好,有能力的话看英文原版(中文版翻的不怎么好),还能提高英文文档阅读能力。
作者: 冷月葬花魂    时间: 2015-3-25 06:16
关于设计模式的资料,还是向大家推荐banq的网站 [url]http://www.jdon.com/[/url],他把GOF的23种模式以通俗易懂的方式诠释出来,纯Java描述,真是经典中的经典。
作者: 灵魂腐蚀    时间: 2015-3-25 18:24
《JAVA语言程序设计》或《JAVA从入门到精通》这两本书开始学,等你编程有感觉的时候也可以回看一下。《JAVA读书笔记》这本书,因为讲的代码很多,也很容易看懂,涉及到面也到位。是你学习技术巩固的好书,学完后就看看《JAVA编程思想》这本书,找找一个自己写的代码跟书上的代码有什么不一样。
作者: 莫相离    时间: 2015-3-27 10:12
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
作者: 若相依    时间: 2015-3-30 10:49
有时间再研究一下MVC结构(把Model-View-Control分离开的设计思想)
作者: 愤怒的大鸟    时间: 2015-4-1 08:13
应用在电视机、电话、闹钟、烤面包机等家用电器的控制和通信。由于这些智能化家电的市场需求没有预期的高,Sun公司放弃了该项计划。随着1990年代互联网的发展




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2