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

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

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

1.会动的背景

2.我的飞机

3.发射子弹

3.敌人飞机

第一步新建一个项目

我用的是Android4.4版本

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

先新建个类

叫做hua

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<hj> list=new Vector<hj>();//所有飞行物的集合,添加进这个集合才能被画出来public static Vector<hj> drlist=new Vector<hj>();//敌人飞机的集合,添加进这个集合才能被子弹打中//我集合学的挺烂的哈 为什么用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() {@Overridepublic 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.w-my.my.w/2?xx:my.w-my.my.w/2;xx=xx>-my.my.w/2?xx:-my.my.w/2;yy=yy<my.h-my.my.h/2?yy:my.h-my.my.h/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();//新建一个 加载敌人的线程}@Overrideprotected void onDraw(Canvas g) {//这个相当于swing的paint方法吧 用于绘制屏幕上的所有物体super.onDraw(g);g.drawBitmap(my.b.img,null,my.b.r,p);//画背景 我没有把背景添加到list里for(int i=0;i<my.list.size();i++){//我们把所有的飞行物都添加到了my.list这个集合里hj h=my.list.get(i);           //然后在这里用一个for循环画出来g.drawBitmap(h.img,null,h.r,p);}g.drawText("击杀:"+my.js,0,my.h-50,p);}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {//这个方法用来获取屏幕宽高的super.onSizeChanged(w, h, oldw, oldh);my.w=w;//获取宽my.h=h;//高//获取手机(应该不是手机的吧 是这控件的吧)分辨率和1920*1080的比例//然后飞机的宽高乘上这个分辨率就能在不同大小的屏幕正常显示了//为什么用1920*1080呢 因为我手机就是这个分辨率。。。my.bili= (float) (Math.sqrt(my.w * my.h)/ Math.sqrt(1920 * 1080));p.setTextSize(50*my.bili);//设置字体大小,“击杀”的大小p.setColor(Color.WHITE);//设为白色//好了 到这里游戏开始了my.b=new bj();//初始化背景my.my=new myhj();//初始化 我的灰机}private class re implements Runnable {@Overridepublic void run() {//每10ms刷新一次界面while(true){try { Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}postInvalidate();//刷新画布//就是这个东西拖了我一天//swing是repaint()方法刷新的//然后这里没有repaint方法//然后突然想起C#有一个invalidate()方法是刷新画布的//然后这线程里用invalidate()会闪退.....//烦死了}}}private class loaddr implements Runnable{@Overridepublic void run() {while(true){//每300ms刷一个敌人try {Thread.sleep(300);} catch (InterruptedException e) {e.printStackTrace();}try {new drhj();} catch (Exception e) {e.printStackTrace();}}}}
}
class hj{//游戏内所有物体的父类public RectF r=new RectF();//这个是用来确定位置的public int hp;//生命public float w,h;//宽高public Bitmap img;//图片//这里的画图方法和swing的不太一样//设两个方法来设置x,y的坐标public void setX(float x){r.left=x;r.right=x+w;}public void setY(float y){r.top=y;r.bottom=y+h;}public boolean pengzhuang(hj obj,float px) {//判断碰撞 判断时忽略px个像素px*=my.bili;//凡是涉及到像素的 都乘一下分辨率比例my.biliif (r.left+px - obj.r.left <= obj.w && obj.r.left - this.r.left+px <= this.w-px-px)if (r.top+px - obj.r.top <= obj.h && obj.r.top - r.top+px <= h-px-px) {return true;}return false;}
}
class bj extends hj implements  Runnable{//背景public bj(){w=my.w;h=my.h*2;//背景的高是 屏幕高的两倍img=my.bj;setX(0);setY(-my.h);new Thread(this).start();}@Overridepublic void run() {//这里控制背景一直向下移while(true){try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}if(r.top+2<=0){setY(r.top+2);}else{setY(-my.h);}}}
}class drhj extends hj implements Runnable{//敌人灰机private long sd0=(long) (Math.random()*10)+10;//生成一个[10,20)的随机数 用来控制敌人速度 敌人速度是不一样的public drhj(){
//        w=my.w/5.4f;
//        h=my.h/9.6f;w=h=200*my.bili;//敌人刷出来的位置setX((float)( Math.random()*(my.w-w)));//x是随机的setY(-h);//在屏幕外 刚好看不到的位置img=my.drhj;hp=12;//生命=12my.list.add(this);//添加到集合里 这样才能被画出来my.drlist.add(this);//添加到敌人的集合 添加进这个集合子弹才打得到new Thread(this).start();}@Overridepublic void run() {while(hp>0){//如果生命>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();//发射子弹的线程}@Overridepublic 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.biliimg=my.myzd;//图片sd0=6*my.bili;//速度=6dps=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();//新建一个子弹向上移动的线程}@Overridepublic void run() {boolean flag=false;//一个标记 用来跳出嵌套循环while(true){try {Thread.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}setY(r.top-sd0);//向上移sd0个像素,sd0=6try {//try一下 怕出错//这里判断有没有和集合里的敌人发生碰撞for(int i=0;i<my.drlist.size();i++){hj h=my.drlist.get(i);if(pengzhuang(h,30)){//判断碰撞h.hp-=dps;//敌人生命-子弹伤害flag=true;//一个标记 用来跳出嵌套循环my.js++;//击杀+1break;}}} catch (Exception e) {e.printStackTrace();break;}if(flag || r.top+h<=0)break;//如果子弹击中过敌人 或者超出屏幕范围 跳出循环}my.list.remove(this);//从集合删除}
}

