找回密码
 FreeOZ用户注册
查看: 6804|回复: 29

[论坛技术] Android坦克大战游戏设计解析(连载)

[复制链接]
发表于 16-8-2010 00:43:22 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?FreeOZ用户注册

x
在前文曾经写过Java坦克大战游戏设计,但是后来由于没有时间,就没写完,最近,计划将地图开发包移植到Android平台。因此需要对Android平台进行学习,在看过Android开发指南后,对Android平台有了一些了解,但是还是无实战经验,学习一个平台最好的办法是通过一个项目,也就是通过编程来学习一个新的移动开发平台。因此想起几年前在Java ME平台上写的坦克大战游戏,这个一个既有趣以能充分了解一个新平台的项目。而且通过两个平台的比较,也就更好的理解Android平台开发的一些特点。
下图是Java ME平台下坦克大战的界面效果图。

                               
登录/注册后可看大图

在移植到过程中,发现尽管Android,和Java ME都是以Java为开发语言的手机平台,两都之间的差异还是不少的,但好处是,两者都采用Java语言,相当一部分与平台无关(如除图形,网络之类)的代码是可以通用的,这大大减少了从Java ME到Android平台移植的工作量。
这里先给出一些移植过程中的总结,后续文章将较详细的说明坦克大战游戏的设计过程(适用于各个平台)。
1. Android应用一般无主程序入口,但对于单Activity的应用来说,Activity相当于Java ME的 Midlet.
2. Android中View的概念类同于其它平台中Control的,ViewGroup相当于Container. 当然它也可以用作一个窗口View,在移植的过程中,采用单Activity,多窗口View的方法来对应于Java ME的Midlet和多个Displayable类.
3. Android绘制图形时,没有一般图形库中提供的Pen, Brush类,设置Pen和Brush,字体都是通过Paint类来设置的,对于初学者一开始会觉得有些困惑。
4. Rect 一般是通过left,top, bottom, right来定义,而Java ME平台是通过left, top, width, height,如果不注意,会造成意想不对结果:-),如android 平台中canavs.drawRect, 以及canvas.clipRect 是通过left,top, bottom, right来定义一个四边形,而Java ME是通过left,top及宽度,高度来定义,移植过程如果不注意就出错了。
5. Android在非UI 线程中更新Canvas里,需要调用postInvalidate, view.invalidate 相当于 Jave ME中 Canvas 的repaint.
  如果想在非UI线程执行和UI相关的方法,一般是通过hander.post 来实现,而与这对应的 Java ME是display  的callSerially.
6. Android中提供一个SurfaceView类,允许在使用另一个thread来更新Canvas,这对于游戏的图形的刷新性能提高非常重要。
7. Android没有提供类似Java ME中的Game API,但是实现或是移植一个类似的Game API也不困难,Android坦克大战游戏中移植了Java ME Game API中Layer, LayerManager,TiledLayer,Sprite类,使得整个移植工作变得非常顺利。
总体感觉Android平台相对来说还是比较容易上手,对于会Java或是C#的程序员,即使以前没有从事过手机软件开发,也是比较容易入门的。而且Android平台和Java SE有相当一部分类是公用的,也是二进制兼容的,也就是说在Java SE平台上的类库(.jar)文件,可以直接用在Anroid平台,这里先给出一个移植后的截图。后面将详细说明这个游戏的设计,最后会给出所有源码,有兴趣的朋友可以扩展成联网游戏或是作为学习游戏设计的参考,坦克大战游戏是一个中等难度的游戏,对于有志从事手机游戏开发的朋友,可以自行写个坦克大战游戏后基本就能入门手机软件开发。

[ 本帖最后由 trisun 于 15-8-2010 23:55 编辑 ]
androidtank.png

评分

参与人数 3威望 +130 收起 理由
coredump + 50 你太有才了!
ubuntuhk + 50 你太有才了!
清风不写字 + 30 谢谢分享!

查看全部评分

回复  

使用道具 举报

 楼主| 发表于 16-8-2010 00:44:03 | 显示全部楼层

