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

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

1、创建TowerView,继承View

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

  1. /**
  2. * author:liuzhitong
  3. * date:2022/9/2
  4. * description:
  5. */
  6. public class TowerView4 extends View {
  7. public TowerView4(Context context) {
  8. this(context,null);
  9. }
  10. public TowerView4(Context context, @Nullable AttributeSet attrs) {
  11. this(context, attrs,0);
  12. }
  13. public TowerView4(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
  14. super(context, attrs, defStyleAttr);
  15. }
  16. @Override
  17. protected void onSizeChanged(int w, int h, int oldw, int oldh) {
  18. super.onSizeChanged(w, h, oldw, oldh);
  19. towerX = w/2;
  20. towerY = h/2;
  21. radius = towerX;
  22. screenWidth = getContext().getResources().getDisplayMetrics().widthPixels;
  23. screenHeight = getContext().getResources().getDisplayMetrics().heightPixels;
  24. }
  25. @Override
  26. protected void onDraw(Canvas canvas) {
  27. super.onDraw(canvas);
  28. }

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

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

开始绘制出来

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

这里加了一个icon

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

  1. @Override
  2. public boolean onTouchEvent(MotionEvent event) {
  3. int rawX = (int) event.getX();
  4. int rawY = (int) event.getY();
  5. switch (event.getAction()) {
  6. case MotionEvent.ACTION_DOWN:
  7. lastX = rawX;
  8. lastY = rawY;
  9. break;
  10. case MotionEvent.ACTION_MOVE:
  11. offsetX = rawX - lastX;
  12. offsetY = rawY - lastY;
  13. left = getLeft()+ offsetX;
  14. top = getTop()+ offsetY;
  15. int right=getRight()+ offsetX;
  16. int bottom =getBottom()+ offsetY;
  17. //左边距离边框为0
  18. if(getLeft()+ offsetX<=0){
  19. left = 0;
  20. right = towerX*2;
  21. }
  22. if(right >= screenWidth){
  23. right = screenWidth;
  24. left =screenWidth - radius*2;
  25. }
  26. layout(left, top,right,bottom);
  27. break;
  28. case MotionEvent.ACTION_UP:
  29. //确定是拖拽
  30. break;
  31. }
  32. return isMove();
  33. }

ok,现在就可以拖拽了。

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

自定义View5 -塔防小游戏:第二篇防御塔随意放置的更多相关文章

  1. 自定义View4-塔防小游戏第一篇:一个防御塔+多个野怪(简易版)*

    塔防小游戏 第一篇:一个防御塔+多个野怪(简易版)    1.canvas画防御塔,妖怪大道,妖怪行走路线    2.防御塔攻击范围是按照妖怪与防御塔中心距离计算的,大于防御塔半径则不攻击,小于则攻击 ...

  2. 自定义View6 -塔防小游戏:第三篇防御塔随意放置+多组野怪

    第一篇:一个防御塔+多个野怪(简易版)第二篇:防御塔随意放置第三篇:防御塔随意放置+多组野怪 1.动态addView防御塔 2.防御塔放置后不可以移动 3.弯曲道路 4.素材替换 第四篇:多波野怪 第 ...

  3. Python制作塔防小游戏

    开发工具 Python版本:3.6.4 相关模块: pygame模块: 以及一些Python自带的模块.

  4. 编写Java程序,创建Dota游戏中的防御塔类,通过两个坐属性显示防御塔所在的位置

    返回本章节 返回作业目录 需求说明: 创建Dota游戏中的防御塔类 通过两个坐属性显示防御塔所在的位置 实现思路: 创建防御塔(TowerDefense)类 在该类中定义了两个属性,分别是int类型横 ...

  5. [译]终极塔防——运用HTML5从头创建一个塔防游戏

    翻译共享一篇CodeProject的高星力作,原文地址:http://www.codeproject.com/Articles/737238/Ultimate-Tower-Defense 下载演示项目 ...

  6. SpriteKit塔防游戏动态改变防御塔价格标签的颜色

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 本篇blog在DinoDefense塔防游戏基础之上做一处小的 ...

  7. unity3D游戏开发实战原创视频讲座系列9之塔防类游戏开发第一季

    解说文件夹 塔防游戏0基础篇... 第一讲  游戏演示和资源介绍... 第二讲  游戏场景的完毕... 第三讲  预制体的制作... 第四讲  敌人的随机产生和按路径行走... 第五讲  塔防工具的产 ...

  8. 通通制作Html5小游戏——第二弹(仿flappy bird像素鸟)

    亲爱的博友们,我又回来啦~因为我们技术宅的思想只有技术宅懂得,好不容易写了点好玩的东西发QQ空间,结果只有11的UV,0回复....10分钟ps一个女神的素描效果发QQ空间朋友圈,一大堆回复加赞,作为 ...

  9. 我的微信小程序第二篇

    在上一篇<我的微信小程序第一篇(入门)>中,很多人问我什么是微信小程序,在这里我要说一下这个是我的失误啦,我默认大家都知道微信小程序,其实可能行内人士都知道小程序,好多非行内朋友可能平时不 ...

随机推荐

  1. 在两台配置了Win10操作系统的电脑之间直接拷贝文件

    前提条件:需要一根网线 每台电脑需手动设置IP地址 设置IP地址随意,示例为:10.10.2.11 和 10.10.2.12 每台电脑需关闭Windows防火墙 测试网络是否连通 方式一 远程桌面连接 ...

  2. XSS攻击(笔记)

    XSS攻击 XSS概述 XSS即跨站脚本攻击,(Cross-Site Scripting, CSS),但是为了与层叠样式表(Cascading Style Sheets, CSS)缩写区分开来,所以命 ...

  3. raid划分及创建

    RAID 的划分 RAID 0 - RAID 0是最早出现的,是数据分条技术.组建磁盘阵列中最简单的一种形式,可以提高整个磁盘的性能和吞吐量,利用率100%,缺点:一但磁盘损坏,raid0将失效,数据 ...

  4. Mybatis+SpringBoot 项目All elements are null

    xml文件内容如下 查出来的集合长度是有的,但是会出现All elements are null 解决方案: 注意我的xml文件全部是这样的,并且我调用的sql返回值是  resultType=&qu ...

  5. Java ArrayList和LinkedList

    目录 集合的概念 集合体系结构 常用list集合 list集合的特点 ArrayList LinkedList 创建对象 常用方法 遍历 ArrayList和LinkedList的区别 集合的概念 ​ ...

  6. 使用Runnable和Callable接口实现多线程的区别

    使用Runnable和Callable接口实现多线程的区别 先看两种实现方式的步骤: 1.实现Runnable接口 public class ThreadDemo{ public static voi ...

  7. JUC源码学习笔记1——AQS和ReentrantLock

    笔记主要参考<Java并发编程的艺术>并且基于JDK1.8的源码进行的刨析,此篇只分析独占模式,后续在ReentrantReadWriteLock和 CountDownLatch中 会重点 ...

  8. Nginx配置解决NetCore的跨域

    使用Nginx配置解决NetCore的跨域 废话不多说,直接上Nginx配置 server { listen 80; server_name 你的Id或域名; location / { add_hea ...

  9. k8s的部署

    一.k8s的二进制部署 1.环境准备: IP                               节点 172.16.10.1         k8s-master01 172.16.10.3 ...

  10. 「Python实用秘技09」更好用的函数运算缓存

    本文完整示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/PythonPracticalSkills 这是我的系列文章「Python实用秘技」的第9期 ...