android studio飞机大战游戏带注释源码教程(多线程)

第一次发博客,学了3天的android studio还有一点以前的java基础做了个基于多线程的飞机大战的游戏

不过,不建议这么做,游戏一般一个主线程控制所有对象


游戏比较简单大概就这几个功能

1.会动的背景

2.我的飞机

3.发射子弹

3.敌人飞机


第一步新建一个项目

android studio飞机大战游戏带注释源码教程(多线程)_第1张图片

我用的是Android4.4版本

android studio飞机大战游戏带注释源码教程(多线程)_第2张图片

android studio飞机大战游戏带注释源码教程(多线程)_第3张图片

android studio飞机大战游戏带注释源码教程(多线程)_第4张图片

新建好项目之后 xml文件之类的什么都不用管

先新建个类

android studio飞机大战游戏带注释源码教程(多线程)_第5张图片

叫做hua

android studio飞机大战游戏带注释源码教程(多线程)_第6张图片

hua.java

package com.dahuijii.liziguo;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.view.MotionEvent;
import android.view.View;
import java.util.Vector;

/**
 * Created by Liziguo on 2018/5/10.
 */
class my{//新建一个类 里面的东西都是静态的 当全局变量用
    public static int js=0;//击杀数
    public static int w,h;//屏幕的宽高
    public static float bili;//比例,用于适应不同屏幕
    public static Vector list=new Vector();//所有飞行物的集合,添加进这个集合才能被画出来
    public static Vector drlist=new Vector();//敌人飞机的集合,添加进这个集合才能被子弹打中
    //我集合学的挺烂的哈 为什么用Vector呢?因为他线程是安全的。。。
    public static Bitmap myhj,drhj,bj,myzd;//图片:我的灰机 敌人灰机 背景 我的子弹
    public static myhj my;//我的灰机
    public static bj b;//背景
}

public class hua extends View{//画
    private Paint p=new Paint();//画笔
    private float x,y;//按下屏幕时的坐标
    private float myx,myy;//按下屏幕时玩家飞机的坐标

    public hua(Context context) {
        super(context);
        //添加事件控制玩家飞机
        setOnTouchListener(new OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent e) {
                if(e.getAction()==MotionEvent.ACTION_DOWN){
                    x=e.getX();
                    y=e.getY();
                    myx=my.my.r.left;
                    myy=my.my.r.top;
                }
                float xx=myx+e.getX()-x;
                float yy=myy+e.getY()-y;
                //我的飞机不能飞出屏幕
                xx=xx-my.my.w/2?xx:-my.my.w/2;
                yy=yy-my.my.h/2?yy:-my.my.h/2;
                my.my.setX(xx);
                my.my.setY(yy);
                return true;
            }
        });

        setBackgroundColor(Color.BLACK);//设背景颜色为黑色

        my.myhj= BitmapFactory.decodeResource(getResources(),R.mipmap.hj);//加载图片
        my.drhj=BitmapFactory.decodeResource(getResources(),R.mipmap.dr);
        my.myzd=BitmapFactory.decodeResource(getResources(),R.mipmap.zd);
        my.bj=BitmapFactory.decodeResource(getResources(), R.mipmap.bj);

        new Thread(new re()).start();//新建一个线程 让画布自动重绘
        new Thread(new loaddr()).start();//新建一个 加载敌人的线程
    }
    @Override
    protected void onDraw(Canvas g) {//这个相当于swing的paint方法吧 用于绘制屏幕上的所有物体
        super.onDraw(g);
        g.drawBitmap(my.b.img,null,my.b.r,p);//画背景 我没有把背景添加到list里

        for(int i=0;i0){//如果生命>0 没有死 就继续向前飞,死了还飞什么?
            try {Thread.sleep(sd0);} catch (InterruptedException e) {e.printStackTrace();}
            setY(r.top+2*my.bili);
            if(r.top>=my.h)break;//敌人飞出屏幕 跳出循环
        }
        //从集合删除
        my.list.remove(this);
        my.drlist.remove(this);
    }
}

class myhj extends hj implements Runnable{//我的灰机

    public myhj(){
        w=h=200*my.bili;//凡是涉及到像素的 都乘一下分辨率比例my.bili
        //设置初始位置
        setX(my.w/2-w/2);
        setY(my.h*0.7f-h/2);
        img=my.myhj;//初始化图片
        my.list.add(this);//添加到集合里 这样才能被画出来
        new Thread(this).start();//发射子弹的线程
    }

    @Override
    public void run() {
        while(true){
            //90毫秒发射一发子弹
            try {Thread.sleep(90);} catch (InterruptedException e) {e.printStackTrace();}
            new myzd(this);
        }
    }
}
class myzd extends hj implements Runnable{//我的子弹
    private int dps;
    private float sd0;

    public myzd(hj hj){
        w=h=90*my.bili;//凡是涉及到像素的 都乘一下分辨率比例my.bili
        img=my.myzd;//图片
        sd0=6*my.bili;//速度=6
        dps=6;//伤害=6
        //设在玩家中心的偏上一点
        setX(hj.r.left+hj.w/2-w/2);
        setY(hj.r.top-h/2);
        my.list.add(this);//添加到集合里 这样才能被画出来
        new Thread(this).start();//新建一个子弹向上移动的线程
    }

    @Override
    public void run() {
        boolean flag=false;//一个标记 用来跳出嵌套循环
        while(true){
            try {Thread.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}
            setY(r.top-sd0);//向上移sd0个像素,sd0=6

            try {//try一下 怕出错
                //这里判断有没有和集合里的敌人发生碰撞
                for(int i=0;i

然后回到MainActivity.java

package com.dahuijii.liziguo;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private long time;//用于检测按两次 "再按一次退出游戏"

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().hide();//隐藏标题栏
        setContentView(new hua(this));
        //setContentView()跟swing的add()差不多吧,不过这里只能添加一个控件,默认铺满屏幕
    }


    public boolean onKeyDown(int keyCode,KeyEvent event) { //返回键
        if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0){
            long t=System.currentTimeMillis();//获取系统时间
            if(t-time<=500){
                exit(); //如果500毫秒内按下两次返回键则退出游戏
            }else{
                time=t;
                Toast.makeText(getApplicationContext(),"再按一次退出游戏",Toast.LENGTH_SHORT).show();
            }

            return true;
        }
        return false;

    }
    public void exit(){
        MainActivity.this.finish();
        new Thread(new Runnable(){
            @Override
            public void run() {
                try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}
                System.exit(0);
            }
        }).start();
    }
}

把图片添加到mipmap

bj.png 背景

dr.png 敌人

hj.png 我的灰机

zd.png 子弹

android studio飞机大战游戏带注释源码教程(多线程)_第7张图片

好了!大功告成!快试试吧!

android studio飞机大战游戏带注释源码教程(多线程)_第8张图片

下载地址:https://download.csdn.net/download/u010756046/10406656

你可能感兴趣的:(android studio飞机大战游戏带注释源码教程(多线程))