plank.move(2,0);
}
}
获取木板当前的位置信息:
publicSpritegetPlank(){//获得挡板对象
returnplank;
}
publicintgetX(){//获得位置信息:
X位置
returnplank.getX();
}
publicintgetY(){//获得位置信息:
Y位置
returnplank.getY();
}
MyGameCanvas游戏类:
MyGameCanvas是游戏的主要类,协调各函数进行调用,实现整个游戏的线程。
MyGameCanvas类实现游戏主要状态的控制,例如游戏开始、返回、暂停、继续。
在不同的状态下跳转到相应的界面,所以在MyMIDlet主类中定义一个界面切换的函数,通过构造函数的参数传递,实现该功能。
MyGameCanvas类中主要的算法
ballHitBricks()函数:
虫虫和苹果的碰撞检测,当苹果和虫虫发生碰撞,虫虫就从定义的集合中移除一个;苹果的反弹控制,苹果经过碰撞虫虫后,改变苹果的运动方向。
publicvoidplankAction(){
If(){
}
Else(){
}
}
plankAction()函数:
苹果的碰撞检测,检测苹果和木板的碰撞,当苹果碰撞到木板,改变苹果的运动方向;调用木板移动函数,控制木板的运动方向。
if(flagUp){
apple.changeDirect(Apple.UP);
}elseif(flagDown){
apple.changeDirect(Apple.DOWN);
}
if(flagLeft){
apple.changeDirect(Apple.LEFT);
}elseif(flagRight){
apple.changeDirect(Apple.RIGHT);
}
线程:
主要调用ballHitBricks()函数和plankAction()函数;速度因子和判断,获取系统当前的运行时间和获取系统运行线程第一轮的时间来判断;线程一直运行,用boolean型来控制线程的开启、关闭和暂停游戏的功能。
3.4功能实现截图
图3-1图3-2
图3-3图3-4
图3-5图3-6
4、小结
由于市场需要,游戏的更新速度步步加快,为了适应社会的需要,社会对游戏开发人员的需求,在游戏编程的学习过程中,必须理论与实践结合,提高编程能力与水平。
通过小游戏的设计,对以学过的内容加深理解,对游戏开发的过程有初步的认识,为以后的游戏开发设计和更加深入的学习计算机语言打下夯实的基础。
目前竞争日益激烈的行业环境,对于未来行业的前景,还是要保持乐观的心态。
毕竟游戏并不是一下子就可以编写成的。
需要不断的技术积累,需要团队的合作,提高了工作的效率,才算是在游戏开发的道路上成功了一半。
在现在这个信息化飞速发展的道路上,要成为一名合格的编程人员,那就必须走好每一步现在的路。
本游戏是基于J2ME的小游戏,满足了用户娱乐的需求,已经达到了预期的目标。
虽然该游戏大部分功能基本上已经实现,但是还是会存在一些不足:
(1)游戏的关卡太少,样式不够多样化,不能满足用户对该游戏的挑战。
(2)游戏的色彩不够多样化,色彩单一,不能给用户增加新鲜的娱乐感。
(3)对于用户信息以及积分榜方面,由于该程序没有涉及到数据库的相关内容,在用户信息和积分存储,用户信息和积分的更新功能方面表现欠佳。
在这些功能方面有待进一步改善。
虽然游戏在功能和界面上不能算的上很棒,但是麻雀虽小,五脏俱全,游戏具备了打虫虫这个游戏应该具有的基本雏形。
通过这一设计,我们对这个游戏应该有了比较宏观的了解,我们将在这一基础上探究游戏更完美的改变。
5、参考文献
[1](美)埃克尔著陈昊鹏,饶若楠等译.Java编程思想[J].机械工业出版社,2005
[2](美)GaryJ.Bronson著张珑刘雅文译.Java编程原理[J].清华大学出版社,2004
[3](美)MichaelMorrison著徐刚,于健,薛雷译.游戏编程入门[J].人民邮电出版社,2005.9
[4](美)WendyStahler著冯宝坤,曹英译.游戏编程中的数理应用[J].红旗出版社,2005
[5](美)克罗夫特(DavidWallaceCroft)著彭晖译.Java游戏高级编程[J].清华大学出版社,2005
[6](美)DavidBrackeen著邱仲潘译.Java游戏编程[J].科学出版社,2004
[7]聂庆亮编著.Java应用开发指南[J].清华大学出版社,2010
[8]耿祥义,张跃平编著.Java面向对象程序设计[J].清华大学出版社,2010
[9]杨绍方编著.Java编程实用技术与案例[J].清华大学出版社,2000.11
[10]明日科技编著.Java编程全能词典[J].电子工业出版社,2010
6、附录:
游戏的代码实现和分析
MyMIDlet.java
importjavax.microedition.lcdui.Display;
importjavax.microedition.midlet.MIDlet;
importjavax.microedition.midlet.MIDletStateChangeException;
publicclassMyMIDletextendsMIDlet{
privateDisplaydisplay;
publicMyGameCanvasmgc;
publicWelcomewelcome;
publicWinGamewingame;
publicLostGamelostgame;
publicMyMIDlet(){
display=Display.getDisplay(this);
welcome=newWelcome(this);
//mgc=newMyGameCanvas(this);
//wingame=newWinGame(this);
//lostgame=newLostGame(this);
}
protectedvoiddestroyApp(booleanarg0)throwsMIDletStateChangeException{
//TODOAuto-generatedmethodstub
}
protectedvoidpauseApp(){
//TODOAuto-generatedmethodstub
}
protectedvoidstartApp()throwsMIDletStateChangeException{
changeForm("Welcome");
}
publicvoidchangeForm(Stringstr){
if(str.equals("Welcome")){
display.setCurrent(welcome);
}
elseif(str.equals("WinGame")){
display.setCurrent(wingame);
}
elseif(str.equals("LostGame")){
display.setCurrent(lostgame);
}
elseif(str.equals("MyGameCanvas")){
display.setCurrent(mgc);
}
}
}
MyGameCanvas.Java
importjava.io.IOException;
importjava.io.InputStream;
importjava.util.Vector;
importjavax.microedition.lcdui.Command;
importjavax.microedition.lcdui.CommandListener;
importjavax.microedition.lcdui.Displayable;
importjavax.microedition.lcdui.Graphics;
importjavax.microedition.lcdui.Image;
importjavax.microedition.lcdui.game.GameCanvas;
importjavax.microedition.media.Manager;
importjavax.microedition.media.MediaException;
importjavax.microedition.media.Player;
publicclassMyGameCanvasextendsGameCanvasimplementsCommandListener,Runnable{
privateGraphicsg;
privateMyMIDletparent;
privateImageimgBJ;
privatePlayerplayerGame,playerPZ;//定义游戏音乐和碰撞音乐
privateAppleapple;//定义球类
privateVectorbricks;//砖块集合
privatePlankplank;//一个挡板
privateThreadt,t1,t2;//线程t,t1,t2
privatebooleanRUN=true;//是否运行
privatebooleanSTART=false;//是否开始
privatebooleanBACK=false;//是否返回
privateCommandstart=newCommand("开始",Command.OK,1);//开始
privateCommandresume=newCommand("继续",Command.BACK,1);//继续
privateCommandpause=newCommand("暂停",Command.BACK,1);//暂停
privateCommandback=newCommand("返回",Command.EXIT,1);//返回
privateintwidth;//手机屏幕宽度
privateintheight;//手机屏幕宽度
MyGameCanvas(MyMIDletparent){
super(true);
g=this.getGraphics();//获得画布画图对象
this.parent=parent;
width=this.getWidth();//获得手机屏幕的宽度
height=this.getHeight()-10;//获得手机屏幕的高度
apple=newApple(g,width,height);//实例化球
plank=newPlank(g,width,width/2-30,height-10);//实例化挡板
bricks=newVector();//砖块集合实例化
intbricksXnum=width/200;//计算屏幕横向的长度的砖块数量
intbricksXLeft=(width-bricksXnum*30)/2;//计算总数量
intbricksYnum=(height-90)/80;//计算屏幕纵向的长度的砖块数量
for(inti=0;ifor(intj=0;jbricks.addElement(newBug(g,bricksXLeft+i*30,20*j));
}
}
try{
imgBJ=Image.createImage("/beijing.jpg");//加载背景图片
}catch(IOExceptione){
e.printStackTrace();
}
InputStreamisGame=this.getClass().getResourceAsStream("/game.mid");
InputStreamispz=this.getClass().getResourceAsStream("/select.wav");
try{
playerGame=Manager.createPlayer(isGame,"audio/midi");
playerGame.setLoopCount(-1);//重复播放音乐
playerPZ=Manager.createPlayer(ispz,"audio/x-wav");
}catch(IOExceptione){
e.printStackTrace();
}catch(MediaExceptione){
e.printStackTrace();
}
MusicGame();
this.addCommand(start);
this.addCommand(back);
this.setCommandListener(this);
t=newThread(this);
t.start();
}
publicvoidMusicGame(){//线程t1
Runnabler=newRunnable(){
publicvoidrun(){
try{
playerGame.start();
}catch(MediaExceptione){
e.printStackTrace();
}
}
};
t1=newThread(r);
t1.start();
}
publicvoidMusicPZ(){//线程t2
Runnabler=newRunnable(){
publicvoidrun(){
try{
playerPZ.start();
}catch(MediaExceptione){
e.printStackTrace();
}
}
};
t2=newThread(r);
t2.start();
}
publicvoidrun(){
while(true){
g.setColor(255,255,255);
g.fillRect(0,0,this.getWidth(),this.getHeight());
paint();//画背景图片
if(START){
if(RUN){
if(bricks.size()==0){
playerGame.close();//结束音乐
parent.wingame=newWinGame(parent);
parent.changeForm("WinGame");
break;//跳出线程
}
if(apple.getY()>height){
playerGame.close();//结束playerGame音乐
parent.lostgame=newLostG