在新弄一个选框的Sprite当作一个新的预制体,新建GameManager脚本,控制象棋的走棋

Update函数主要逻辑:

当鼠标点击时触发

1、若没有被选中的棋子,则判断此次点击的是否是棋子,若是,则选中它;

2、若有被选中的棋子,则判断此次点击的是否是棋子,若是,扔掉当前位置上的棋子,并将选中的棋子移动到当前位置;若不是,则移动选中的棋子到当前位置。取消选中;

using UnityEngine;
using System.Collections;
using UnityEngine.EventSystems;public class GameManager : MonoBehaviour {//被选中的棋子的IDpublic int selectedId;//实例化被选中时的Sprite(一个选框)public GameObject fab_selected;public GameObject Selected;//音乐文件public AudioSource clickMusic;// Use this for initializationvoid Start () {}void Awake(){//初始化selected物体并设置为disabledSelected = Instantiate(fab_selected, transform.localPosition, Quaternion.identity) as GameObject;Selected.transform.position = new Vector3(0, 0, 0);Selected.name = "Selected";Selected.SetActive(false);}// Update is called once per framevoid Update () {//当鼠标点击时if (Input.GetMouseButtonDown(0)){//摄像机到点击位置的射线Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);RaycastHit hit;//Debug.Log(selectedId);if (Physics.Raycast(ray, out hit) && hit.point.x > -2.29 && hit.point.x < 2.29 && hit.point.y > -2.6 && hit.point.y < 2.5){//若当前没有选中棋子if (selectedId == -1){// 若点击的位置上有棋子// 1.获取选中的棋子的ID// 2.生成一个新的Sprite(Selected),代表其选中的是该棋子if (hit.collider.gameObject.name != "Bcakground"){                       selectedId = int.Parse(hit.collider.gameObject.name);Selected.transform.position = new Vector3(StoneManager.s[selectedId]._x, StoneManager.s[selectedId]._y, 0);Selected.SetActive(true);}}//当前有选中的棋子else{// 若点击的位置上没有棋子// 1.将选中的棋子移至当前位置// 2.播放音效// 3.置selectedId为-1// 4.将Selected隐藏if (hit.collider.gameObject.name == "Bcakground"){//Debug.Log("hit.point:"+hit.point);GameObject Stone = GameObject.Find(selectedId.ToString());Stone.transform.position = Center(hit.point);if (!clickMusic.isPlaying){clickMusic.Play();}selectedId = -1;Selected.SetActive(false);}// 若点击的位置上没有棋子// 1.判断当前位置上的棋子是否为当前被选中的棋子,若不是则执行下一步// 2.将当前位置上的棋子吃掉// 3.将选中的棋子移至当前位置// 4.播放音效// 5.置selectedId为-1// 6.将Selected隐藏else{int destoryId = int.Parse(hit.collider.gameObject.name);//Debug.Log("destoryId:" + destoryId);//Debug.Log("selectedId:" + selectedId);if (destoryId != selectedId){StoneManager.s[destoryId]._dead = true;hit.collider.gameObject.SetActive(false);GameObject Stone = GameObject.Find(selectedId.ToString());Stone.transform.position = Center(hit.point);if (!clickMusic.isPlaying){clickMusic.Play();}selectedId = -1;Selected.SetActive(false);}                                   }}}}}/// <summary>/// 通过鼠标点击的位置,获取距离当前坐标点最近的中心点的位置/// </summary>/// <param name="point"></param>/// <returns></returns>Vector3 Center(Vector3 point){//x,y,z为要返回的三维坐标//将象棋分为9列(i)和10行(j)//计算距离鼠标所指坐标点的最近的行列的序号(tpmi、tmpj)//通过行列的序号算出位于该行该列的中心点的坐标位置并返回//修改棋子的位置(StoneManager.s[selectedId]._x、StoneManager.s[selectedId]._y)属性float x, y,z=0;int i, tmpi=1,j,tmpj=1;double min=0.51f;for (i = -4; i < 5;++i ){if (System.Math.Abs(point.x - i * 0.51) < min){min =System.Math.Abs(point.x - i * 0.51);tmpi = i;                }}x = (float)(tmpi * 0.51);min = 0.51f;if (point.y > -0.04){for (j = 0; j < 5; j++){if (System.Math.Abs(point.y - (j * 0.51+0.21)) < min){min = System.Math.Abs(point.y - (j * 0.51 + 0.21));tmpj = j;}}y = (float)(tmpj * 0.51 + 0.21);}else{for (j = 0; j < 5; j++){if (System.Math.Abs(point.y + (j * 0.51+0.31)) < min){min = System.Math.Abs(point.y + (j * 0.51+0.31));tmpj = j;                   }}y = (float)(-tmpj * 0.51 - 0.31);}//Debug.Log("point.y:" + point.y);//Debug.Log("y:"+y);StoneManager.s[selectedId]._x = x;StoneManager.s[selectedId]._y = y;return new Vector3(x, y, z);}
}

