`

《飞机大战》安卓游戏开发源码(三)

阅读更多

本文章属于原创性文章,珍惜他人劳动成果,转载请注明出处:http://www.pm-road.com/index.php/2014/11/06/161/

 

前言:最 近闲来无事,而且也是因为刚接触安卓不久,所以萌生了以后在开发web 项目的过程中同样开发安卓手游,因前一段时间项目需要独立完成了一款功能型手机app ,该App比较简单,全是按钮操作,也就是Activity之间的相互传值与过渡,所以对安卓的基本知识有了一定了解,在我的印象当中,感觉安卓手游是比 较困难的,但是有困难就要克服,所以有了开发游戏的念头。

 

接着上一篇文章,把实体类和线程实体类创建之后,我们把代码和安卓的xml进行整合一下:目前涉及的只有一个MainActivity.java和一个MySurfaceView类,layout 中的xml 目前只一个activity_main.xml 文件

 

按照安卓开发流程,先把MainActivity.java中的代码补充一下,首先在这个activity中应该有你控制的飞机实体类,还有 MySurfaceView这个类,考虑到可能需要屏幕的高度和宽度,所以还应该有两个属性,一个宽度,一个高度:,以下是代码:但是此activity 继承了一个BaseActivity(该类没有做一些具体操作,只是在创建activity的时候,把屏幕全屏化)

 

package com.pm_road.fireair.base;

import android.app.Activity;
import android.os.Bundle;
import android.view.Window;
import android.view.WindowManager.LayoutParams;

/**
 *
 * @ClassName: BaseActivity
 * @Description: 基类
 * @author lipeng
 * @date 2014-11-4 上午10:46:01
 *
 */
public class BaseActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 将游戏界面设置为全屏
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(LayoutParams.FLAG_FULLSCREEN,
                LayoutParams.FLAG_FULLSCREEN);
    }

}

 

以下是主界面代码:

 

 

 

package com.pm_road.fireair;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.os.Bundle;
import android.util.Log;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.ImageButton;

import com.pm_road.fireair.base.BaseActivity;
import com.pm_road.fireair.bean.YourPlane;
import com.pm_road.fireair.common.CommonUtil;
import com.pm_road.fireair.view.MySurfaceView;

/**
 *
 * @ClassName: MainActivity
 * @Description: 空中大战进口页面
 * @author lipeng
 * @date 2014-11-4 上午10:42:51
 *
 */
public class MainActivity extends BaseActivity {

    // private WelcomeView welcomeView;// 欢迎页面

//这里要解释一下原因:这里定义了一个飞机图片,和一个飞机实体类,目的是把飞机的图片和实体类进行了分离,在界面上移动飞机的时候//只是移动 了该图片,并未移动飞机,只是在移动图片的过程中,会把飞机图片的xY坐标赋值给飞机实体类,(这里的飞机实体类是不可见///的,只是和图片进行绑定, 获取坐标而已)
    // 飞机图片
    private ImageButton yourPlanImg;
    // 控制的飞机实体
    private YourPlane yourPlane;

    private MySurfaceView surfaceView;

    // 上下文
    private Context context;

    private int windowHeight;
    private int windowWidth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        context = this;
        setContentView(R.layout.activity_main);
        /** 初始化页面 */
        initView();
        /** 初始化实体类 */
        initBean();
        /** 增加事件 */
        initListener();
        /** 初始化子视图类 */
        initSubView();

    }

    /**
     * 初始化子视图
     */
    private void initSubView() {

        this.addContentView(surfaceView, new LayoutParams(
                LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

        Log.i(CommonUtil.TAG, “初始化子视图”);
    }

    /**
     * 初始化实体类
     */
    private void initBean() {

        yourPlane = new YourPlane();

        yourPlane.setLife(CommonUtil.YOUR_PLAN_LIFE);

        yourPlane.setShot(true);
        /** 将飞机的位置设置和图标相同 */
        setPlanPosition(yourPlanImg);

        // 初始化surfaceView
        surfaceView = new MySurfaceView(context);
        // 将其置顶
        surfaceView.setZOrderOnTop(true);
        // 控制的飞机
        surfaceView.setYourPlane(yourPlane);
        surfaceView.setYourPlaneImg(yourPlanImg);

        Log.i(CommonUtil.TAG, “初始化实体类”);
    }

    /**
     * 设置飞机的位置
     *
     * @param view
     */
    private void setPlanPosition(View view) {

        yourPlane.setX(view.getX());
        yourPlane.setY(view.getY());

        Log.i(CommonUtil.TAG, “控制的飞机坐标X:” + view.getX() + “;Y:” + view.getY());
    }

    /**
     * 初始化绑定事件
     */
    private void initListener() {
        // 飞机绑定事件
        yourPlanImg.setOnTouchListener(new YourPlaneTouch());
        Log.i(CommonUtil.TAG, “控制的飞机绑定移动事件”);
    }

    /**
     * 初始化View
     */
    private void initView() {

        // 初始化飞机图片,这里涉及一个飞机图片,这个图片随便在网上找一个类似的小飞机就可以,这里我就不上传了。
        yourPlanImg = (ImageButton) findViewById(R.id.yourplane);
        // 得到屏幕高度
        windowHeight = getResources().getDisplayMetrics().heightPixels;
        windowWidth = getResources().getDisplayMetrics().widthPixels;

        Log.i(CommonUtil.TAG, “初始化view”);

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }
    
    
    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        
        //退出按钮
        if ((keyCode == KeyEvent.KEYCODE_BACK)) {
            Dialog alert = new AlertDialog.Builder(context).setTitle(R.string.exit)
            .setMessage(R.string.sureexit).setPositiveButton(R.string.sure,new ExitListener())
            .setNeutralButton(R.string.cancel, null).create();
            // 点击周边,不关闭提示框
            alert.setCanceledOnTouchOutside(false);
            alert.show();
        }
        return super.onKeyDown(keyCode, event);
    }
    
    
    class ExitListener implements OnClickListener{
        
        @Override
        public void onClick(DialogInterface dialog, int which) {

//退出程序之前,将飞机停止射击
            yourPlane.setShot(false);
            finish();
        }
        
    }
    
    /**
     *
     * @ClassName: YourPlaneTouch
     * @Description: 飞机绑定事件
     * @author liPeng
     * @date 2014-11-5 上午11:23:25
     *
     */
    class YourPlaneTouch implements OnTouchListener {

        int lastX, lastY;

        @Override
        public boolean onTouch(View v, MotionEvent event) {

            int eventAction = event.getAction();
            switch (eventAction) {

            case MotionEvent.ACTION_DOWN:

                lastX = (int) event.getRawX();
                lastY = (int) event.getRawY();

                break;

            case MotionEvent.ACTION_MOVE:

                int dx = (int) event.getRawX() – lastX;
                int dy = (int) event.getRawY() – lastY;

                int left = v.getLeft() + dx;
                int top = v.getTop() + dy;
                int right = v.getRight() + dx;
                int bottom = v.getBottom() + dy;
//在这里进行判断是防止飞机在托动过程中超出屏幕的范围
                if (left < 0) {
                    left = 0;
                    right = left + v.getWidth();
                }

                if (right > windowWidth) {
                    right = windowWidth;
                    left = right – v.getWidth();
                }

                if (top < 0) {
                    top = 0;
                    bottom = top + v.getHeight();
                }

                if (bottom > windowHeight) {
                    bottom = windowHeight;
                    top = bottom – v.getHeight();
                }

                v.layout(left, top, right, bottom);

                lastX = (int) event.getRawX();
                lastY = (int) event.getRawY();
                /** 将飞机的位置设置和图标相同 */
                setPlanPosition(v);

                v.postInvalidate();

                break;

            case MotionEvent.ACTION_UP:
                break;
            }

            return false;
        }

    }

}

 

以下是surfaceView 的代码:该代码做了一个桥梁的作用,用来搭建xml 和线程之间的功能 。

package com.pm_road.fireair.view;

import android.content.Context;
import android.graphics.PixelFormat;
import android.util.Log;
import android.view.SurfaceHolder;
import android.view.SurfaceHolder.Callback;
import android.view.SurfaceView;
import android.widget.ImageButton;

import com.pm_road.fireair.bean.YourPlane;
import com.pm_road.fireair.common.CommonUtil;
import com.pm_road.fireair.thread.PlaneRunnable;

public class MySurfaceView extends SurfaceView implements Callback {

    // 上下文
    private Context context;
    // 控制的飞机
    private YourPlane yourPlane;
    private ImageButton yourPlaneImg;
    
    // 飞机Runnable
    private PlaneRunnable planeRunnable;
    // 飞机线程
    private Thread shotThread;
    
    private SurfaceHolder holder;

    public MySurfaceView(Context context) {
        super(context);
        this.context = context;

        holder = getHolder();
        holder.addCallback(this);
        // 设置透明度
        holder.setFormat(PixelFormat.TRANSLUCENT);

    }

    /**
     * 执行线程
     */
    private void threadRun() {
        
        // 控制飞机线程
        planeRunnable = new PlaneRunnable(context,holder);
        //将控制的飞机绑定到该线程中
        planeRunnable.setPlane(yourPlane);
        planeRunnable.setPlaneImg(yourPlaneImg);
        
        shotThread = new Thread(planeRunnable);
        //控制的飞机 开始射击
        shotThread.start();
        
        Log.i(CommonUtil.VIEW_TAG, “控制的飞机射击”);
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        /** 启动线程 */
        threadRun();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {
        
        if (shotThread != null && shotThread.isAlive()) {
            try {
                // 当绘图线程结束后自动销毁
                shotThread.join();
                Log.i(CommonUtil.VIEW_TAG, “射击线程destroy”);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public YourPlane getYourPlane() {
        return yourPlane;
    }

    public void setYourPlane(YourPlane yourPlane) {
        this.yourPlane = yourPlane;
    }

    public ImageButton getYourPlaneImg() {
        return yourPlaneImg;
    }

    public void setYourPlaneImg(ImageButton yourPlaneImg) {
        this.yourPlaneImg = yourPlaneImg;
    }

    
}

在activity中涉及了一个Util工具类:代码如下:主要用来定义一些常量

 

package com.pm_road.fireair.common;

public class CommonUtil {
    
    /** 飞机生命 */
    public static final int YOUR_PLAN_LIFE = 5;
    /** 敌机生命 */
    public static final int ENEMY_PLAN_LIFE = 5;
    
    public static final String TAG = “com.pm_road.fireair.mainActivity”;
    public static final String VIEW_TAG = “com.pm_road.fireair.view”;
    public static final String THREAD_TAG = “com.pm_road.fireair.thread”;
    
    public static final String BULLET = “o”;
    
}

 

完成以上代码之后:大概的工作也就差不多了,可以使用真机或ADT运行一下:

 

接下来我们就是写敌机和敌机发射子弹了 《飞机大战》安卓游戏开发源码(四)

 

在这里我的运行效果如下:

 

本文章属于原创性文章,珍惜他人劳动成果,转载请注明出处:http://www.pm-road.com/index.php/2014/11/06/161/

 

飞机大战源码

飞机大战源码

2
1
分享到:
评论

相关推荐

    基于Android Studio游戏开发 飞飞机大战小游戏源码,可暂停、继续游戏、开关背景音乐等功能。

    在这个案例中,“飞飞机大战”游戏可能是用Java或Kotlin编写的,这两种语言在Android开发中都非常常见。 游戏的核心功能包括游戏逻辑、用户交互和多媒体元素。"飞飞机大战"游戏包含以下关键组件: 1. 游戏循环:...

    android飞机大战源码,直接运行即可

    【描述】提到"JAVA飞机大战源码,自己初学Android时候写的",这暗示了这个项目可能是由一个初学者为了学习Android开发而创建的。初学者通常会从简单的游戏项目开始,因为它们可以提供对基本游戏循环、图形绘制、用户...

    android 飞机大战游戏源码

    【Android 飞机大战游戏源码】是一个用于学习Android游戏开发的实例项目,它包含了一个简单的飞机大战游戏的所有源代码。这个项目是为初学者和有经验的开发者设计的,旨在帮助他们理解和掌握Android平台上游戏开发的...

    基于Android的飞机大战游戏

    【基于Android的飞机大战游戏】是一款使用Java编程语言开发的移动平台游戏,它展示了Java在构建安卓应用,尤其是游戏方面的强大能力。在这个项目中,我们将深入探讨几个关键的知识点: 1. **Android开发环境**:...

    微信小游戏飞机大战源码

    微信小游戏“飞机大战”是一款基于微信平台开发的轻量级休闲游戏,它的源码对于学习游戏开发、尤其是微信小游戏开发的开发者来说具有重要的参考价值。本文将深入探讨这款游戏的源码结构、技术栈以及实现原理。 首先...

    android飞机大战雷电源码

    通过对"android飞机大战雷电源码"的深入分析,我们可以了解到Android游戏开发的基本流程和核心技术,这对于进一步提升Android应用开发能力,特别是游戏开发方向,具有极大的实践价值。通过学习和理解这些源码,...

    安卓仿微信飞机大战源码

    【安卓仿微信飞机大战源码】是一个非常适合初学者学习的项目,它可以帮助开发者了解安卓应用的基本构建、游戏编程原理以及如何实现简单的交互功能。在这个项目中,你可以深入学习以下几个重要的知识点: 1. 安卓...

    微信飞机大战Android源码

    通过分析微信飞机大战的Android源码,我们可以学习到如何使用Cocos2d-android进行游戏开发,了解游戏架构设计、资源管理、事件处理等核心知识点,对于提升自己的Android游戏开发能力大有裨益。同时,这也为我们提供...

    飞机大战游戏源码

    《飞机大战游戏源码》是一款基于Cocos2D引擎开发的基础飞行射击游戏,它涵盖了游戏设计、编程和UI定制等多个方面。在这个项目中,开发者利用C/C++语言编写代码,展示了对游戏逻辑、图形渲染以及用户交互的深入理解。...

    飞机大战游戏,含源码,测试过,安卓手机完美运行

    总结来说,微信飞机大战游戏是学习面向对象编程和安卓游戏开发的绝佳案例。通过分析其源码,你可以了解到游戏对象的抽象和设计,游戏循环的实现,以及在安卓平台上的运行和调试技巧。对于初学者来说,这是一个很好的...

    java飞机大战源码

    Java飞机大战是一款基于Java SE平台开发的经典射击游戏,它展示了Java语言在游戏开发中的应用能力。通过分析这款游戏的源代码,我们可以深入理解Java编程的基本原理,以及如何利用Java进行图形界面设计、事件处理、...

    基于Java的安卓飞机大战游戏设计源码

    本源码为基于Java的安卓飞机大战游戏设计,共包含135个文件,其中png文件43个,class文件30个,xml文件18个,java文件18个,mp3文件5个,gif文件4个,jar文件3个,apk文件2个,jpg文件2个,classpath文件1个。...

    Android打飞机类游戏源码

    【Android打飞机类游戏源码】是一款基于Android平台开发的简单飞行射击游戏,与流行的"全民飞机大战"具有相似的游戏机制。源代码的提供对于学习Android游戏开发的开发者或者对游戏编程感兴趣的爱好者来说,是一份...

    Android游戏源码仿微信飞机大战Cocos2dx版.zip

    《深入解析:基于Cocos2dx的Android飞机大战游戏源码》 在移动游戏开发领域,Cocos2dx是一款广受欢迎的游戏开发框架,它提供了跨平台的2D游戏开发能力,支持包括Android在内的多种操作系统。本篇文章将围绕...

    unity全民飞机大战源码.zip

    《Unity游戏开发:深入解析“全民飞机大战”源码》 Unity是一款强大的跨平台游戏开发引擎,被广泛应用于各类游戏的制作,从简单的2D小游戏到复杂的3D大作,无所不能。本篇文章将深入剖析“全民飞机大战”这款游戏的...

    Android游戏大战飞机源码

    【Android游戏大战飞机源码】是一款适合初学者的Android游戏开发项目,旨在帮助开发者了解基本的游戏编程概念。这个游戏是基于经典的“打飞机”玩法,玩家通过控制飞机来击落来袭的敌机,同时躲避敌方的攻击。在这个...

    【经典Android游戏源码9】仿微信飞机大战Cocos2dx版

    【经典Android游戏源码9】仿微信飞机大战Cocos2dx版是一款基于Cocos2dx框架开发的Android游戏,这款游戏的源代码对于学习Android游戏开发,尤其是Cocos2dx引擎的使用具有很高的参考价值。Cocos2dx是一个跨平台的游戏...

    android飞机大战毕设源码.zip_android_android game_android 飞机大战_飞机_飞机大战

    总结,“android飞机大战毕设源码.zip”项目涵盖了Android游戏开发的多个核心知识点,通过学习和分析源码,你可以深入理解Android游戏的架构设计,提升你的编程技能,为今后的项目开发打下坚实基础。

    飞机大战android版源代码

    "飞机大战Android版源代码"就是一个典型的移动游戏开发实例,它展示了如何在Android环境中实现一个简单的飞行射击游戏。下面,我们将深入探讨这个项目中的关键知识点。 首先,我们要理解的是Android应用程序的基础...

    经典飞机大战资源源码

    总的来说,这个"经典飞机大战资源源码"涵盖了游戏开发的基本要素,包括游戏对象的创建、动画实现、碰撞检测以及对象销毁等。通过分析和理解这些代码,开发者可以学习到游戏开发的核心技巧,并将其应用到自己的项目中...

Global site tag (gtag.js) - Google Analytics