Android坦克大战游戏设计解析二

Java ME中提供了一个Game API (javax.microedition.lcdui.game).大大方便了程序员在移动平台上开发复杂游戏。一般的游戏可以分为游戏人物及背景,可以将游戏场景分成多个层次。在Java ME Game API中提供了几个类。

                               
登录/注册后可看大图

Layer类,该类为一抽象类,提供了游戏人物及背景的层次的基本构架,它代表了游戏场景中一个可视化的元素,如游戏人物(Sprite)或是分片背景(TiledLayer).
Sprite类,为一个基本动画游戏人物,它可以显示多个动画帧中其中一帧,比如人向前,向后,向左,向右,坦克大战游戏中各种坦克就是一个sprite类对象,它可以显示坦克向四个方向移动的图象,并可很容易实现动态效果,如坦克履带移动的动态效果。它也支持了各种碰撞检测,比如子弹击中坦克,或是打中砖块等等。
TiledLayer类,一般用作显示游戏背景,为了能显示范围较大的背景,一般游戏背景地图可以通过小的图片拼接而成。TiledLayer用于实现由一个二维cell (分片地图)组成背景,这个类也提供了动态背景的支持,比如,坦克大战背景中水面的动态效果。
LayerManager 类用于管理多个Layer ,sprite,及TiledLayer都是Layer的子类。在坦克大战游戏中,LayerManager用来管理坦克及背景,TiledLayer 及sprites在LayerManager管理下有层次的关系(Z-Order),前面的Layer会遮挡后面的Layer.
而Andorid中没有提供 Game API,如果大家看过Android例子中snake的实现,其中 TileView的功能类似于 Game API中TiledLayer. 为了使减少移植工作,第一步是将Java ME中 Game API移植到 Android平台。
移植是基于microemulator中相应代码,移植工作量不大。在后面会提供移植后源码。

[ 本帖最后由 trisun 于 7-9-2010 00:50 编辑 ]
gameapi.png
回复  

使用道具 举报

 楼主| 发表于 16-8-2010 00:44:21 | 显示全部楼层

Android坦克大战游戏设计解析三

游戏中使用图象及声音资源
坦克大战游戏中用到游戏资源(音效及图片)来自网络。
这里先对游戏用到的资源做个说明
音效 snd1--snd2 格式为 midi 用于过场音乐及字弹发射及爆炸音效。
图片
img1 - img5 为游戏中各种坦克,物体的分解图片。
其中 img1 由下面图片组成
   各种增强宝贝 (最左边两个是家,和炸毁的家),依次为加一辆,定时器等等
   坦克或子弹爆炸动画效果
      子弹(四个方向飞行)
     我方坦克动画(四个方向及履带动态效果),最右方为无敌时状态
多种敌方坦克
img2 由下列图片组成
     雪地
     砖块
     树林
    水面 (两片可以形成水面动态效果)
      石头(一般情况下不能被坦克打穿)
img 3 由下列图片组成
   开始画面
分数画面
  显示玩家剩余坦克数
     显示剩余敌方坦克数

img4由下列图片组成
     显示分数



     显示第几关
img5由下列图片组成


imgX 格式为这些PNG图片连接而成。如何读取请参见代码中的ResourceManager ,这些图片可以在程序包中的Resources目录中找到,代码中实际用到的资源snd1-snd5,img1-img5 在 src 目录下。

图片及音效链接请叁见  http://blog.csdn.net/guidebee/archive/2010/09/06/5867287.aspx

或下载附件

[ 本帖最后由 trisun 于 7-9-2010 00:49 编辑 ]

resources.zip

200.76 KB, 下载次数: 68

回复  

使用道具 举报

 楼主| 发表于 16-8-2010 00:44:36 | 显示全部楼层

Android坦克大战游戏设计解析四

