//注册一个游戏实体 public void Register(QObj qObj, Transform transform) { qObj.SetID(++cnt); //设置ID EntityMap.Add(qObj.id, qObj); //添加到字典中 TransfromMap.Add(qObj.id, transform); quadTree.AddObj(qObj); //添加到树中 }
private void HandleNote(int i, QObj qObj) { float time = qObj.noteData.Time; Judgement judgement = JudgeGap(time - Time.time); if (judgement == Judgement.NONE) { return; } IncreaseScore(scoreRate[(int)judgement]); ApplyHealth(healthRecovers[(int)judgement]); uICon.JudgeEffect(judgeString[(int)judgement], time - Time.time); if (judgement != Judgement.BAD) { IncreaseCombo(); } else { ResetCombo(); } notesByLines[i].Dequeue().gameObject.SetActive(false); }
public void AddObj(QObj obj) { //这个是调用绘制类在scene窗口绘制矩形 可以无视 后面会给实现 DrawLine.Instance.AddDrawObj(obj.id, obj.rect.o, ref obj.rect.Rwidth, ref obj.rect.Rheight, deep); obj.locate = this; //设置这个碰撞盒的所在节点 为当前四叉树节点 if (childs == null) //如果子节点不存在 说明还没有分割 { objs.Add(obj); //添加到list中 if (deep <= 5 && objs.Count > maxSum) //如果深度到达某个阈值(这里是5),并且管理的物体对象数量超过最大值 { Split(); //调用分割函数 下面给出实现 } } else //如果子节点存在,说明这个四叉树节点不是叶子节点 { int index = GetIndex(obj);//获取所在对应子节点的想象 if (index >= 0) { childs[index].AddObj(obj);//调用该子节点的添加方法 } else//如果象限小于 那就是这个物体在分界线上,因此属于该节点管理 { objs.Add(obj); } } }
public void Collide(QObj obj, ref Point rem) { for (int i = objs.Count - 1; i >= 0; i--) { if (obj.id != objs[i].id) { obj.Collide(objs[i], ref rem); } } if (childs != null) { foreach (QuadTree child in childs) { for (int i = child.objs.Count - 1; i >= 0; i--) { if (obj.id != child.objs[i].id) { obj.Collide(child.objs[i], ref rem); } } } } if (father != null) { for (int i = father.objs.Count - 1; i >= 0; i--) { if (obj.id != father.objs[i].id) { obj.Collide(father.objs[i], ref rem); } } } }
//在实体的循环中调用,是物体主动移动,这时候需要更改碰撞盒的位置 public void ChangePoint(int id, Vector3 point) //改变点的信息 但不移动 { tempQObj = EntityMap[id]; tempQObj.rect.o.x = point.x; tempQObj.rect.o.y = point.z; //这个是绘制在Scene窗口的一个类 DrawLine.Instance.ChangeADrawObj(ref id); }
public LongObj() { isInLongNote = false; judgement = Judgement.NONE; qObj = null; endTime = -1; tick = new Queue <float>(); }
//在实体的碰撞修复时调用,是物体被动移动,这时候需要更改物体的位置 public void ChangePoint(int id, Point point)//改变点的信息 移动 { tempQObj = EntityMap[id]; tempTransform = TransfromMap[id]; tempQObj.rect.o.x = point.x; tempQObj.rect.o.y = point.y; tempTransform.position = new Vector3((float)point.x, tempTransform.position.y, (float)point.y); //这个是绘制在Scene窗口的一个类 DrawLine.Instance.ChangeADrawObj(ref id); }
public bool Collide(QObj obj, ref Point rem) { float offsetX = (float)((rect.o.x - obj.rect.o.x) / (obj.rect.Rwidth + rect.Rwidth)), offsetY = (float)((rect.o.y - obj.rect.o.y) / (obj.rect.Rheight + rect.Rheight)); if (Mathf.Abs(offsetX) < 1 && Mathf.Abs(offsetY) < 1) { if (!isTrigger && !obj.isTrigger) { rem = rect.o; if (Mathf.Abs(offsetX) >= Mathf.Abs(offsetY)) { rem.x = obj.rect.o.x; if (offsetX >= 0) { rem.x += (obj.rect.Rwidth + rect.Rwidth); } else { rem.x -= (obj.rect.Rwidth + rect.Rwidth); } } else { rem.y = obj.rect.o.y; if (offsetY >= 0) { rem.y += (obj.rect.Rheight + rect.Rheight); } else { rem.y -= (obj.rect.Rheight + rect.Rheight); } } QEntityManager.Instance.ChangePoint(id, rem); if (OnCollision != null) { OnCollision(qEntity, obj.qEntity); } if (obj.OnCollision != null) { obj.OnCollision(qEntity, obj.qEntity); } } if (obj.OnTrigger != null) { obj.OnTrigger(qEntity, obj.qEntity); } return(true); } return(false); }
public void OnStartQuest() { IsInProgress = true; IsComplete = false; CurrentQuest = this; CurrentObjective = Objectives [0]; GUIEd.Instance.ObjectiveName.gameObject.SetActive(true); GUIEd.Instance.ObjectiveDescription.gameObject.SetActive(true); GUIEd.Instance.ObjectiveDone.gameObject.SetActive(false); GUIEd.Instance.ObjectiveDone.text = ObjectiveDone; GUIEd.Instance.ObjectiveName.text = CurrentObjective.ObjectiveName; GUIEd.Instance.ObjectiveDescription.text = CurrentObjective.ObjectiveDescription; }
private void Awake() { //优先读取图片的宽高 if (GetComponent <SpriteRenderer>() != null) { self = new QObj(new Point(transform.position.x, transform.position.z), GetComponent <SpriteRenderer>().bounds.size.x, GetComponent <SpriteRenderer>().bounds.size.z); } else { self = new QObj(new Point(transform.position.x, transform.position.z), weight, hight); } self.isTrigger = isTrigger; self.qEntity = this; //初始化的时候,记录位置 remain = new Point(self.rect.o.x, self.rect.o.y); }
public int GetIndex(QObj target) { //如果在分界轴上,返回-1 if (Mathf.Abs((float)(target.rect.o.x - rect.o.x)) < target.rect.Rwidth || Mathf.Abs((float)(target.rect.o.y - rect.o.y)) < target.rect.Rheight) { return(-1); } for (int i = 0; i < 4; i++)//遍历四个子节点,调用isInclude去判断 { if (childs[i].rect.IsInclude(target.rect)) { return(i);//返回对应的象限号 } } return(-1); }
public void IsHere(QObj target) { //判断是否包含在矩形范围内 if (rect.IsInclude(target.rect)) { //如果包含,就查出可不可以添加到子节点里 if (childs == null) { return; } int index = GetIndex(target); if (index >= 0) { if (objs.Count > 0) { for (int i = objs.Count - 1; i >= 0; i--) { if (target.id == objs[i].id) { childs[index].AddObj(objs[i]); //添加到子节点 objs.Remove(objs[i]); //从自身移除 break; } } } } } else//不在矩形范围内 说明物体可能移动出去了 { if (objs.Count > 0) { for (int i = objs.Count - 1; i >= 0; i--) { if (target.id == objs[i].id) //尝试找到是不是在自身的管理物体列表里 如果存在 那么的确是从自身范围移动出去的 { objs.Remove(objs[i]); //移除 if (father != null) { father.AddObj(target);//添加到父物体中 调用AddObj的时候 会自动添加到父物体对应的子节点里 } break; } } } } }
public void ChangeADrawObj(ref int id) { if (!qObjs.ContainsKey(id)) { return; } QObj obj = QEntityManager.Instance.GetPiont(ref id); Vector3[] temp; qObjs.TryGetValue(id, out temp); temp[0].x = (float)(obj.rect.o.x - obj.rect.Rwidth); temp[0].z = (float)(obj.rect.o.y - obj.rect.Rheight); temp[1].x = (float)(obj.rect.o.x - obj.rect.Rwidth); temp[1].z = (float)(obj.rect.o.y + obj.rect.Rheight); temp[2].x = (float)(obj.rect.o.x + obj.rect.Rwidth); temp[2].z = (float)(obj.rect.o.y + obj.rect.Rheight); temp[3].x = (float)(obj.rect.o.x + obj.rect.Rwidth); temp[3].z = (float)(obj.rect.o.y - obj.rect.Rheight); }
private void JudgePlayInput() { for (int i = 0; i < sheetM.modeLine; i++) { if (notesByLines[i].Count == 0) { continue; } if (Input.GetKeyDown(inputM.KeyCodes[i])) { QObj peek = notesByLines[i].Peek(); audioM.PlayAudioClip(peek.noteData.audioCode); if (peek.noteData is LongNoteData && LongObjs[i].isInLongNote == false) { LongObjs[i].qObj = peek; HandleLongNoteDown(i); } else { HandleNote(i, peek); } } else if (Input.GetKey(inputM.KeyCodes[i]) && LongObjs[i].isInLongNote) { HandleLongNote(i); } else if (Input.GetKeyUp(inputM.KeyCodes[i]) && LongObjs[i].isInLongNote) { HandleLongNoteUp(i); } } }
private void OnDestroy() { self.qEntity = null;//解除循环引用 self = null; }
void Awake() { Instance = this; }