`
wuhua
  • 浏览: 2110594 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

游戏入门之三 雷电 Game

阅读更多
       这里介绍的是Game的逻辑类,主要控制游戏的动作,以及绘制。
       详细里面代码有注释
java 代码
 
  1. /******************************************************************** 
  2.  * 项目名称             :j2me学习          
     
  3.  *  
  4.  * Copyright 2005-2006 Wuhua. All rights reserved 
  5.  ********************************************************************/  
  6. package org.wuhua.battleplan;  
  7.   
  8. import java.util.Stack;  
  9.   
  10. import javax.microedition.lcdui.Graphics;  
  11. import javax.microedition.lcdui.Image;  
  12.   
  13. import org.wuhua.game.GameCanvas;  
  14. import org.wuhua.game.model.Fairy;  
  15. import org.wuhua.game.util.Log;  
  16.   
  17.    
  18. /** 
  19.  * 类名:Game.java 
     
     
  20.  * 编写日期: 2006-11-30 
     
  21.  * 程序功能描述:游戏的主体类。游戏的绘制,状态的改变都在这边。 
     
  22.  * Demo: 
     
  23.  * Bug: 
     
  24.  *  
  25.  * 程序变更日期 :
     
     
  26.  * 变更作者 :
     
     
  27.  * 变更说明 :
     
  28.  *  
  29.  * @author wuhua 
     
     
  30.  */  
  31. public class Game extends GameCanvas {  
  32.     static Log log = Log.getLog("Game");  
  33.     private Hero hero;  
  34.       
  35.     private Stack balls;  
  36.     private Stack foes;  
  37.       
  38.     private Stack balst;  
  39.     /** 
  40.      * 爆炸效果索引 
  41.      */  
  42.     private int balstIndex;  
  43.       
  44.     /** 
  45.      * if time = 3 的时候建立一个 
  46.      */  
  47.     private int genaratBallTime;  
  48.       
  49.     private int genaratFoeTime;  
  50.       
  51.       
  52.     Game(){  
  53.         super();  
  54.         this.setFullScreenMode(true);  
  55.     }  
  56.       
  57.     void init(){  
  58.           
  59.         WIDTH = getWidth();  
  60.         HEIGHT = getHeight();  
  61.         log.debug("WIDTH=" + WIDTH);  
  62.         log.debug("hegiht=" + HEIGHT);  
  63.         this.bufferImage = Image.createImage(WIDTH, HEIGHT);  
  64.            
  65.         Platform.WIDTH = this.getWidth();  
  66.         Platform.HEIGHT = this.getHeight();  
  67.           
  68.           
  69.         hero = Hero.createHero(Platform.WIDTH/2, Platform.HEIGHT -30);  
  70.        
  71.         balst = new Stack();  
  72.            
  73.     }  
  74.       
  75.     /** 
  76.      * 产生爆炸效果 
  77.      * @param x 
  78.      * @param y 
  79.      */  
  80.     void genaratorBalst(int x, int y){  
  81.         balst.addElement(new Fairy(Resources.BLAST[0], x, y));  
  82.         balst.addElement(new Fairy(Resources.BLAST[1], x, y));  
  83.         balst.addElement(new Fairy(Resources.BLAST[2], x, y));  
  84.         balst.addElement(new Fairy(Resources.BLAST[3], x, y));  
  85.         balst.addElement(new Fairy(Resources.BLAST[4], x, y));  
  86.     }  
  87.       
  88.     /** 
  89.      * 碰撞。实在没有好的实现。 我想不出来了. 
  90.      * 逻辑是遍历所有子弹,然后再遍历所有敌机,再判断是否碰撞,如果碰撞,则产生一个爆炸实例. 
  91.      * 最后删除子弹跟飞机. 
  92.      * 
  93.      */  
  94.     void collides(){  
  95.         if(balls == null   
  96.                 || foes == null)  
  97.             return ;  
  98.         for(int i = 0; i < balls.size(); i ++){  
  99.             Ball b = (Ball) balls.elementAt(i);  
  100.             for(int j =0; j < foes.size(); j ++){  
  101.                 Foe f = (Foe) foes.elementAt(j);  
  102.                 if(b.collidesWith(f)){  
  103.                     this.genaratorBalst(f.getX(), f.getY());  
  104.                     balls.removeElement(b);  
  105.                     foes.removeElement(f);  
  106.                     return;  
  107.                 }  
  108.                
  109.             }  
  110.         }  
  111.     }  
  112.       
  113.     /** 
  114.      * 绘制游戏场景跟Hero 
  115.      * 
  116.      */  
  117.     void drawGame(){  
  118.         if(Platform.HEIGHT < this.getHEIGHT()){  
  119.             Platform.HEIGHT = this.getHEIGHT();  
  120.         }  
  121.           
  122.         Graphics g = this.getGraphics();  
  123.         if(g == null)  
  124.             return;  
  125.         fillFullScreen(g,0x349293);  
  126.         paintHeroAndBall(g);  
  127.           
  128.         paintFoe(g);  
  129.           
  130.         paintBalst(g);  
  131.         this.flushGraphics();  
  132.     }  
  133.   
  134.     /** 
  135.      * 绘制爆炸效果 
  136.      * @param g 
  137.      */  
  138.     private void paintBalst(Graphics g) {  
  139.            
  140.         if(balst == null   
  141.                 || balst.size() == 0)  
  142.             return;  
  143.           
  144.         Fairy bf = (Fairy) balst.elementAt(balstIndex);  
  145.         bf.paint(g);  
  146.         if(balstIndex >= 4){  
  147.             balstIndex = 0;  
  148.             balst.removeAllElements();  
  149.         }  
  150.               
  151.         balstIndex++;  
  152.     }  
  153.   
  154.     /** 
  155.      * 绘制敌机 
  156.      * @param g 
  157.      */  
  158.     private void paintFoe(Graphics g) {  
  159.         if(foes == null)  
  160.             return ;  
  161.         for(int i=0; i < foes.size(); i++){  
  162.             Foe foe = (Foe) foes.elementAt(i);  
  163.             foe.paint(g);  
  164.         }  
  165.           
  166.     }  
  167.       
  168.     /** 
  169.      * 制造敌飞机 
  170.      * 
  171.      */  
  172.     public void genaratorFoe(){  
  173.         if(this.genaratFoeTime == 5){             
  174.             FoeManager.addFoe(FoeManager.genarator());  
  175.             FoeManager.clearFoesIsOut();  
  176.             foes = FoeManager.getFoes();  
  177.             genaratFoeTime = 0;  
  178.         }  
  179.           
  180.         genaratFoeTime++;  
  181.     }  
  182.       
  183.     /** 
  184.      * 敌机飞行 
  185.      * 
  186.      */  
  187.     public void foeFly(){  
  188.         if(foes == null)  
  189.             return ;  
  190.         for(int i = 0; i < foes.size(); i++){  
  191.             Foe foe = (Foe) foes.elementAt(i);  
  192.             foe.fly();  
  193.         }  
  194.     }  
  195.   
  196.     private void paintHeroAndBall(Graphics g) {  
  197.         hero.paint(g);  
  198.         paintBalls(g);  
  199.     }  
  200.   
  201.     /** 
  202.      * 绘制子弹 
  203.      * @param g 
  204.      */  
  205.     private void paintBalls(Graphics g) {  
  206.         if(balls == null)  
  207.             return ;  
  208.         for(int i = 0; i < balls.size(); i++){  
  209.             Ball ball = (Ball) balls.elementAt(i);  
  210.             ball.paint(g);  
  211.         }  
  212.           
  213.     }  
  214.       
  215.     /** 
  216.      * 子弹的飞行 
  217.      * 
  218.      */  
  219.     public void ballFly(){  
  220.         if(balls == null)  
  221.             return ;  
  222.         for(int i = 0; i < balls.size(); i++){  
  223.             Ball ball = (Ball) balls.elementAt(i);  
  224.             ball.fly();  
  225.         }  
  226.     }  
  227.       
  228.     /** 
  229.      * 飞机的动作 
  230.      * 
  231.      */  
  232.     public void heroAction(){  
  233.         checkHeroIsExists();  
  234.         int keyCode = this.getKeyStates();  
  235.            
  236.         switch(keyCode){  
  237.         case Platform.KEY_LEFT: hero.moveLeft(); break;  
  238.         case Platform.KEY_RIGHT: hero.moveRight(); break;  
  239.         case Platform.KEY_UP: hero.moveUp(); break;  
  240.         case Platform.KEY_DOWN: hero.moveDown(); break;  
  241.         case Platform.KEY_FIRE: genaratorBall(); break;  
  242.         }  
  243.     }  
  244.   
  245.     /** 
  246.      * 创建子弹 
  247.      * 
  248.      */  
  249.     private void genaratorBall() {  
  250.        
  251.         if(this.genaratBallTime == 3){  
  252.             checkHeroIsExists();  
  253.               
  254.             BallManager.addBall(BallManager.genarator(hero.getX(), hero.getY()));  
  255.             BallManager.clearBallsIsOut();  
  256.             balls = BallManager.getBalls();  
  257.             genaratBallTime = 0;  
  258.         }  
  259.           
  260.         genaratBallTime++;  
  261.           
  262.           
  263.     }  
  264.   
  265.     private void checkHeroIsExists() {  
  266.         if(hero == null){  
  267.             throw new java.lang.NullPointerException("Hero is Null");  
  268.         }  
  269.     }  
  270.   
  271.     /** 
  272.      * 游戏的run。控制游戏个各个方面 
  273.      * 
  274.      */  
  275.     public void run(){  
  276.         this.collides();  
  277.         this.heroAction();  
  278.         this.ballFly();  
  279.         this.genaratorFoe();  
  280.         this.foeFly();  
  281.           
  282.         this.drawGame();  
  283.         this.setKeyStates(1000);  
  284.     }  
  285. }  


代码就是上面的,如果有什么好的建议,请评论。下面的一课,我将介绍GameThread。
分享到:
评论
12 楼 wuhua 2006-12-06  
spartak 写道
fins 写道
刚才又重新证实了一下
cod s40确实没混淆
现在上传给大家 感兴趣的下来反编译吧 研究研究吧 (我是没研究过 只是粗略的看了一点)
能学到不少东西。

我以前研究过另外一个国外的rpg游戏的代码 忘了叫什么了 没找到 无法上传给大家了


1000多个你挨个试,我真佩服


^_^。一人进入狂热的状态是这样子的。
我觉得你也可以达到这样的高度
11 楼 spartak 2006-12-05  
fins 写道
刚才又重新证实了一下
cod s40确实没混淆
现在上传给大家 感兴趣的下来反编译吧 研究研究吧 (我是没研究过 只是粗略的看了一点)
能学到不少东西。

我以前研究过另外一个国外的rpg游戏的代码 忘了叫什么了 没找到 无法上传给大家了


1000多个你挨个试,我真佩服
10 楼 wuhua 2006-12-05  
fins 写道
刚才又重新证实了一下
cod s40确实没混淆
现在上传给大家 感兴趣的下来反编译吧 研究研究吧 (我是没研究过 只是粗略的看了一点)
能学到不少东西。

我以前研究过另外一个国外的rpg游戏的代码 忘了叫什么了 没找到 无法上传给大家了



称着现在无聊与有时间,我研究研究别人是怎么做的。谢谢兄弟共享。
以后如有机会大家成立一个游戏项目,一起开放玩玩。
虽然我刚入门,不过想想也还是可以帮助大家的。
呵呵
9 楼 lordhong 2006-12-05  
是啊,一直想做个三国的游戏...-.-#可惜至今仍在玩KOEI的系列...鄙视一下...  fins的几个建议都很好.  J2ME是效率性能第一,编程美观就靠边吧...哈哈,怎么快就怎么做.
8 楼 fins 2006-12-04  
wuhua 写道
原来你狂热的学习啊
佩服

谈不上狂热 就是总想编游戏
从小学那会 第一次用basic开始 就梦想着自己遍游戏
但却离那条路越来越远(超级讨厌数学和c语言 呵呵 虽然小时候学的很好 哈哈 自夸一下)
感谢j2me 让我找到了一个简单便捷的重拾梦想的机会(呵呵 说实话 用j2me编游戏真的不难,难的是编好游戏 这点没人反对吧 呵呵)
7 楼 fins 2006-12-04  
刚才又重新证实了一下
cod s40确实没混淆
现在上传给大家 感兴趣的下来反编译吧 研究研究吧 (我是没研究过 只是粗略的看了一点)
能学到不少东西。

我以前研究过另外一个国外的rpg游戏的代码 忘了叫什么了 没找到 无法上传给大家了

6 楼 wuhua 2006-12-04  
原来你狂热的学习啊
佩服
5 楼 fins 2006-12-04  
我也没弄过商业游戏
对于商业游戏的接触只是反编译过一些游戏的代码
他们中绝大多数代码混淆了 但是有的却没有
当初我是弄了 1000多个国外的比较优秀的j2me游戏
里面有20多个没混淆 这个只能靠运气了 同一家公司的作品都是有的混有的没混
我印象中 s40版的 call of duty没有混淆 可以学习

4 楼 wuhua 2006-12-04  
楼主见解深刻
受教了。有空一起探讨下商业游戏的制作。
3 楼 fins 2006-12-04  
提几个小建议:
以下这些绝对不是我自己瞎想出来的
也是从各个高手那里学来的
不知道对楼主是否有帮助
:)


1 为了减少循环次数
将绘制敌机 绘制hero子弹 判断敌机与hero子弹是否碰撞
放到一个方法里
这样一个双层循环就可以搞定一切,同时还可以减少不必要的绘制
虽然 for循环内if的次数增多 会损失些性能
但和带来的性能提升比 可以忽略

2 避免使用 Stack 改用数组
敌机数量 子弹数量不是固定的
但是同时产生的数量是有上限的 所以做一个足够大的数组(通常64或128就足够了) 这样对性能也是有好处的

如果一个关卡中有1000个敌人
但1000个肯定不是同时生成的 可以每128个生成一次
如果怕中间有断档 可以利用双数组。


3 使用递减的循环 不要使用递增的循环
例如遍历子弹 请使用:
for(int i = balls.size()-1; i>=0;i--){
}

原因:速度更快,这点速度在pc上可以忽略,在手机上不可以

4 多使用2的幂作为常量 这样可以更好的利用位运算
例如 飞机的大小不要 10*5 可以做成 8*4 以次类推

5 解藕的思想在j2me里很多时候是反对的
原因很简单 过多的类 和类之间的调用对性能有损伤。
所以oo在j2me里只能适当的使用。
如果多看看商业j2me游戏的源代码就可以发现,他们都使用了“超级类”(一个大类,里面几乎做了所有的事情)

呵呵 先说这些吧
毕竟楼主这个是个简单的入门程序 涉及的东西比较少
而且为了便于大家理解 楼主肯定也没有考虑太多复杂的东西

以后希望可以和楼主以及所有喜欢游戏编程的朋友继续切磋
其实我相信,任何一个男程序员 心里都有一个编写游戏的情结 都有一颗游戏的心 一个游戏的梦
大家不要让结断 心死 梦破碎啊

加油 加油!





2 楼 wuhua 2006-12-04  
呵呵。兄弟这么仔细啊。佩服
1 楼 lordhong 2006-12-04  
“checkHeroIsExists(); ”

语法错误了。。。Exists就不需要Is了。。。
要用Is就该成checkHeroIsPresent。。。

相关推荐

    雷电游戏 飞机大战 MFC版

    《雷电游戏 飞机大战 MFC版》是一款基于微软基础类库(MFC,Microsoft Foundation Classes)开发的经典飞行射击游戏,具有丰富的视觉效果和流畅的游戏体验。在这个项目中,开发者利用MFC的强大功能,构建了一个具备...

    网页版 雷电游戏

    3. `game.js`: 主要的JavaScript游戏逻辑文件,处理游戏的各个功能。 4. `images/`: 图像资源文件夹,存储游戏中的图片和图标。 5. `sounds/`: 声音资源文件夹,包含游戏音效和背景音乐。 在开发过程中,开发者还...

    Java小游戏Java雷电游戏Java小游戏Java雷电游戏Java小游戏Java雷电游戏Java小游戏Java雷电游戏

    在雷电游戏中,通常有两到三个线程:一个用于游戏逻辑(如飞机移动、子弹飞行、敌机生成),一个用于渲染屏幕更新,还有一个可能用于处理用户输入。使用Thread类或Runnable接口可以创建并管理这些线程,保证游戏的...

    Game(雷电).zip

    《雷电》是一款基于Java语言开发的简单游戏,它的存在为初学者提供了一个学习编程的绝佳实例。在Java编程世界中,游戏开发是一项常见的实践项目,因为它能够将理论知识与实际应用相结合,帮助开发者更好地理解和掌握...

    Java 雷电游戏简单版

    3. **游戏循环**:游戏的核心是游戏循环(Game Loop),它不断更新游戏状态并绘制新帧。Java中通常用`while`或`do-while`循环来实现。 4. **对象动画**:游戏中的飞机、子弹和敌人需要动起来。这涉及到坐标系统和...

    触屏Java游戏 雷电ⅱ.jar(含截图+源代码 )

    触屏Java游戏 雷电ⅱ.jar(含截图+源代码 )触屏Java游戏 雷电ⅱ.jar(含截图+源代码 )触屏Java游戏 雷电ⅱ.jar(含截图+源代码 )触屏Java游戏 雷电ⅱ.jar(含截图+源代码 )触屏Java游戏 雷电ⅱ.jar(含截图+源...

    vc6开发类似雷电游戏源码

    在"vc6开发类似雷电游戏源码"中,"GameEngine"类很可能是实现这些功能的关键模块。GameEngine类可能包含了游戏循环、对象管理、碰撞检测、游戏状态切换等核心算法。开发者需要对数据结构、算法和面向对象编程有深入...

    基于java的雷电游戏

    基于java的雷电游戏基本功能包括:敌方飞机随机飞行、我方飞机手动控制飞行,射击比拼,游戏闯关等。本系统结构如下: (1)雷电游戏状态调整功能: 在游戏启动时,游戏会自动进行初始化的验证。 若初始化成功后...

    JAVA雷电小游戏

    【JAVA雷电小游戏】是一款基于Java编程语言开发的休闲小游戏,设计灵感来源于经典的"雷电"系列。在这款游戏中,玩家将控制一架飞机在屏幕上移动,躲避敌机和障碍物,同时打击目标以获得分数。游戏的核心编程理念是...

    java雷电游戏程序

    【Java雷电游戏程序】是一款基于Java编程语言开发的仿制经典街机游戏"雷电"的项目。这个程序展示了如何使用Java进行游戏开发,涵盖了图形用户界面(GUI)、对象动画、碰撞检测以及游戏逻辑等多个方面的知识。 首先...

    android 雷电游戏源码

    【标题】"Android 雷电游戏源码" 涉及到的Android开发关键知识点主要包括以下几个方面: 1. **游戏引擎与框架**:虽然没有明确指出使用了哪种游戏引擎,但开发一个游戏通常需要一个基础框架。Android游戏开发中常见...

    简单雷电游戏源码

    【简单雷电游戏源码】是一款适用于初学者和游戏开发者的学习资源,主要用于课程设计和实践项目。这个源码实现了一个简化版的雷电游戏,它包含关卡设计和BOSS战斗元素,为学习游戏开发提供了丰富的实践素材。下面将...

    基于android的雷电小游戏

    在Android平台上开发游戏,尤其是像“雷电”这样的经典射击游戏,涉及到许多关键的技术点和设计思路。让我们深入探讨一下这个基于Android的雷电小游戏所涵盖的IT知识点。 首先,我们要理解Android应用开发的基础...

    android雷电的游戏框架

    《Android雷电游戏框架详解》 在Android平台上开发游戏,开发者常常会利用各种游戏框架来提升效率和优化性能。本文将深入探讨一款名为"雷电游戏框架"的项目,它是一个基于MVC(Model-View-Controller)架构设计的...

    简易雷电小游戏

    《简易雷电小游戏》是一款基于C# WinForm平台开发的小型游戏,主要涉及了游戏编程的基本元素和交互设计。这个游戏的核心玩法是控制飞机躲避陨石并发射子弹进行攻击,通过键盘上的上下左右键来移动飞机,使用W键发射...

    java程序设计大作业-雷电飞机射击游戏(Java)

    java程序设计大作业——雷电飞机射击游戏(Java)java程序设计大作业——雷电飞机射击游戏(Java)java程序设计大作业——雷电飞机射击游戏(Java)java程序设计大作业——雷电飞机射击游戏(Java)java程序设计大...

    android雷电射击游戏源码

    这不仅对于想要入门Android游戏开发的新手来说是一份宝贵的资料,也是有一定基础的开发者提升技术能力的良好实践。 首先,源码中的`Chapter16_Game_Pro`可能代表游戏项目是按照章节逐步展开的,第16章可能是关于...

    C语言仿雷电_游戏、雷电、C语言_

    标题中的"C语言仿雷电"指的是使用C语言编程实现的一款基于雷电游戏风格的小游戏。雷电游戏,通常称为飞行射击游戏,玩家控制一架飞机在屏幕中躲避敌机和子弹,同时攻击敌人。这种类型的游戏以其快节奏和刺激性而受到...

    Java雷电小游戏

    【Java雷电小游戏】是一款基于Java编程语言开发的娱乐项目,它再现了经典的街机游戏——雷电的玩法,融入了独特的boss战斗环节,为玩家提供了丰富的游戏体验。这款小游戏展示了Java在游戏开发领域的应用,同时也体现...

    Java游戏_雷电源码

    《Java游戏:雷电源码详解》 在编程领域,Java是一种广泛应用的编程语言,尤其在游戏开发中也有其独特的优势。本项目名为“Java游戏_雷电源码”,它是一个由个人独立开发的小型游戏,旨在展示Java在游戏设计中的...

Global site tag (gtag.js) - Google Analytics