有了游戏所需的图象及声音资源后,下面就可以开始定义游戏中的各种角色。为了方便起见,坦克大战游戏中定义了一个角色接口。
  1. public interface Actor{

  2. ////////////////////////////////////////////////////////////////////////////

  3. /**
  4. * Operation be done in each tick.
  5. */
  6. void tick();
  7. }
复制代码
该接口有一个tick方法,为每个游戏帧该角色所要完成的动作,比如说背景可能要更换图形以形成动画效果(如水面波浪)。坦克可以完成前面一步,子弹飞行等等。
坦克大战游戏中定义了背景类BattleField ,子弹Bullet,各种坦克类(Tank, PlayTank, EnemyTank, FastTank, HeavyTank, SimpleTank,  PlayerTank,SmartTank) , 升级法宝Powerup,以及动态显示的分数Score类,都实现了Actor接口。
而这些角色类同时又是Game API中 Layer的子类。因些游戏逻辑比较简单,下面代码是GameScene中线程Run的方法,为游戏进行时主线程
  1. public void run(){
  2.     Thread currentThread = Thread.currentThread();

  3.     try {
  4.         while (currentThread == animationThread) {
  5.         long startTime = System.currentTimeMillis();
  6.         // Don't advance game or draw if canvas is covered by a system
  7.         // screen.
  8.         if (isShown()) {
  9.            tick();
  10.         if(hasSurface){
  11.            Canvas canvas=holder.lockCanvas();
  12.            updateGame(canvas);
  13.            holder.unlockCanvasAndPost(canvas);
  14.         }
  15.        }
  16.       timeTaken = System.currentTimeMillis() - startTime;
  17.       if (timeTaken < MILLIS_PER_TICK) {
  18.         synchronized (this) {
  19.           if(MILLIS_PER_TICK > timeTaken){
  20.          wait(MILLIS_PER_TICK - timeTaken);
  21.          timeTaken = System.currentTimeMillis() - startTime;
  22.       }
  23.      }
  24.   } else {
  25.         Thread.yield();
  26.     }
  27. }
  28.    } catch (InterruptedException e) {
  29. }

  30. }
复制代码
而其中的tick()方法就是调用游戏中所有角色的tick()方法:
  1. private void tick(){

  2. for(int i=0;i<TOTALLAYERS;I++){
  3. Layer layer=layerManager.getLayerAt(i);
  4. if(layer.isVisible()){
  5. Actor actor=(Actor)layer;

  6. actor.tick();
  7. }
  8. }
  9. applyGameLogic();
  10. }
复制代码
这样参与游戏中的各个角色完成自已每帧所需要更新,整个游戏就动起来了。

                               
登录/注册后可看大图

在后面的文章将主要介绍各个角色类的基本实现方法。

[ 本帖最后由 trisun 于 10-9-2010 00:28 编辑 ]
回复  

使用道具 举报

 楼主| 发表于 16-8-2010 00:44:50 | 显示全部楼层

Android坦克大战游戏设计解析五

本篇介绍坦克大战游戏场景类BattleField的设计思路。

BattleField 是Game API中TiledLayer的子类。TiledLayer实现了由小的图形(称为tile)拼接成大的背景,坦克大战游戏的背景是由砖块,石块,树林,水面,雪地等小的图片拼接而成。TiledLayer可以很容易的实现这种类型的背景,包括水面波汶的动态效果。

下面的图片是一个简单由多个小tile组成的游戏背景。

                               
登录/注册后可看大图

理论上TiledLayer可以实现无限大的背景。为简单起见坦克大战游戏中采用了半随机的方法来生成游戏背景,同时也提供了从文件读取游戏背景的方法,如果想完全复现FC的每一关,可以使用地图编辑器或是文本编辑器生成文件,然后从文件中读取背景。

这里给出一个关口的例子文件。
  1. 0000000000000
  2. 0202020202020
  3. 0202020202020
  4. 0202026202020
  5. 0202020202020
  6. 0000020200000
  7. 6022000002206
  8. 0000020200000
  9. 0202020202020
  10. 0202020202020
  11. 0202000002020
  12. 0000000000000
