第一篇:一个防御塔+多个野怪(简易版)
第二篇:防御塔随意放置
自定义View,处理事件分发,up,move,down。
第三篇:防御塔随意放置+多组野怪
第四篇:多波野怪
第五篇:杀死野怪获得金币
第六篇:防御塔可升级,增强攻击力,增大射程

先上图片,防御塔放置,需要注意的是1、放置后刷新view会导致防御塔回到起点。2、防御塔一旦放置就无法移动,只能拆除,这才符合塔防的规则。问题会在下篇解决

1、创建TowerView,继承View

我这里命名为TowerView4,下面代码为通用继承View后的代码。

/**
* author:liuzhitong
* date:2022/9/2
* description:
*/
public class TowerView4 extends View { public TowerView4(Context context) {
this(context,null);
} public TowerView4(Context context, @Nullable AttributeSet attrs) {
this(context, attrs,0);
} public TowerView4(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr); } @Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
towerX = w/2;
towerY = h/2;
radius = towerX;
screenWidth = getContext().getResources().getDisplayMetrics().widthPixels;
screenHeight = getContext().getResources().getDisplayMetrics().heightPixels;
} @Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
}

我们需要知道防御塔的属性,x,y轴,半径(攻击范围)等

public int towerX,towerY;//防御塔坐标
private Paint paint;//防御塔范围画笔
public int radius;//防御塔攻击范围
public int lastX,lastY;//拖拽时down的坐标
private int offsetX;
private int offsetY;
private int screenWidth;//屏幕宽度
private int screenHeight;
private boolean move=true;//是否可移动
private int left;
private int top; public TowerView4(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
paint = new Paint();
paint.setColor(0xffFFcAF9);
paint.setAntiAlias(true);
paint.setStrokeWidth(2f);
paint.setStyle(Paint.Style.STROKE); }

开始绘制出来

@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
canvas.drawCircle(towerX,towerY,radius,paint);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.pao1);
canvas.drawBitmap(bitmap,towerX,towerY,paint);
}

这里加了一个icon

然后拖拽我们需要在onTouchEvent中,移动很简单,我就直接上代码了

@Override
public boolean onTouchEvent(MotionEvent event) {
int rawX = (int) event.getX();
int rawY = (int) event.getY();
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
lastX = rawX;
lastY = rawY;
break;
case MotionEvent.ACTION_MOVE:
offsetX = rawX - lastX;
offsetY = rawY - lastY;
left = getLeft()+ offsetX;
top = getTop()+ offsetY;
int right=getRight()+ offsetX;
int bottom =getBottom()+ offsetY;
//左边距离边框为0
if(getLeft()+ offsetX<=0){
left = 0;
right = towerX*2;
}
if(right >= screenWidth){
right = screenWidth;
left =screenWidth - radius*2;
} layout(left, top,right,bottom);
break;
case MotionEvent.ACTION_UP:
//确定是拖拽
break;
}
return isMove();
}

ok,现在就可以拖拽了。

持续书写中........

最新文章

  1. linux内核分析作业8:理解进程调度时机跟踪分析进程调度与进程切换的过程
  2. Contact项目梳理
  3. PHP实现观察者模式
  4. Flask生成SECRET_KEY(密钥)的一种简单方法
  5. sourceTree忽略跟踪文件
  6. MS SQL还原备份数据出错
  7. MySql5.6 Window超详细安装教程
  8. 转——Android应用开发性能优化完全分析
  9. Java 核心内容相关面试题【1】
  10. Ubuntu最常见的包问题
  11. Centos7安装搭建FTP服务器(最简便方法)
  12. Android 开发学习笔记
  13. java去除字符串的空格,换行符,水平制表符,回车
  14. if 语句 写了return 报错
  15. ActiveMQ消息持久化存储策略
  16. RR和RC复合语句加锁
  17. 虹软人脸识别iOS SDK2.0
  18. 《Cocos2d-x游戏开发实战精解》学习笔记4--实战一个简单的钢琴
  19. 安装xenserver6.5
  20. WebSocket 在烧瓶和龙卷风中的应用

热门文章

  1. jenkins安装配置及发布
  2. Excel表函数自动生成SQL
  3. python是什么?工作前景如何?怎么算有基础?爬数据违法嘛......
  4. Python词频分析
  5. 在CDH webUI中部署HDFS HA
  6. 2506-nginx的配置-域名分发与负载均衡(只有配置无原理)
  7. 安卓手机如何无线连接adb?
  8. Odoo14 rpc
  9. 华为分析&amp;联运活动,助您提升游戏总体付费
  10. Java连接数据库从入门到入土