
1.制作障碍系统 (1.制作几种类型的障碍物的预制体 ((*.编写障碍物基类,以下几种均继承自基类,含碰撞体,RememberY(生成障碍物时该有多大的Y) ((1.矮障碍,仅碰撞体 ((2.高障碍,仅碰撞体 ((3.可冲破障碍 (((1.除基本碰撞体外,额外包含一个触发器,比碰撞体先检测到马,同时获取马的x速度,大于阈值则给障碍做破碎,用马的力度决定破碎力,关闭碎块和马的碰撞 (((*.导入某2D破碎插件 ((4.人马分离障碍 (((WAIT,需要等待人马分离系统先搭建 (2.编写障碍物生成系统 ((1.每若干时间,生成一个随机一种障碍,若干的范围可控 (((1.设计协程,从预制体列表中随机出一种,并在计算好的位置实例化,随后等待范围内的若干时间,然后检查马的存活情况,若马仍存活,重新调用本协程 ((2.生成的位置:x在相机右侧若干不变距离,y根据障碍物的不同而不同,需要计算保存。 (3.编写障碍物消亡系统 ((1.每个障碍物和碎片都会在离开镜头后被删除
135 lines
2.9 KiB
C#
135 lines
2.9 KiB
C#
using UnityEngine;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using Delaunay.LR;
|
|
using Delaunay.Geo;
|
|
using Delaunay.Utils;
|
|
|
|
namespace Delaunay
|
|
{
|
|
|
|
|
|
public sealed class Halfedge: Delaunay.Utils.IDisposable
|
|
{
|
|
private static Stack<Halfedge> _pool = new Stack<Halfedge> ();
|
|
public static Halfedge Create (Edge edge, Nullable<Side> lr)
|
|
{
|
|
if (_pool.Count > 0) {
|
|
return _pool.Pop ().Init (edge, lr);
|
|
} else {
|
|
return new Halfedge (edge, lr);
|
|
}
|
|
}
|
|
|
|
public static Halfedge CreateDummy ()
|
|
{
|
|
return Create (null, null);
|
|
}
|
|
|
|
public Halfedge edgeListLeftNeighbor, edgeListRightNeighbor;
|
|
public Halfedge nextInPriorityQueue;
|
|
|
|
public Edge edge;
|
|
public Nullable<Side> leftRight;
|
|
public Vertex vertex;
|
|
|
|
// the vertex's y-coordinate in the transformed Voronoi space V*
|
|
public float ystar;
|
|
|
|
public Halfedge (Edge edge = null, Nullable<Side> lr = null)
|
|
{
|
|
Init (edge, lr);
|
|
}
|
|
|
|
private Halfedge Init (Edge edge, Nullable<Side> lr)
|
|
{
|
|
this.edge = edge;
|
|
leftRight = lr;
|
|
nextInPriorityQueue = null;
|
|
vertex = null;
|
|
return this;
|
|
}
|
|
|
|
public override string ToString ()
|
|
{
|
|
return "Halfedge (leftRight: " + leftRight.ToString () + "; vertex: " + vertex.ToString () + ")";
|
|
}
|
|
|
|
public void Dispose ()
|
|
{
|
|
if (edgeListLeftNeighbor != null || edgeListRightNeighbor != null) {
|
|
// still in EdgeList
|
|
return;
|
|
}
|
|
if (nextInPriorityQueue != null) {
|
|
// still in PriorityQueue
|
|
return;
|
|
}
|
|
edge = null;
|
|
leftRight = null;
|
|
vertex = null;
|
|
_pool.Push (this);
|
|
}
|
|
|
|
public void ReallyDispose ()
|
|
{
|
|
edgeListLeftNeighbor = null;
|
|
edgeListRightNeighbor = null;
|
|
nextInPriorityQueue = null;
|
|
edge = null;
|
|
leftRight = null;
|
|
vertex = null;
|
|
_pool.Push (this);
|
|
}
|
|
|
|
internal bool IsLeftOf (Vector2 p)
|
|
{
|
|
Site topSite;
|
|
bool rightOfSite, above, fast;
|
|
float dxp, dyp, dxs, t1, t2, t3, yl;
|
|
|
|
topSite = edge.rightSite;
|
|
rightOfSite = p.x > topSite.x;
|
|
if (rightOfSite && this.leftRight == Side.LEFT) {
|
|
return true;
|
|
}
|
|
if (!rightOfSite && this.leftRight == Side.RIGHT) {
|
|
return false;
|
|
}
|
|
|
|
if (edge.a == 1.0) {
|
|
dyp = p.y - topSite.y;
|
|
dxp = p.x - topSite.x;
|
|
fast = false;
|
|
if ((!rightOfSite && edge.b < 0.0) || (rightOfSite && edge.b >= 0.0)) {
|
|
above = dyp >= edge.b * dxp;
|
|
fast = above;
|
|
} else {
|
|
above = p.x + p.y * edge.b > edge.c;
|
|
if (edge.b < 0.0) {
|
|
above = !above;
|
|
}
|
|
if (!above) {
|
|
fast = true;
|
|
}
|
|
}
|
|
if (!fast) {
|
|
dxs = topSite.x - edge.leftSite.x;
|
|
above = edge.b * (dxp * dxp - dyp * dyp) <
|
|
dxs * dyp * (1.0 + 2.0 * dxp / dxs + edge.b * edge.b);
|
|
if (edge.b < 0.0) {
|
|
above = !above;
|
|
}
|
|
}
|
|
} else { /* edge.b == 1.0 */
|
|
yl = edge.c - edge.a * p.x;
|
|
t1 = p.y - yl;
|
|
t2 = p.x - topSite.x;
|
|
t3 = yl - topSite.y;
|
|
above = t1 * t1 > t2 * t2 + t3 * t3;
|
|
}
|
|
return this.leftRight == Side.LEFT ? above : !above;
|
|
}
|
|
|
|
}
|
|
} |