复制代码
其中0代表空白,1代表雪地,2代表砖块,3代表树林,4,5代表水面,6代表石块。由于每个tile比较小,这里每个数据代表一个2X2的区块,下面代表实现从文件生成游戏背景。
  1. /**
  2.      * Read the battle from an input stream.
  3.      * @param is input stream stores the battle field information.
  4.      */
  5.     private void readBattlefield(java.io.InputStream is) throws IOException {
  6.         int c = -1;
  7.         int x0 = (WIDTH_IN_TILES-NUMBER_IN_TILES)/2;
  8.         int y0 = (HEIGHT_IN_TILES-NUMBER_IN_TILES)/2;
  9.         int x=0,y=0;
  10.         while ((c = is.read()) != -1 && y < NUMBER_IN_TILES) {
  11.             switch (c) {
  12.                 case ' '://empty
  13.                 case '0':
  14.                     duplicateCell(x+x0, y+y0, 0);x+=2;
  15.                     break;
  16.                 case '1'://snow field
  17.                     duplicateCell(x+x0, y+y0,SNOW);x+=2;
  18.                     break;
  19.                 case '2'://brick wall
  20.                     duplicateCell(x+x0, y+y0, BRICK_WALL);x+=2;
  21.                     break;
  22.                 case '3'://forest
  23.                     duplicateCell(x+x0, y+y0, FOREST);x+=2;
  24.                     break;
  25.                 case '4':
  26.                 case '5'://water
  27.                     duplicateCell(x+x0, y+y0, -1 - ((x ^ y) & 1));x+=2;
  28.                     break;
  29.                 case '6': //Concrete wall
  30.                     duplicateCell(x+x0, y+y0, CONCRETE_WALL);x+=2;
  31.                     break;
  32.                 case '\n'://new line
  33.                     y+=2;
  34.                     x = 0;
  35.                     break;
  36.                 default:
  37.             }
  38.         }
  39.     }
复制代码
实现在游戏中采用了半随机的方法,这样游戏关卡可以有无限多,半随机是指一半的砖块是从HZK16(16点阵汉字库)读取一个汉字,用其点阵显示为砖块,其它雪地,树林等采用随机数随机分布在游戏场景中。前几关的汉字是“引路蜂软件”。

坦克大战游戏中还会随机出现一些增强法宝,比如定时器可以让敌方坦克停止运动,地雷可以使屏幕中敌方坦克全部炸毁。铁锹可以让“家”全部被石块包住从而使敌方子弹无法打穿。星星可以让已方坦克加速,同时发射的子弹数增加并增加打击能力(比如可以打穿石块甚至树林等等)。

所以BattleField中同时也定义了显示PowerUp(增强法宝),初始化敌方坦克位置(一般是从最上方的左,中,右依次出现)。另外还要判断某个位置坦克是否可能通过(有砖块,石头,水面不能通过),雪地要加速,其它地方可以通行。另外还要判断子弹是否击中墙壁(子弹击中墙壁后要爆炸等等)。

最后来看看它的tick()中主要做些什么:
  1. public void tick() {
  2.         int tickState = (tickCount++ >> 3); // slow down x8
  3.         int tile = tickState % 2;
  4.         setAnimatedTile(-1 - tile, waterFrames[tile][(tickState % 4) / 2]);
  5.         if(concreteWallStartTime>0){
  6.             long tickTime=System.currentTimeMillis();
  7.             if(tickTime-concreteWallStartTime>concreteWallPeriod){
  8.                 makeHomeBrickWall();
  9.                 concreteWallStartTime=0;
  10.             }
  11.         }
  12.     }
复制代码
它主要显示水面的动态效果,如果当前需要显示石块做的家,则将相应的cell中填入石块,由于宝贝有时效性,到了一定时间后将“家”变回普通砖块做成。

[ 本帖最后由 trisun 于 10-9-2010 00:28 编辑 ]
tiles.gif
回复  

使用道具 举报

 楼主| 发表于 16-8-2010 00:45:05 | 显示全部楼层