然后回到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;//用于检测按两次 "再按一次退出游戏"@Overrideprotected 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(){@Overridepublic void run() {try {Thread.sleep(500);} catch (InterruptedException e) {e.printStackTrace();}System.exit(0);}}).start();}
}

把图片添加到mipmap

bj.png 背景

dr.png 敌人

hj.png 我的灰机

zd.png 子弹

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

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

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

  1. Android studio飞机大战游戏分析-月末总结

    整体实现思路 绘制循环滚动的背景图片创建BackGround类 绘制飞机和子弹.创建Myplane和Bullet类 在Myplane中构造isCollision绘制飞机与boss飞机的碰撞,飞机与子弹 ...

  2. Python3+pygame实现有趣好玩的飞机大战游戏(附源码及素材)

    版权声明:原创不易,本文禁止抄袭.转载,侵权必究! 目录 一.开发环境 二.功能模块 三.游戏效果 四.完整项目下载 五.作者Info 一.开发环境 开发环境 :Windows10 Python3.6 ...

  3. Python实现飞机大战-第二部分(附源码、素材、超详细教程)

    飞机大战第二部分 1.前言 2.飞机射击 2.1.添加子弹的相关设置 2.2.创建文件bullet.py 2.3.修改game_functions.py 2.4.修改mian.py 2.5.射击效果 ...

  4. android ctrl 左键鼠标左键直接打开xml文件夹,设置Android Studio通过Ctrl+左键查看源码...

    开始学习android的时候希望能点进系统提供的控件中查看源码,但是实际操作发现,看到的每个源文件方法都是抛出的Exception,所以想要设置成可以直接查看具体实现,记录下我自己的操作方法. 1.首 ...

  5. 畅玩mt3单机游戏服务器维护,【梦幻西游】MT3仿端手工游戏服务端源码[教程+授权物品后台]...

    [梦幻西游]MT3仿端手工游戏服务端源码[教程+授权物品后台] 架设教程 系统:CentOS 6.8  64位 1.关闭防火墙 chkconfig iptables off service iptab ...

  6. 基于Android的飞机大战游戏的设计与实现

    在2007年11月5日谷歌公司发布了一款全新的面向智能移动端设备的操作系统,这就是Android.经历了几年市场的洗礼,Android凭借其优异的性能占据了大部分智能手机市场.根据最新的调查显示,An ...

  7. Android Studio 飞机大战

    1.整体实现思路 实现飞机大战的简单思路: ①要先建MySurfaceView这个类,在这个类中绘制画布,有画布的高度和宽度,还有画笔,然后在这个建好的画布上开始继续"作画"画布利 ...

  8. 飞机大战java代码_[源码和文档分享]Java飞机大战游戏设计与实现

    1 概述 1.1 项目简介 本次Java课程设计是做一个飞机大战的游戏,应用Swing编程,完成一个界面简洁流畅.游戏方式简单,玩起来易于上手的桌面游戏.该飞机大战项目运用的主要技术即是Swing编程 ...

  9. Android Studio打包原生Java影视APP源码

    用Android Studio环境,搭建一个原生Java影视APP源码,各种功能也不错,就是有一点小bug Android Studio安装环境如果有人不会的,可能百度一下,看情况可能下次会出一个An ...

  10. 从零开始用js手写飞机大战全过程(附源码)

    plane game 前言 此文章帮助初学者学习制作一个简单小游戏 目标 利用css,html,js制作出飞机大战的简略版 前置准备 1. 绝对定位与相对定位 这里除了背景都设置为绝对定位,使飞机和敌 ...

最新文章

  1. thinkphp5是不是php,我对ThinkPHP5和Laravel5的一些看法
  2. vim去掉windows文本的多余的回车符(^M)
  3. APUE学习之多线程编程(二):线程同步
  4. Oracle SQL语句大全(三)
  5. 557. 反转字符串中的单词 III
  6. 终结“永恒之蓝”后,再战“永恒之黑”
  7. Deltix Round, Summer 2021 (open for everyone, rated, Div. 1 + Div. 2)
  8. keras实现嘴唇图像autoencoder
  9. 小数分数转换c语言,这是把小数转换成分数的程序,可是输入0.6666无限循环
  10. [转载]Java并发编程:深入剖析ThreadLocal
  11. C++编程语言中整型转换为字符串类型的方法
  12. jQuery实现瀑布流
  13. Atitit 微服务 分布式 区别 微服务的判断标准 目录 1.1. 区别 微服务侧重于微小服务进程隔离级别,分布式侧重于机器隔离 1 2. 微服务是一种架构, 。多微才叫微? 1 2.1. 微服务
  14. 在线职业教育高保真移动端Axure原型模板
  15. ae 的动画导出为html,Bodymovin v5.5.5 AE脚本可以导出json格式在Web动画制作工具
  16. i.MX6ULL终结者屏幕背光调节例程程序设计
  17. Android 性能优化概述
  18. 数字信号处理实验线性卷积与循环卷积计算
  19. (61)Verilog生成vcd波形文件
  20. 警告关于测试人员的职场生存,千万要避开这5个坑(不看后悔)

热门文章

  1. 高德地图根据经纬度获取具体城市信息
  2. 直播开发平台、搭建直播系统平台基本的步骤
  3. 微信小程序封装api接口方法教程
  4. 单片机编程软件很简单(16),Keil单片机编程软件建立工程项目
  5. 程序员代码面试指南第二版 8.单调栈结构(普通及进阶)
  6. 手机组态软件_安卓平板组态软件​_移动端组态
  7. python常用库大全文库_Python库参考手册
  8. 架构图、流程图、结构图、功能图、逻辑图
  9. Optisystem中器件的学习(1-Visualizer Library、Sensors)
  10. 软考程序员资源免费分享