`
he91_com
  • 浏览: 400965 次
文章分类
社区版块
存档分类
最新评论

Android 之 SurfaceView (坦克大战之世界地图)

 
阅读更多

1 自定义 SurfaceView

WarView.java (世界战场)

package com.mytank;
import java.util.Vector;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Paint.Style;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
public class WarView extends SurfaceView implements SurfaceHolder.Callback {
    SurfaceHolder mholder;
    boolean run_flag;
    Canvas canvas;
    DrawThread thread;
    
    Vector<Wall>walllist=new Vector<Wall>();
    
    int row;//行
    int col;//列
    int warmap[][];
    
    float x=10,y=10;
    
    public WarView(Context context, AttributeSet attrs) {
        super(context, attrs);
        mholder=this.getHolder();
        
        if(mholder!=null)
            mholder.addCallback(this);
    }
    
    //初始化地图
    public void initmap()
    {
        //0 空, 1 墙
        for(int i=0;i<col;i++)
        {
            warmap[0][i]=1;
            warmap[1][i]=1;
            Wall wall=new Wall(0,i);
            walllist.add(wall);
            wall=new Wall(1,i);
            walllist.add(wall);
        }
        for(int i=0;i<10;i++)
        {
            warmap[i][10]=1;
            warmap[i][11]=1;
            Wall wall=new Wall(i,10);
            walllist.add(wall);
            wall=new Wall(i,11);
            walllist.add(wall);
        }
    }
    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        run_flag=true;
        row=this.getHeight()/Common.CELL_LENGTH;
        col=this.getWidth()/Common.CELL_LENGTH;
        warmap=new int[row][col];
        thread=new DrawThread();
        initmap();
        thread.start();
    }
    
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO 自动生成的方法存根
        x=event.getX();
        y=event.getY();
        
        
        /*  备注:  一定要将return super.onTouchEvent(event)修改为return true
         *  原因: 
         *        1: 父类的onTouchEvent(event)方法没有做任何处理,并且返回了false。;
         *        2: 一旦返回false,将不再收到 MotionEvent.ACTION_MOVE 及 MotionEvent.ACTION_UP 事件;
         */
        return true;
    }
 
    //自定义 界面绘制 线程
    class DrawThread extends Thread
    {
        @Override
        public void run() {
            
            //画刷
            Paint paint=new Paint();
            paint.setStyle(Style.FILL);
            paint.setColor(Color.rgb(255, 0, 0));    //红绿蓝
            
            Paint bkpaint=new Paint();
            bkpaint.setStyle(Style.FILL);            //设置填充方式
            bkpaint.setColor(Color.rgb(2,17,17));    //红绿蓝
            
            while(run_flag)
            {
                //锁定画布
                canvas=mholder.lockCanvas();
                if (canvas == null)
                    continue;
                
                //绘制背景
                canvas.drawRect(0, 0, Common.CELL_LENGTH*col, Common.CELL_LENGTH*row, bkpaint);
                
                //绘制手势跟踪
                canvas.drawCircle(x, y, 15, paint);
                
                //绘制墙壁
                for(int i=0;i<walllist.size();i++)
                    walllist.get(i).Draw(canvas);
                
                //取消锁定
                mholder.unlockCanvasAndPost(canvas);
            }
        }
    }
    
    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    }
    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        run_flag=false;        //关闭界面绘制线程
    }
}

2 在布局中使用自定义的 WarView

main_layout.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <com.mytank.WarView
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

3 封装的 墙块类

Wall.java

package com.mytank;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.Paint.Style;
/**
 * @author michael.mao
 * @description 封装的 墙块类,包含自绘制方法
 */
public class Wall {
    
    public int mrow;    //该墙壁所在行
    public int mcol;
    Paint inPaint;        //墙壁内边框画刷
    Paint outPaint;
    Rect inRect;
    Rect outRect;
    
    public Wall(int row, int col)
    {
        this.mrow=row;
        this.mcol=col;
        
        inPaint=new Paint();
        inPaint=new Paint();
        inPaint.setStyle(Style.FILL);
        inPaint .setColor(Color.rgb(86, 53, 35));//红绿蓝
        
        outPaint=new Paint();
        outPaint=new Paint();
        outPaint.setStyle(Style.STROKE);
        outPaint.setColor(Color.rgb(98, 98, 98));
        
        inRect=new Rect( mcol*Common.CELL_LENGTH+1,mrow*Common.CELL_LENGTH+1,
                       ( mcol+1)*Common.CELL_LENGTH-1,(mrow+1)*Common.CELL_LENGTH-1);
        outRect=new Rect( mcol*Common.CELL_LENGTH,mrow*Common.CELL_LENGTH,
                        ( mcol+1)*Common.CELL_LENGTH,(mrow+1)*Common.CELL_LENGTH);
    }
    
    public void Draw(Canvas canvas)
    {
        canvas.drawRect(inRect,inPaint);
        canvas.drawRect(outRect,outPaint);
    }
}

4 常量值

Common.java

package com.mytank;
public class Common {
    public static int CELL_LENGTH=10;    //块宽    战场被分成 M行 N 列, CELL_LENGTH==行高==列宽
}

5 主类

MainActivity.java
package com.mytank;
import android.os.Bundle;
import android.app.Activity;
public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_layout);
    }
}

6结果展示




转载请注明出处 :)



分享到:
评论

相关推荐

    Android实现坦克大战游戏

    在Android平台上实现一款坦克大战游戏是一项综合性的技术挑战,涵盖了多方面的编程知识。这个游戏的核心特点是可以联网对战,这需要开发者具备扎实的Android应用开发基础,以及网络编程和多线程处理的能力。 首先,...

    android 坦克大战源码

    首先,Android坦克大战源码是用Java语言编写的,利用Android SDK中的SurfaceView或OpenGL ES进行图形渲染。SurfaceView是Android系统为处理长时间运行的图形任务而设计的,它提供了一个独立的绘制线程,确保游戏画面...

    Android 坦克大战源代码

    1. 游戏框架:Android坦克大战源代码采用的是自定义的游戏框架,它基于Android的SurfaceView进行扩展,创建出游戏主循环,处理游戏的渲染、更新逻辑和事件响应。这样的框架设计保证了游戏的流畅性和实时性。 2. ...

    基于android的坦克大战

    【基于Android的坦克大战】是一款适用于移动设备的游戏项目,它充分利用了Android平台的特性,为玩家提供了一种在掌上体验经典坦克战斗的机会。作为一款计算机专业的毕业设计,这个项目展示了开发者扎实的编程基础和...

    Android应用源码之TankWar坦克大战-IT计算机-毕业设计.zip

    本文将针对"Android应用源码之TankWar坦克大战"这一项目,探讨其核心技术和设计理念。 首先,我们要了解的是Android应用的基本结构。一个标准的Android应用通常由以下几个部分组成:Manifest文件、Activity、布局...

    android版坦克大战源码(和小霸王类似)

    《Android版坦克大战源码解析》 Android版坦克大战是一款基于Android平台开发的,与经典的小霸王游戏坦克大战相似的移动应用。它以其独特的游戏体验、丰富的视觉效果和音效,吸引了众多玩家的关注。本文将深入探讨...

    Android坦克大战游戏源码

    《Android坦克大战游戏源码详解》 Android坦克大战游戏源码是一个典型的移动平台游戏开发实例,它涵盖了Android应用开发中的诸多重要知识点,包括图形绘制、游戏逻辑、碰撞检测、用户输入处理以及性能优化等多个...

    android坦克大战游戏源代码【适用于初学android的朋友】

    【Android坦克大战游戏源代码详解】 Android坦克大战是一款经典的基于Android平台的游戏,它为初学者提供了深入了解Android开发的宝贵资源。这款源代码包含了程序的主要结构和功能实现,可以帮助开发者掌握Android...

    android坦克大战游戏实例

    《Android坦克大战游戏实例解析》 在Android平台上开发游戏,尤其是经典的坦克大战,是一个极好的实践项目,适合初学者入门并提升技能。本实例将深入探讨如何利用Android Studio和Java语言构建一个简单却有趣的坦克...

    android坦克大战源码

    《Android坦克大战源码解析与技术探讨》 在Android平台上,坦克大战是一款经典的休闲游戏,深受开发者和玩家的喜爱。本文将深入解析“android坦克大战源码”,探讨其中的关键技术和编程思路,帮助读者理解和掌握...

    坦克大战源码+素材(android版)

    《坦克大战源码+素材(Android版)》是一款基于Android平台的经典游戏——坦克大战的完整开发资源包。这个包包含了游戏的源代码以及所需的图片和音频素材,为开发者提供了深入学习和二次开发的基础。 源码是软件...

    Android 坦克大战,经典游戏

    《Android坦克大战:重温经典游戏开发之旅》 在数字化时代,许多我们儿时的经典游戏得以在新的平台上重生,其中就包括了风靡一时的“坦克大战”。本文将深入探讨如何在Android平台上重制这款经典游戏,带你领略移动...

    Android应用源码之TankWar坦克大战.zip

    "TankWar"是一款基于Android平台的经典坦克对战游戏,它继承了早期计算机游戏的坦克大战玩法,玩家可以控制自己的坦克在地图上移动,射击敌人,同时避免被击中。这款游戏的源码为我们提供了一个了解Android游戏开发...

    【经典Android游戏源码20】坦克大战游戏源码

    【经典Android游戏源码20】坦克大战游戏源码是一个非常适合初学者和进阶开发者学习的项目,它展示了如何在Android平台上实现一个完整的2D游戏。这个游戏基于经典的坦克战斗概念,玩家可以控制自己的坦克,与敌方坦克...

    android坦克大战

    【Android坦克大战】是一款基于Android平台的经典坦克对战游戏,开发者在原有的网络代码基础上进行了优化,使其无需额外配置即可直接运行。游戏的核心是利用Android的图形库和编程接口(API)来实现坦克的移动、射击...

    android版坦克大战适合初学者

    《Android版坦克大战:初学者入门指南》 在Android平台上,开发一款坦克大战游戏是学习移动应用编程的理想项目。这个项目不仅涵盖了基本的Java编程语言,还涉及到Android SDK的使用,以及图形绘制、游戏逻辑、碰撞...

    android系统下的坦克大战类小游戏源代码

    坦克大战游戏需要显示坦克、地图、子弹等元素,这涉及到了Android的Canvas和Bitmap技术。开发者可能会使用`SurfaceView`或`GLSurfaceView`来创建高性能的游戏画布,结合`Canvas.drawBitmap()`绘制静态图像,通过平移...

    安卓坦克大战小游戏

    【安卓坦克大战小游戏】是一款基于Android平台开发的经典坦克战斗游戏,源码的分析与学习能够帮助开发者深入了解Android游戏开发的基本原理和技术。以下将详细介绍这款游戏中涉及的重要知识点。 1. **Android开发...

    坦克大战源码

    总的来说,通过学习坦克大战的源代码,初级开发者可以掌握Android游戏开发的基础知识,包括游戏逻辑设计、用户交互处理、资源管理以及性能优化等。这是一个绝佳的学习起点,有助于开发者逐步成长为熟练的Android游戏...

    经典游戏 坦克大战

    通过分析和学习《坦克大战》的源代码,开发者不仅可以掌握游戏开发的基本技能,还能深入理解Android平台的特性,为未来开发更复杂的游戏奠定基础。同时,源代码也是一个很好的学习素材,能够帮助开发者提升解决问题...

Global site tag (gtag.js) - Google Analytics