Android坦克大战游戏设计解析六

本篇介绍坦克大战游戏除坦克之外的几个角色。

1. Bullet 子弹类        坦克发射出的子弹在游戏中飞行

2.Explosion 爆炸类   子弹击中子弹,障碍物,或是坦克显示爆炸

3. Powerup 增强宝贝类  星星,加坦克,定时器等

4. Score 分数类。         击中坦克或是攻取增强宝贝,加分显示,分数有100,200,300,400,500,击中不同坦克分数不同。

为直观起见,参见下图,红圈里从上到下分别是Bullet, Powerup, Explosion, Score.


                               
登录/注册后可看大图


子弹类,屏幕中所有显示子弹从一个子弹池BULLET_POOL中取出,子弹有方向,速度,及强度等属性,高强度的子弹可以击破石块。

它每个游戏帧所要完成的操作如下
  1. /**
  2.      * Operation be done in each tick.
  3.      */
  4.     public void tick(){
  5.         if (!isVisible() || direction==BattleField.NONE)
  6.             return;
  7.         // Move the bullet.
  8.         move(dx, dy);
  9.         int x = getRefPixelX();
  10.         int y = getRefPixelY();
  11.         PlayerTank playerTank=(PlayerTank)Tank.getTank(0);
  12.         //outside the battle field, hitting the border
  13.         if (x <= 0 || x >= battleField.getWidth() || y <= 0
  14.                 || y >= battleField.getHeight()) {

  15.             //this is to avoid explosition outside the battlefield.
  16.             if(x<=0) x=0;
  17.             if(x >= battleField.getWidth()) x= battleField.getWidth();
  18.             if(y<=0) y=0;
  19.             if(y>= battleField.getHeight())y=battleField.getHeight();
  20.             setPosition(x,y);
  21.             explode();
  22.             return;
  23.         }
  24.         
  25.         // See if it hit a tank.
  26.         if (friendly) {
  27.             // See if it hit an enemy tank.
  28.             for (int i = 1; i < Tank.POOL_SIZE; i++) {
  29.                 EnemyTank enemy = (EnemyTank)Tank.getTank(i);
  30.                 if (enemy!=null && enemy.isVisible() &&
  31.                         collidesWith(enemy, false)) {
  32.                     enemy.explode();
  33.                     explode();
  34.                     return;
  35.                 }
  36.             }
  37.         } else {
  38.             // See if it hit player tank.
  39.             
  40.             if (collidesWith(playerTank, false)) {
  41.                 playerTank.explode();
  42.                 explode();
  43.                 return;
  44.             }
  45.         }
  46.         
  47.         //check to see if hit player's home
  48.         if(Powerup.isHittingHome(this)){
  49.             //TODO: Game Over
  50.             explode();
  51.             return;
  52.         }
  53.         // See if it hit a wall.
  54.         if (battleField.hitWall(x, y, strength)) {
  55.             explode();
  56.             return;
  57.         }
  58.         
  59.         // See if it hit another bullet.
  60.         for (int i = 0; i < POOL_SIZE; i++) {
  61.             Bullet anotherBullet=BULLET_POOL;
  62.             if(this!=anotherBullet && anotherBullet.isVisible()){
  63.                 if (collidesWith(anotherBullet, false)) {
  64.                     explode();
  65.                     BULLET_POOL.explode();
  66.                     return;
  67.                 }
  68.             }
  69.         }
  70.     }
复制代码
要判断是否击中墙壁,对方坦克,或是对方子弹,是否击中“家”,如果有,则爆炸,如都没有,则同方向前行一步。

爆炸类,子弹击中障碍物(墙,子弹,坦克)时显示爆炸动画效果。它有两种一个是大爆炸,一个是小爆炸。

它每个游戏帧所要完成的操作比较简单,每步显示一个动画帧,直到显示完。
  1. /**
  2.      * Operation be done in each tick.
  3.      */
  4.     public void tick() {
  5.         if (!isVisible())
  6.             return;
  7.         nextFrame();
  8.         if (getFrame() == 0){
  9.             setVisible(false);
  10.         }
  11.     }
