
1.制作障碍系统 (1.制作几种类型的障碍物的预制体 ((*.编写障碍物基类,以下几种均继承自基类,含碰撞体,RememberY(生成障碍物时该有多大的Y) ((1.矮障碍,仅碰撞体 ((2.高障碍,仅碰撞体 ((3.可冲破障碍 (((1.除基本碰撞体外,额外包含一个触发器,比碰撞体先检测到马,同时获取马的x速度,大于阈值则给障碍做破碎,用马的力度决定破碎力,关闭碎块和马的碰撞 (((*.导入某2D破碎插件 ((4.人马分离障碍 (((WAIT,需要等待人马分离系统先搭建 (2.编写障碍物生成系统 ((1.每若干时间,生成一个随机一种障碍,若干的范围可控 (((1.设计协程,从预制体列表中随机出一种,并在计算好的位置实例化,随后等待范围内的若干时间,然后检查马的存活情况,若马仍存活,重新调用本协程 ((2.生成的位置:x在相机右侧若干不变距离,y根据障碍物的不同而不同,需要计算保存。 (3.编写障碍物消亡系统 ((1.每个障碍物和碎片都会在离开镜头后被删除
157 lines
3.8 KiB
C#
157 lines
3.8 KiB
C#
using UnityEngine;
|
|
using Delaunay.Utils;
|
|
|
|
namespace Delaunay
|
|
{
|
|
|
|
internal sealed class EdgeList: Utils.IDisposable
|
|
{
|
|
private float _deltax;
|
|
private float _xmin;
|
|
|
|
private int _hashsize;
|
|
private Halfedge[] _hash;
|
|
private Halfedge _leftEnd;
|
|
public Halfedge leftEnd {
|
|
get { return _leftEnd;}
|
|
}
|
|
private Halfedge _rightEnd;
|
|
public Halfedge rightEnd {
|
|
get { return _rightEnd;}
|
|
}
|
|
|
|
public void Dispose ()
|
|
{
|
|
Halfedge halfEdge = _leftEnd;
|
|
Halfedge prevHe;
|
|
while (halfEdge != _rightEnd) {
|
|
prevHe = halfEdge;
|
|
halfEdge = halfEdge.edgeListRightNeighbor;
|
|
prevHe.Dispose ();
|
|
}
|
|
_leftEnd = null;
|
|
_rightEnd.Dispose ();
|
|
_rightEnd = null;
|
|
|
|
int i;
|
|
for (i = 0; i < _hashsize; ++i) {
|
|
_hash [i] = null;
|
|
}
|
|
_hash = null;
|
|
}
|
|
|
|
public EdgeList (float xmin, float deltax, int sqrt_nsites)
|
|
{
|
|
_xmin = xmin;
|
|
_deltax = deltax;
|
|
_hashsize = 2 * sqrt_nsites;
|
|
|
|
_hash = new Halfedge[_hashsize];
|
|
|
|
// two dummy Halfedges:
|
|
_leftEnd = Halfedge.CreateDummy ();
|
|
_rightEnd = Halfedge.CreateDummy ();
|
|
_leftEnd.edgeListLeftNeighbor = null;
|
|
_leftEnd.edgeListRightNeighbor = _rightEnd;
|
|
_rightEnd.edgeListLeftNeighbor = _leftEnd;
|
|
_rightEnd.edgeListRightNeighbor = null;
|
|
_hash [0] = _leftEnd;
|
|
_hash [_hashsize - 1] = _rightEnd;
|
|
}
|
|
|
|
/**
|
|
* Insert newHalfedge to the right of lb
|
|
* @param lb
|
|
* @param newHalfedge
|
|
*
|
|
*/
|
|
public void Insert (Halfedge lb, Halfedge newHalfedge)
|
|
{
|
|
newHalfedge.edgeListLeftNeighbor = lb;
|
|
newHalfedge.edgeListRightNeighbor = lb.edgeListRightNeighbor;
|
|
lb.edgeListRightNeighbor.edgeListLeftNeighbor = newHalfedge;
|
|
lb.edgeListRightNeighbor = newHalfedge;
|
|
}
|
|
|
|
/**
|
|
* This function only removes the Halfedge from the left-right list.
|
|
* We cannot dispose it yet because we are still using it.
|
|
* @param halfEdge
|
|
*
|
|
*/
|
|
public void Remove (Halfedge halfEdge)
|
|
{
|
|
halfEdge.edgeListLeftNeighbor.edgeListRightNeighbor = halfEdge.edgeListRightNeighbor;
|
|
halfEdge.edgeListRightNeighbor.edgeListLeftNeighbor = halfEdge.edgeListLeftNeighbor;
|
|
halfEdge.edge = Edge.DELETED;
|
|
halfEdge.edgeListLeftNeighbor = halfEdge.edgeListRightNeighbor = null;
|
|
}
|
|
|
|
/**
|
|
* Find the rightmost Halfedge that is still left of p
|
|
* @param p
|
|
* @return
|
|
*
|
|
*/
|
|
public Halfedge EdgeListLeftNeighbor (Vector2 p)
|
|
{
|
|
int i, bucket;
|
|
Halfedge halfEdge;
|
|
|
|
/* Use hash table to get close to desired halfedge */
|
|
bucket = (int)((p.x - _xmin) / _deltax * _hashsize);
|
|
if (bucket < 0) {
|
|
bucket = 0;
|
|
}
|
|
if (bucket >= _hashsize) {
|
|
bucket = _hashsize - 1;
|
|
}
|
|
halfEdge = GetHash (bucket);
|
|
if (halfEdge == null) {
|
|
for (i = 1; true; ++i) {
|
|
if ((halfEdge = GetHash (bucket - i)) != null)
|
|
break;
|
|
if ((halfEdge = GetHash (bucket + i)) != null)
|
|
break;
|
|
}
|
|
}
|
|
/* Now search linear list of halfedges for the correct one */
|
|
if (halfEdge == leftEnd || (halfEdge != rightEnd && halfEdge.IsLeftOf (p))) {
|
|
do {
|
|
halfEdge = halfEdge.edgeListRightNeighbor;
|
|
} while (halfEdge != rightEnd && halfEdge.IsLeftOf(p));
|
|
halfEdge = halfEdge.edgeListLeftNeighbor;
|
|
} else {
|
|
do {
|
|
halfEdge = halfEdge.edgeListLeftNeighbor;
|
|
} while (halfEdge != leftEnd && !halfEdge.IsLeftOf(p));
|
|
}
|
|
|
|
/* Update hash table and reference counts */
|
|
if (bucket > 0 && bucket < _hashsize - 1) {
|
|
_hash [bucket] = halfEdge;
|
|
}
|
|
return halfEdge;
|
|
}
|
|
|
|
/* Get entry from hash table, pruning any deleted nodes */
|
|
private Halfedge GetHash (int b)
|
|
{
|
|
Halfedge halfEdge;
|
|
|
|
if (b < 0 || b >= _hashsize) {
|
|
return null;
|
|
}
|
|
halfEdge = _hash [b];
|
|
if (halfEdge != null && halfEdge.edge == Edge.DELETED) {
|
|
/* Hash table points to deleted halfedge. Patch as necessary. */
|
|
_hash [b] = null;
|
|
// still can't dispose halfEdge yet!
|
|
return null;
|
|
} else {
|
|
return halfEdge;
|
|
}
|
|
}
|
|
|
|
}
|
|
} |