美国上市公司,专注Java培训22年

java Swing游戏总结


一个月了,老师用swing讲过两个游戏,加上有经典案例的电子书,照着书上敲了下代码,通过调试修改,最后总结了下,其实java用swing写的游戏有很多共性,或者说很多的桌面游戏都有的共性吧。
一句话归结,这类游戏就是一副可以与人交互的与人交互的、能够根据状态控制画面的动态画面。然后我将它划作三个大块(以下就以设计游戏为例):静态,动态和可控制的动态。以下就根据这三步分析

静的
设计实体----根据共同属性和方法抽类,设计接口和父类
abstract class FlyingObject{width,height,x,y,image}
interface Award{life,doubleFire,getType()}
interface Enemy{getScore(int speed);}

Airplane extends FlyingObject implements Enemy
Hero extends ...
Bee extends... implements Award
Bullet
ShootGame extends JPanel--入口

初始化实体--位置,图片

paint(g){
paintHero(g);
paintAirplane(g);
paintBee(g);
paintScore(g);
paintState(g);
...
}

动的
Timer timer;
实体进入(出现):
Hero hero=new Hero(x,y,image)
Airplane airplane;
Bee bee;

实体的行为:
hero--射击,随鼠标移动,
airplane,Bee--下落,speed,(xspeed)
bullet---向上移动,speed

因实体行为引发的事件:
shootBy(Bullet bullet);//敌机被子弹击中
hit(FlyingObject obj);//英雄机和敌机相撞
outBroundsAction();// 从数组中删除越界的飞行物
checkGameover();// 检查游戏是否结束

repaint();

可以控制的动的
状态---START: hero,start.png
RUNNING: 实体的进入,子弹发射,检测碰撞与子弹击中,检测游戏结束....
PAUSE: timer.cancel(),pause.png
GAMEOVER: 清零,初始化

第一步(设计分析要建的类以及相互关系):

FlyingObject-------所有飞行物的父类(抽象类)
{width,height,x,y,image}
Award--------------奖励接口,击中蜜蜂会获得奖励,蜜蜂符合既是飞行物又有奖励,实现该接口
{life,doubleFire,getType()}
Enemy--------------敌人接口,击中敌机会获得分数,敌机符合既是飞行物又是敌人,实现该接口
{getScore(int score)}

Airplane-----------敌机类
extends FlyingObject implements Enemy
Hero---------------英雄机类
extends FlyingObject
Bee----------------蜜蜂类
extends FlyingObject implements Award
Bullet-------------子弹类
extends FlyingObject

class Hero...{
BufferedImage images[]=new BufferedImage[2];//显示喷气效果,需要两张图片切换
int index;//控制两张图片切换频率(index++/10%2==0?),定时器间隔*10切换一次
int life;//生命
int doubleFire;//双倍火力的子弹数量
Hero(){
image = ShootGame.hero0;
width = image.getWidth();
height = image.getHeight();
this.x = 150;
this.y = 400;
# = 3;// 生命
doubleFire = 0;// 火力,等于0表示单倍火力
images[0] = ShootGame.hero0;
images[1] = ShootGame.hero1;
index = 0;
}
}
class Airplane...{
int speed;//下落的速度
Airplane(){
image=ShootGame.airplane;
width=image.getWidth();
height=image.getHeight();
x=(int)(Math.random()*(ShootGame.WIDTH-this.getWidth()));
y=-this.getHeight();
speed=new Random().nextInt(6);//下落速度取0-5的随机数
}
}
class Bee ...{
int xspeed;//蜜蜂的横向移动速度
int yspeed;//蜜蜂的纵向移动速度
int awardType();//蜜蜂的奖励类型
Bee(){
image=ShootGame.bee;
width=image.getWidth();
height=image.getHeight();
x=(int)(Math.random()*(ShootGame.WIDTH-this.getWidth()));
y=-this.getHeight();
this.awardType=(int)(Math.random()*2);
}
int getAwardType(){};//得到蜜蜂的奖励类型
}
class Bullet(){
int xspeed=0;//横向速度
int yspeed=3;//纵向速度
Bullet(int x,int y){//子弹的初始位置是由英雄机的坐标决定的,由英雄机构造子弹
image=ShootGame.bullet;
width=image.getWidth();
height=image.getHeight();
this.x=x;
this.y=y;
}
public Bullet(int x,int y,int xspeed,int yspeed) {//备用,绝招,在屏幕下方出现一排子弹向上移动,速度自定
this(x,y);
this.xspeed=xspeed;
this.yspeed=yspeed;
}
}
第一步到此结束,因为各种游戏的第二步都不甚相同,关键是思想要走到"游戏如何动,怎么动,动了会怎样"那里去,只要有想法,然后一步一步地,将各个类的行为和联系理清,最终连成一条非线性链,那么游戏已经完成一大半。
最后一小步就要考虑"游戏在什么时候该怎么动",设计几种状态,例如出现几率最多的几种:start,running,gameover...开始状态需要初始化一部分实体在窗口,但是窗口应该是静态的,运行状态就是游戏最疯狂的时候,各种实体都动起来,如果检测到游戏已经结束,需要销毁窗口上的东西,重新初始化又进入到开始状态。
可能总结得不完善,也有很多说得本身就不对的地方,只是阐述了一下个人对窗口游戏设计的思想的理解。求勿喷

【免责声明】本文部分系转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,如涉及作品内容、版权和其它问题,请在30日内与我们联系,我们会予以重改或删除相关文章,以保证您的权益!

Java开发高端课程免费试学

大咖讲师+项目实战全面提升你的职场竞争力

  • 海量实战教程
  • 1V1答疑解惑
  • 行业动态分析
  • 大神学习路径图

相关推荐

更多
  • 一个故事讲完https
    一个故事讲完https
    感谢大家阅读由java培训机构分享的“一个故事讲完https”希望对大家有所帮助 详情>>

    2017-08-31

  • GitHub 上火的 Java 框架
    GitHub 上火的 Java 框架
    Java 是目前最需要的编程语言之一。在这里,我们已经挖掘了一些关于框架趋势的有用信息,也就是最受开发者青睐的 Java 框架,名单如下 详情>>

    2017-10-24

  • Java入门学习路径,没有之一
    Java入门学习路径,没有之一
    作为刚刚进入Java领域的新同学,无论是高校的毕业大学生,还是有志转行的在职人员,都面临着诸多的困惑。今天java培训班就来为大家讲解下Java入门学习路径 详情>>

    2017-11-23

  • java初学者学习心得
    java初学者学习心得
    学习了一学期的Java课程,觉得是该总结自己的心得体会了。开始学习任何一门课(包括java),兴趣最重要。下面请看java培训机构带来的分享 详情>>

    2017-12-12

  • Java开班时间

    收起