复制代码
增强宝贝类,有多种,无敌,加坦克,地雷,定时器等。不同的增强宝贝可以使玩家获得不同的能力,玩过坦克大战游戏的人都比较熟悉。

在游戏进行中, 会不时或者当玩家打中红色坦克时,会有游戏中随机出现不同增强宝贝。

它每个游戏帧所要完成的操作如下:

如果玩家得到“无敌”增强功能时,“无敌”具有一定的时效性,需要判断无敌是否过时,其它时候则让该增强宝贝有闪烁效果,引起玩家注意。
  1. /**
  2.      * Operation be done in each tick.
  3.      */
  4.     public void tick(){
  5.         if(type==NOTHING || !isVisible()) return;
  6.         long tickTime = System.currentTimeMillis();
  7.         long refreshPeriod=MILLIS_PER_TICK;
  8.         
  9.         //invulnerable powerup is controlled by the player tank.
  10.         if(type!=INVULNERABLE &&type!=HOME && type!=HOME_DESTROYED){
  11.             if(tickTime-startTime>livePeriod){
  12.                 setFrame(NOTHING);
  13.                 setVisible(false);
  14.                 return;
  15.             }
  16.         }else{
  17.             refreshPeriod=MILLIS_PER_TICK/10;
  18.         }
  19.         if(timeTaken>=refreshPeriod){
  20.             showNextFrame=!showNextFrame;
  21.             if(type==INVULNERABLE){
  22.                if(showNextFrame){
  23.                     setFrame(0);
  24.                 }else{
  25.                     setFrame(1);
  26.                 }
  27.             }else if(type==HOME || type==HOME_DESTROYED){
  28.                setFrame(type);
  29.             }else{
  30.                 if(showNextFrame){
  31.                     setFrame(type);
  32.                 }else{
  33.                     setFrame(NOTHING);
  34.                 }
  35.             }
  36.             timeTaken = System.currentTimeMillis() - tickTime;
  37.         } else{
  38.             timeTaken+=1;
  39.         }
  40.     }
复制代码
最后一个是分数类,比较简单,它每个游戏帧所要完成的操作如下
  1. /**
  2.      * Operation be done in each tick.
  3.      */
  4.     public void tick(){
  5.         if(isVisible()){
  6.             long tickTime = System.currentTimeMillis();
  7.             if(startTime>0){
  8.                 if(tickTime-startTime>livePeriod){
  9.                     setVisible(false);
  10.                     startTime=0;
  11.                     return;
  12.                 }
  13.             }
  14.         }
  15.     }
复制代码
在屏幕上显示几秒种后消失。

[ 本帖最后由 trisun 于 10-9-2010 00:33 编辑 ]
actors.PNG
回复  

使用道具 举报

 楼主| 发表于 16-8-2010 00:45:20 | 显示全部楼层

Android坦克大战游戏设计解析七

本篇介绍坦克大战游戏中的主角,坦克类。游戏中坦克种类有多种,但主要特性大同小异。下图为游戏中定义的坦克类层次图。


                               
登录/注册后可看大图


Tank为所有坦克类的基类,它定义了几个主要的方法

  think() 思考,如有AI,算法在这里实现,对于简单坦克SimpleTank,可能随机选择一步,而对SmartTank来说,向靠近玩家坦克的方向前进一步。

  drive()  根据Think决定前进一步

  shoot() 根据当前条件决定发射一棵子弹。PlayerTank由玩家和可同时发射的子弹来控制,Enemy坦克一般随机控制是否要发射子弹。

基类每个游戏帧的操作如下:
  1. /**
  2.      * Operation be done in each tick.
  3.      */
  4.     public void tick(){
  5.         if(isVisible()){
  6.             think();
  7.             drive();
  8.             shoot();
  9.         }
  10.     }
复制代码
派生类中PlayerTank 和 SmartTank逻辑相对复杂一些,FastTank,和HeavyTank都是SimpleTank的子类,FastTank行驶速度较快,而HeavyTank可以承受多次子弹才会被击毁。

