android studio飞机大战游戏带注释源码教程(多线程)
第一次发博客,学了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飞机大战游戏带注释源码教程(多线程)相关推荐
- Android studio飞机大战游戏分析-月末总结
整体实现思路 绘制循环滚动的背景图片创建BackGround类 绘制飞机和子弹.创建Myplane和Bullet类 在Myplane中构造isCollision绘制飞机与boss飞机的碰撞,飞机与子弹 ...
- Python3+pygame实现有趣好玩的飞机大战游戏(附源码及素材)
版权声明:原创不易,本文禁止抄袭.转载,侵权必究! 目录 一.开发环境 二.功能模块 三.游戏效果 四.完整项目下载 五.作者Info 一.开发环境 开发环境 :Windows10 Python3.6 ...
- Python实现飞机大战-第二部分(附源码、素材、超详细教程)
飞机大战第二部分 1.前言 2.飞机射击 2.1.添加子弹的相关设置 2.2.创建文件bullet.py 2.3.修改game_functions.py 2.4.修改mian.py 2.5.射击效果 ...
- android ctrl 左键鼠标左键直接打开xml文件夹,设置Android Studio通过Ctrl+左键查看源码...
开始学习android的时候希望能点进系统提供的控件中查看源码,但是实际操作发现,看到的每个源文件方法都是抛出的Exception,所以想要设置成可以直接查看具体实现,记录下我自己的操作方法. 1.首 ...
- 畅玩mt3单机游戏服务器维护,【梦幻西游】MT3仿端手工游戏服务端源码[教程+授权物品后台]...
[梦幻西游]MT3仿端手工游戏服务端源码[教程+授权物品后台] 架设教程 系统:CentOS 6.8 64位 1.关闭防火墙 chkconfig iptables off service iptab ...
- 基于Android的飞机大战游戏的设计与实现
在2007年11月5日谷歌公司发布了一款全新的面向智能移动端设备的操作系统,这就是Android.经历了几年市场的洗礼,Android凭借其优异的性能占据了大部分智能手机市场.根据最新的调查显示,An ...
- Android Studio 飞机大战
1.整体实现思路 实现飞机大战的简单思路: ①要先建MySurfaceView这个类,在这个类中绘制画布,有画布的高度和宽度,还有画笔,然后在这个建好的画布上开始继续"作画"画布利 ...
- 飞机大战java代码_[源码和文档分享]Java飞机大战游戏设计与实现
1 概述 1.1 项目简介 本次Java课程设计是做一个飞机大战的游戏,应用Swing编程,完成一个界面简洁流畅.游戏方式简单,玩起来易于上手的桌面游戏.该飞机大战项目运用的主要技术即是Swing编程 ...
- Android Studio打包原生Java影视APP源码
用Android Studio环境,搭建一个原生Java影视APP源码,各种功能也不错,就是有一点小bug Android Studio安装环境如果有人不会的,可能百度一下,看情况可能下次会出一个An ...
- 从零开始用js手写飞机大战全过程(附源码)
plane game 前言 此文章帮助初学者学习制作一个简单小游戏 目标 利用css,html,js制作出飞机大战的简略版 前置准备 1. 绝对定位与相对定位 这里除了背景都设置为绝对定位,使飞机和敌 ...
最新文章
- thinkphp5是不是php,我对ThinkPHP5和Laravel5的一些看法
- vim去掉windows文本的多余的回车符(^M)
- APUE学习之多线程编程(二):线程同步
- Oracle SQL语句大全(三)
- 557. 反转字符串中的单词 III
- 终结“永恒之蓝”后,再战“永恒之黑”
- Deltix Round, Summer 2021 (open for everyone, rated, Div. 1 + Div. 2)
- keras实现嘴唇图像autoencoder
- 小数分数转换c语言,这是把小数转换成分数的程序,可是输入0.6666无限循环
- [转载]Java并发编程:深入剖析ThreadLocal
- C++编程语言中整型转换为字符串类型的方法
- jQuery实现瀑布流
- Atitit 微服务 分布式 区别 微服务的判断标准 目录 1.1. 区别 微服务侧重于微小服务进程隔离级别,分布式侧重于机器隔离	1 2. 微服务是一种架构, 。多微才叫微?	1 2.1. 微服务
- 在线职业教育高保真移动端Axure原型模板
- ae 的动画导出为html,Bodymovin v5.5.5 AE脚本可以导出json格式在Web动画制作工具
- i.MX6ULL终结者屏幕背光调节例程程序设计
- Android 性能优化概述
- 数字信号处理实验线性卷积与循环卷积计算
- (61)Verilog生成vcd波形文件
- 警告关于测试人员的职场生存,千万要避开这5个坑(不看后悔)
热门文章
- 高德地图根据经纬度获取具体城市信息
- 直播开发平台、搭建直播系统平台基本的步骤
- 微信小程序封装api接口方法教程
- 单片机编程软件很简单(16),Keil单片机编程软件建立工程项目
- 程序员代码面试指南第二版 8.单调栈结构(普通及进阶)
- 手机组态软件_安卓平板组态软件​_移动端组态
- python常用库大全文库_Python库参考手册
- 架构图、流程图、结构图、功能图、逻辑图
- Optisystem中器件的学习(1-Visualizer Library、Sensors)
- 软考程序员资源免费分享