コード例 #1
0
 //注册一个游戏实体
 public void Register(QObj qObj, Transform transform)
 {
     qObj.SetID(++cnt);            //设置ID
     EntityMap.Add(qObj.id, qObj); //添加到字典中
     TransfromMap.Add(qObj.id, transform);
     quadTree.AddObj(qObj);        //添加到树中
 }
コード例 #2
0
ファイル: GameManager.cs プロジェクト: CYAN4S/Minirhythm
    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);
    }
コード例 #3
0
 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);
         }
     }
 }
コード例 #4
0
 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);
             }
         }
     }
 }
コード例 #5
0
 //在实体的循环中调用,是物体主动移动,这时候需要更改碰撞盒的位置
 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);
 }
コード例 #6
0
ファイル: GameManager.cs プロジェクト: CYAN4S/Minirhythm
 public LongObj()
 {
     isInLongNote = false;
     judgement    = Judgement.NONE;
     qObj         = null;
     endTime      = -1;
     tick         = new Queue <float>();
 }
コード例 #7
0
 //在实体的碰撞修复时调用,是物体被动移动,这时候需要更改物体的位置
 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);
 }
コード例 #8
0
    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);
    }
コード例 #9
0
ファイル: QuestO.cs プロジェクト: FixDisk/681F
    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;
    }
コード例 #10
0
 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);
 }
コード例 #11
0
 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);
 }
コード例 #12
0
 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;
                 }
             }
         }
     }
 }
コード例 #13
0
    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);
    }
コード例 #14
0
ファイル: GameManager.cs プロジェクト: CYAN4S/Minirhythm
    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);
            }
        }
    }
コード例 #15
0
 private void OnDestroy()
 {
     self.qEntity = null;//解除循环引用
     self         = null;
 }
コード例 #16
0
 void Awake()
 {
     Instance = this;
 }