PlayerTank中需要处理玩家按键事件,用于控制上下左右以及发射子弹,还要处理升级功能,如吃到增加宝贝。它的

public void upgrade(Powerup powerup)用于处理升级功能。

而在SmartTank的Think方法,它要根据玩家坦克当前位置算出下一步的方向,以便可以不断向玩家坦克靠近,并发射子弹试图击毁玩家坦克。

这些坦克类都定义在om.pstreets.game.battlecity.actors.tank,代码中有较详细的注释,这里不详细一一说明了。

[ 本帖最后由 trisun 于 11-9-2010 00:39 编辑 ]
tanks.PNG
回复  

使用道具 举报

 楼主| 发表于 16-8-2010 00:45:36 | 显示全部楼层

Android坦克大战游戏设计解析八

这是本系列最后一篇,最后就是将整个程序组成起来。坦克大战游戏中有六个用户界面:

音效设置

开始界面

选择关卡界面

游戏主界面

分数界面

游戏结束界面

按照Android程序一般设计方法,一般一个界面对应一个Activity。这样就需要设计6个Activity子类对实现各个界面。

在移植的过程,这里采用了一个简单的方法,采用一个Activity对就于 Java ME中的Midlet。

主Activity采用FrameLayout

view plaincopy to clipboardprint?
01.<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
02.   android:id="@+id/mainwindow"  
03.   android:layout_width="fill_parent"  
04.   android:layout_height="fill_parent"  
05.   >  
06.lt;/FrameLayout>  
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mainwindow"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
</FrameLayout>

FrameLayout 可以将它其中的其它View象扑克牌一样叠放在一起,这样将六个界面都放在主Activity的FrameLayout中,开始将它们都设置为不可见,需要显示某个界面时,设为可见并放在最前面,也就实现了多个用户界面。

ResoureManager中setCurrentScreen

view plaincopy to clipboardprint?
01.public static void setCurrentScreen(View newScreen){   
02.        currentScreen.setVisibility(View.INVISIBLE);   
03.        currentScreen=newScreen;   
04.        currentScreen.setVisibility(View.VISIBLE);   
05.        theDisplay.bringChildToFront(currentScreen);   
06.    }  
public static void setCurrentScreen(View newScreen){
            currentScreen.setVisibility(View.INVISIBLE);
        currentScreen=newScreen;
        currentScreen.setVisibility(View.VISIBLE);
        theDisplay.bringChildToFront(currentScreen);
    }

就是用于屏幕切换。

另外,有于程序主要移植于JavaME,并且主要目的是为了了解Android 平台,和 JavaME版相比不够完善,但基本功能是实现了,如有兴趣的可以进一步完善

[ 本帖最后由 trisun 于 15-9-2010 00:38 编辑 ]
回复  

使用道具 举报

 楼主| 发表于 16-8-2010 00:45:52 | 显示全部楼层

Android Battle city source code

Android 源码

[ 本帖最后由 trisun 于 18-9-2010 18:33 编辑 ]

AndroidBattleCity.zip

1.02 MB, 下载次数: 448

Android source code

回复  

使用道具 举报

 楼主| 发表于 16-8-2010 00:46:08 | 显示全部楼层

Java ME source code

Java ME source code

[ 本帖最后由 trisun 于 15-9-2010 00:47 编辑 ]

BattleCityJavaME.zip

756.72 KB, 下载次数: 52

回复  

使用道具 举报

发表于 16-8-2010 00:52:48 | 显示全部楼层
好多的坑啊。。。
回复  

使用道具 举报

发表于 16-8-2010 12:51:12 | 显示全部楼层

回复 #1 trisun 的帖子

.
出门去户外玩不好么?为什么要在手机上打游戏呢?
回复  

使用道具 举报

发表于 16-8-2010 12:58:39 | 显示全部楼层
原帖由 刘叔 于 16-8-2010 11:51 发表
.
出门去户外玩不好么?为什么要在手机上打游戏呢?

