Roman e3e11e2556 任务:编写玩法框架
1.制作障碍系统

(1.制作几种类型的障碍物的预制体
((*.编写障碍物基类,以下几种均继承自基类,含碰撞体,RememberY(生成障碍物时该有多大的Y)
((1.矮障碍,仅碰撞体
((2.高障碍,仅碰撞体
((3.可冲破障碍
(((1.除基本碰撞体外,额外包含一个触发器,比碰撞体先检测到马,同时获取马的x速度,大于阈值则给障碍做破碎,用马的力度决定破碎力,关闭碎块和马的碰撞
(((*.导入某2D破碎插件
((4.人马分离障碍
(((WAIT,需要等待人马分离系统先搭建

(2.编写障碍物生成系统
((1.每若干时间,生成一个随机一种障碍,若干的范围可控
(((1.设计协程,从预制体列表中随机出一种,并在计算好的位置实例化,随后等待范围内的若干时间,然后检查马的存活情况,若马仍存活,重新调用本协程
((2.生成的位置:x在相机右侧若干不变距离,y根据障碍物的不同而不同,需要计算保存。

(3.编写障碍物消亡系统
((1.每个障碍物和碎片都会在离开镜头后被删除
2022-07-30 00:47:44 +08:00

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;
}
}
}