- wuhua
- 等级:
- 性别:
- 文章: 634
- 积分: 1688
- 来自: 广州
|
这里介绍的是Game的逻辑类,主要控制游戏的动作,以及绘制。
详细里面代码有注释
java 代码
-
-
-
-
-
- package org.wuhua.battleplan;
-
- import java.util.Stack;
-
- import javax.microedition.lcdui.Graphics;
- import javax.microedition.lcdui.Image;
-
- import org.wuhua.game.GameCanvas;
- import org.wuhua.game.model.Fairy;
- import org.wuhua.game.util.Log;
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- public class Game extends GameCanvas {
- static Log log = Log.getLog("Game");
- private Hero hero;
-
- private Stack balls;
- private Stack foes;
-
- private Stack balst;
-
-
-
- private int balstIndex;
-
-
-
-
- private int genaratBallTime;
-
- private int genaratFoeTime;
-
-
- Game(){
- super();
- this.setFullScreenMode(true);
- }
-
- void init(){
-
- WIDTH = getWidth();
- HEIGHT = getHeight();
- log.debug("WIDTH=" + WIDTH);
- log.debug("hegiht=" + HEIGHT);
- this.bufferImage = Image.createImage(WIDTH, HEIGHT);
-
- Platform.WIDTH = this.getWidth();
- Platform.HEIGHT = this.getHeight();
-
-
- hero = Hero.createHero(Platform.WIDTH/2, Platform.HEIGHT -30);
-
- balst = new Stack();
-
- }
-
-
-
-
-
-
- void genaratorBalst(int x, int y){
- balst.addElement(new Fairy(Resources.BLAST[0], x, y));
- balst.addElement(new Fairy(Resources.BLAST[1], x, y));
- balst.addElement(new Fairy(Resources.BLAST[2], x, y));
- balst.addElement(new Fairy(Resources.BLAST[3], x, y));
- balst.addElement(new Fairy(Resources.BLAST[4], x, y));
- }
-
-
-
-
-
-
-
- void collides(){
- if(balls == null
- || foes == null)
- return ;
- for(int i = 0; i < balls.size(); i ++){
- Ball b = (Ball) balls.elementAt(i);
- for(int j =0; j < foes.size(); j ++){
- Foe f = (Foe) foes.elementAt(j);
- if(b.collidesWith(f)){
- this.genaratorBalst(f.getX(), f.getY());
- balls.removeElement(b);
- foes.removeElement(f);
- return;
- }
-
- }
- }
- }
-
-
-
-
-
- void drawGame(){
- if(Platform.HEIGHT < this.getHEIGHT()){
- Platform.HEIGHT = this.getHEIGHT();
- }
-
- Graphics g = this.getGraphics();
- if(g == null)
- return;
- fillFullScreen(g,0x349293);
- paintHeroAndBall(g);
-
- paintFoe(g);
-
- paintBalst(g);
- this.flushGraphics();
- }
-
-
-
-
-
- private void paintBalst(Graphics g) {
-
- if(balst == null
- || balst.size() == 0)
- return;
-
- Fairy bf = (Fairy) balst.elementAt(balstIndex);
- bf.paint(g);
- if(balstIndex >= 4){
- balstIndex = 0;
- balst.removeAllElements();
- }
-
- balstIndex++;
- }
-
-
-
-
-
- private void paintFoe(Graphics g) {
- if(foes == null)
- return ;
- for(int i=0; i < foes.size(); i++){
- Foe foe = (Foe) foes.elementAt(i);
- foe.paint(g);
- }
-
- }
-
-
-
-
-
- public void genaratorFoe(){
- if(this.genaratFoeTime == 5){
- FoeManager.addFoe(FoeManager.genarator());
- FoeManager.clearFoesIsOut();
- foes = FoeManager.getFoes();
- genaratFoeTime = 0;
- }
-
- genaratFoeTime++;
- }
-
-
-
-
-
- public void foeFly(){
- if(foes == null)
- return ;
- for(int i = 0; i < foes.size(); i++){
- Foe foe = (Foe) foes.elementAt(i);
- foe.fly();
- }
- }
-
- private void paintHeroAndBall(Graphics g) {
- hero.paint(g);
- paintBalls(g);
- }
-
-
-
-
-
- private void paintBalls(Graphics g) {
- if(balls == null)
- return ;
- for(int i = 0; i < balls.size(); i++){
- Ball ball = (Ball) balls.elementAt(i);
- ball.paint(g);
- }
-
- }
-
-
-
-
-
- public void ballFly(){
- if(balls == null)
- return ;
- for(int i = 0; i < balls.size(); i++){
- Ball ball = (Ball) balls.elementAt(i);
- ball.fly();
- }
- }
-
-
-
-
-
- public void heroAction(){
- checkHeroIsExists();
- int keyCode = this.getKeyStates();
-
- switch(keyCode){
- case Platform.KEY_LEFT: hero.moveLeft(); break;
- case Platform.KEY_RIGHT: hero.moveRight(); break;
- case Platform.KEY_UP: hero.moveUp(); break;
- case Platform.KEY_DOWN: hero.moveDown(); break;
- case Platform.KEY_FIRE: genaratorBall(); break;
- }
- }
-
-
-
-
-
- private void genaratorBall() {
-
- if(this.genaratBallTime == 3){
- checkHeroIsExists();
-
- BallManager.addBall(BallManager.genarator(hero.getX(), hero.getY()));
- BallManager.clearBallsIsOut();
- balls = BallManager.getBalls();
- genaratBallTime = 0;
- }
-
- genaratBallTime++;
-
-
- }
-
- private void checkHeroIsExists() {
- if(hero == null){
- throw new java.lang.NullPointerException("Hero is Null");
- }
- }
-
-
-
-
-
- public void run(){
- this.collides();
- this.heroAction();
- this.ballFly();
- this.genaratorFoe();
- this.foeFly();
-
- this.drawGame();
- this.setKeyStates(1000);
- }
- }
代码就是上面的,如果有什么好的建议,请评论。下面的一课,我将介绍GameThread。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
返回顶楼 |
|
|
- lordhong
- 等级:
- 性别:
- 文章: 4672
- 积分: 2737
- 来自: 在野
|
“checkHeroIsExists(); ”
语法错误了。。。Exists就不需要Is了。。。 要用Is就该成checkHeroIsPresent。。。
|
返回顶楼 |
|
|
- wuhua
- 等级:
- 性别:
- 文章: 634
- 积分: 1688
- 来自: 广州
|
呵呵。兄弟这么仔细啊。佩服
|
返回顶楼 |
|
|
- fins
- 等级: 资深会员
- 性别:
- 文章: 3196
- 积分: 2953
- 来自: 小胖儿的大城
|
提几个小建议:
以下这些绝对不是我自己瞎想出来的
也是从各个高手那里学来的
不知道对楼主是否有帮助
:)
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游戏的源代码就可以发现,他们都使用了“超级类”(一个大类,里面几乎做了所有的事情)
呵呵 先说这些吧
毕竟楼主这个是个简单的入门程序 涉及的东西比较少
而且为了便于大家理解 楼主肯定也没有考虑太多复杂的东西
以后希望可以和楼主以及所有喜欢游戏编程的朋友继续切磋
其实我相信,任何一个男程序员 心里都有一个编写游戏的情结 都有一颗游戏的心 一个游戏的梦
大家不要让结断 心死 梦破碎啊
加油 加油!
|
返回顶楼 |
|
|
- wuhua
- 等级:
- 性别:
- 文章: 634
- 积分: 1688
- 来自: 广州
|
楼主见解深刻 受教了。有空一起探讨下商业游戏的制作。
|
返回顶楼 |
|
|
- fins
- 等级: 资深会员
- 性别:
- 文章: 3196
- 积分: 2953
- 来自: 小胖儿的大城
|
我也没弄过商业游戏
对于商业游戏的接触只是反编译过一些游戏的代码
他们中绝大多数代码混淆了 但是有的却没有
当初我是弄了 1000多个国外的比较优秀的j2me游戏
里面有20多个没混淆 这个只能靠运气了 同一家公司的作品都是有的混有的没混
我印象中 s40版的 call of duty没有混淆 可以学习
|
返回顶楼 |
|
|
- wuhua
- 等级:
- 性别:
- 文章: 634
- 积分: 1688
- 来自: 广州
|
原来你狂热的学习啊 佩服
|
返回顶楼 |
|
|
- fins
- 等级: 资深会员
- 性别:
- 文章: 3196
- 积分: 2953
- 来自: 小胖儿的大城
|
刚才又重新证实了一下
cod s40确实没混淆
现在上传给大家 感兴趣的下来反编译吧 研究研究吧 (我是没研究过 只是粗略的看了一点)
能学到不少东西。
我以前研究过另外一个国外的rpg游戏的代码 忘了叫什么了 没找到 无法上传给大家了
|
返回顶楼 |
|
|
- fins
- 等级: 资深会员
- 性别:
- 文章: 3196
- 积分: 2953
- 来自: 小胖儿的大城
|
wuhua 写道 原来你狂热的学习啊
佩服
谈不上狂热 就是总想编游戏
从小学那会 第一次用basic开始 就梦想着自己遍游戏
但却离那条路越来越远(超级讨厌数学和c语言 呵呵 虽然小时候学的很好 哈哈 自夸一下)
感谢j2me 让我找到了一个简单便捷的重拾梦想的机会(呵呵 说实话 用j2me编游戏真的不难,难的是编好游戏 这点没人反对吧 呵呵)
|
返回顶楼 |
|
|
- lordhong
- 等级:
- 性别:
- 文章: 4672
- 积分: 2737
- 来自: 在野
|
是啊,一直想做个三国的游戏...-.-#可惜至今仍在玩KOEI的系列...鄙视一下... fins的几个建议都很好. J2ME是效率性能第一,编程美观就靠边吧...哈哈,怎么快就怎么做.
|
返回顶楼 |
|
|