带着手机出门去户外.... 然后掏出手机来玩游戏[size=13.8889px]

评分

参与人数 1威望 +30 收起 理由
key + 30 你太有才了!

查看全部评分

回复  

使用道具 举报

发表于 16-8-2010 13:01:17 | 显示全部楼层
经典游戏,呵呵~不过触摸屏的怎么打?
回复  

使用道具 举报

 楼主| 发表于 16-8-2010 13:34:27 | 显示全部楼层
原帖由 8戒 于 16-8-2010 12:01 发表
经典游戏,呵呵~不过触摸屏的怎么打?


还没试过,用gesture可以实现。不过触摸屏也开是可以实现发现建的。

[ 本帖最后由 trisun 于 16-8-2010 12:37 编辑 ]
回复  

使用道具 举报

发表于 16-8-2010 19:42:06 | 显示全部楼层
不错,来学习
回复  

使用道具 举报

发表于 17-8-2010 15:12:59 | 显示全部楼层
曾经每过年必打的游戏呀
回复  

使用道具 举报

发表于 19-8-2010 14:17:46 | 显示全部楼层
童年经典!!!!
回复  

使用道具 举报

发表于 19-8-2010 22:47:11 | 显示全部楼层
经典游戏重现,支持:)
回复  

使用道具 举报

发表于 20-8-2010 20:25:07 | 显示全部楼层
楼主厉害

我也做Android,有兴趣的话可以上market搜索idea matters试下我的作品,呵呵。。。

评分

参与人数 1威望 +30 收起 理由
trisun + 30 谢谢分享!

查看全部评分

回复  

使用道具 举报

发表于 23-8-2010 19:53:55 | 显示全部楼层
原帖由 8戒 于 16-8-2010 10:01 发表
经典游戏,呵呵~不过触摸屏的怎么打?


触摸屏更好控制;看了几个iPad上面的角色扮演游戏,控制界面做的更加友好。
回复  

使用道具 举报

发表于 23-8-2010 20:32:53 | 显示全部楼层
好多坑啊...
支持支持
回复  

使用道具 举报

发表于 25-8-2010 15:59:19 | 显示全部楼层
支持支持!!
回复  

使用道具 举报

 楼主| 发表于 10-9-2010 01:34:26 | 显示全部楼层
自己顶一下,已写好六篇,再有几个就写完了 ,最后会附上源码。
回复  

使用道具 举报

发表于 10-9-2010 15:42:48 | 显示全部楼层
正好在学android

呵呵 楼主很厉害啊
回复  

使用道具 举报

 楼主| 发表于 15-9-2010 01:49:13 | 显示全部楼层
基本写完了,源码在9,10楼
另外由于程序主要移植于JavaME,并且主要目的是为了了解Android 平台,和 JavaME版相比不够完善,但基本功能是实现了,如有兴趣的可以进一步完善,可以叁考10楼Java ME的实现
回复  

使用道具 举报

发表于 15-9-2010 02:44:04 | 显示全部楼层

回复 #26 trisun 的帖子

什么時候放到Market上?我体验一下

或者把Apk文件放在这里下载也行。
回复  

使用道具 举报

 楼主| 发表于 18-9-2010 19:35:35 | 显示全部楼层
原帖由 ubuntuhk 于 15-9-2010 01:44 发表
什么時候放到Market上?我体验一下

或者把Apk文件放在这里下载也行。


放错代码了,两个都放了Java ME的
重新上传更新过了,Android 包里有 apk ,但没有用开发用的证书签名,不知道你能不能直接装,开发时是可以在手机上运行的。
回复  

使用道具 举报

发表于 18-9-2010 19:42:57 | 显示全部楼层
感謝樓主 !!! ^___^
回复  

使用道具 举报

发表于 8-11-2010 22:06:39 | 显示全部楼层
楼主太有才了,敬仰
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+11, 29-3-2024 16:51 , Processed in 0.051278 second(s), 48 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表