Unity中国象棋(二)——走棋相关推荐

  1. qt pcl设置镜头初始位置_Qt中国象棋二——棋盘与棋子的绘制

    上次和大家分享了Qt的2D绘图基础知识,这样可以更好地理解象棋中一些关于绘图的程序.这次要和大家分享的则是棋盘与棋子的绘制,也可以说是Qt 2D绘图的一些具体应用. 源程序是我在网上找的,而且是下载了 ...

  2. java中国象棋棋盘放置棋子,Qt中国象棋二——棋盘与棋子的绘制

    上次和大家分享了Qt的2D绘图基础知识,这样可以更好地理解象棋中一些关于绘图的程序.这次要和大家分享的则是棋盘与棋子的绘制,也可以说是Qt 2D绘图的一些具体应用. 源程序是我在网上找的,而且是下载了 ...

  3. Qt中国象棋二——棋盘与棋子的绘制

    上次和大家分享了Qt的2D绘图基础知识,这样可以更好地理解象棋中一些关于绘图的程序.这次要和大家分享的则是棋盘与棋子的绘制,也可以说是Qt 2D绘图的一些具体应用. 源程序是我在网上找的,而且是下载了 ...

  4. Unity中国象棋(三)——各类棋子规则

    首先,新建一个RuleManager脚本,写下各类棋子的走棋规则,先贴上脚本 public class RuleManager : MonoBehaviour {/// <summary> ...

  5. Unity中国象棋(一)——初始化棋子

    新建一个plane,作为背景,新建一个StoneManager脚本,挂在plane上 初始化32个棋子,每个棋子自带6个属性值:ID,x轴的坐标位置,y轴的坐标位置,是否为红子,是否死亡,棋子的类型. ...

  6. 中国象棋程序的设计与实现(十二)--棋盘绘制算法(尽管注释非常详细,完全理解仍有难度)

    上几篇中,我们详细介绍了,棋盘类的定义和关键属性,简要介绍了棋盘绘制算法的骨架. 本篇,我们将详细解读棋盘绘制算法的每一个细节. 强烈建议,大家结合文章末尾的"棋盘截图"来思考绘制 ...

  7. Java实践(十二)——中国象棋

    一.实践目的: 1.鼠标点击.拖动等事件的应用与区别 2.棋谱文件的保存与读取 3.完善象棋的规则. 二.实践内容: 中国象棋历史悠久,吸引了无数的人研究,现对中国象棋的对战和实现棋谱的制作做如下的设 ...

  8. Cocos2d-X开发中国象棋《九》走棋规则

    在上一节中实现了走棋,这篇博客将介绍中国象棋中的走棋规则 在写博客前先可能一下象棋的走棋规则: 1)将 将的坐标关系:横坐标相等,纵坐标相减绝对值等于1,或者纵坐标相等,横坐标相减绝对值等于1 将的特 ...

  9. 中国象棋游戏Chess(3) - 实现走棋规则

    棋盘的绘制和走棋参看博文:中国象棋游戏Chess(1) - 棋盘绘制以及棋子的绘制,中国象棋游戏Chess(2) - 走棋 现在重新整理之前写的代码,并且对于每个棋子的走棋规则都进行了限制,不像之前那 ...

最新文章

  1. 火狐拓展开发 基础知识
  2. pandas判断日期是否是闰年(is_leap_year)实战: 数据列转化为日期(时间)格式、判断pandas的日期数据列是否是闰年
  3. 可扩展且侵入性最小的脑机接口平台
  4. 皮一皮:这是什么鬼畜产品!
  5. Git for Windows 2.13.1(2) 发布,分布式版本控制系统
  6. python corr画图_用一张很丑的图学习Python数据可视化基础--热力图
  7. 解决冲突神器(maven helper)
  8. android 串口调试adb,Android系统 debug 技巧(最全最强adb 串口调试命令)
  9. 深入浅出设计模式——解释器模式(Interpreter Pattern)
  10. ae插件form_AE插件 | 没有这些插件,还想做特效?
  11. Linux下VsFTP和ProFTP用户管理高级技巧 之一
  12. IDEA Junit测试
  13. C#调用C语言生成的DLL“未找到入口”
  14. 硬盘的老化测试软件,扩容卡检测、扩容U盘检测工具(MyDiskTest)
  15. 普渡大学电子和计算机工程专业,2020年普渡大学热门专业
  16. 多路耦合器(有源分离器)在无线通讯中的应用
  17. dxf制作kml_kml到dxf
  18. 如何制作网页教程:如何制作网页最简单的方法
  19. matlab kmeans 质心,KMeans_SPD_Matrices
  20. Open SQL LEFT与RIGHT函数

热门文章

  1. 梯度下降法算法比较和进一步优化
  2. js删除数组指定的某个值或元素
  3. 分布式技术原理与实战45讲--05 第05讲:共识问题:区块链如何确认记账权?
  4. 《关于我同学拿我照片网恋这件事所引发的学习之旅》(1)
  5. 张先轶博士(OpenBLAS开源项目发起人,PerfXLab创始人)的采访录,中关村管委会千帆计划之“创见新面孔”专题采访活动
  6. __virtual__ returned False: cannot import name certs ---saltstack异常解决
  7. Web前端开发入门学习分享
  8. 用c语言编写打印机输出程序,C语言编写银行打印程序实例参考
  9. 展现巨星风采!字母哥关键时刻挺身而出
  10. 程序员如何巧用Excel提高工作效率