/// <summary> /// Calculates a point on the BezierPath /// </summary> /// <param name="curveIndex">On which bezier curve, your point is ? (Starts from 0)</param> /// <param name="t">between 0 and 1 , specifies the point on the curve</param> /// <returns>A Vector3 of the specified point</returns> public Vector3 getLocalPosition(PathPosition position) { int nodeIndex = position.pointIndex; Vector3 p0 = controlPoints[nodeIndex]; Vector3 p1 = controlPoints[nodeIndex + 1]; Vector3 p2 = controlPoints[nodeIndex + 2]; Vector3 p3 = controlPoints[nodeIndex + 3]; return CalculateBezierPoint(position.ratio, p0, p1, p2, p3); }
public override void step() { if (destroyable == false) { if (minionState == MinionState.ALIVE) { if (stats.health <= 0) { onDeath(); } else { walk(); if (effectCooldownTime - Chronos.deltaTime <= 0) { effectCooldownTime = DEFAULT_EFFECT_COOLDOWN_TIME; MirrorSoldierIlisionMinion newIlision = new MirrorSoldierIlisionMinion(this.game, this.ownerPlayer); PathPosition newPos = new PathPosition(0, 0); position.board.getPath().move(this.position.pathPosition, -0.2f , out newPos); this.position.board.AddMinionSpecificPosition(newIlision, newPos); Science_Wars_Server.Messages.OutgoingMessages.Game.GCopyMinionResult.sendMessage(game.players, newIlision); } else { effectCooldownTime -= Chronos.deltaTime; } } } else if (minionState == MinionState.DEAD && isReadyToDestroy()) // minionState i tekrar kontrol ettim. ne olur ne olmaz yeni bir state eklersek patlamasin. onDestroy(); } }
/// <summary> /// Verilen minionu boarda ekler. 2.Parametrede verilen noktaya goturur. /// </summary> /// <param name="minion">boarda yerlestirilecek minion</param> /// <returns>Bu islem her zaman basarili oldugu icin bir return degeri yoktur.</returns> public void AddMinionSpecificPosition(Minion minion, PathPosition position, bool notifyPlayers = true) { if (boardState != BoardState.COLLAPSING) { try { toBeAddedMinions.Add(minion); } catch (Exception e) { Console.WriteLine(e.StackTrace + " : " + e.Message); } if (minion.position == null) minion.position = new MinionPosition(); minion.position.board = this; minion.position.pathPosition = new PathPosition(position.pointIndex, position.ratio); if(notifyPlayers) Messages.OutgoingMessages.Game.GMinionPositionInfo.sendMessage(player.game.players, minion); } else { minion.destroyable = true; Messages.OutgoingMessages.Game.GDestroyMinionInfo.sendMessage(player.game.players, minion); } }
public Board board; // suan yurumekte oldugu board public MinionPosition() { pathPosition = new PathPosition(0, 0); }
public float move(PathPosition currentPosition, float distance, out PathPosition newPosition) { float distToEnd = (points.Length-1 - currentPosition.pointIndex - currentPosition.ratio)*distanceBetweenPoints; float distToStart = (currentPosition.pointIndex + currentPosition.ratio)*distanceBetweenPoints; if ( distance - distToEnd > 0) { newPosition = getEndPoint(); return distance - distToEnd; } else if (distance + distToStart < 0) { newPosition = getStartPoint(); return distance + distToStart; } distance += currentPosition.ratio*distanceBetweenPoints; int tam = (int)(distance / distanceBetweenPoints); float artan = distance/distanceBetweenPoints - tam; if (artan < 0) { artan += 1f; tam--; } newPosition = new PathPosition( currentPosition.pointIndex + tam, artan); return 0; }
public Vector3 getLocalPosition(PathPosition pathPosition) { return points[pathPosition.pointIndex] + (points[pathPosition.pointIndex+1] - points[pathPosition.pointIndex])*pathPosition.ratio ; }
public PathPosition pathPosition; // suan yurumekte oldugu yolun yuzde kacini yurudugunu tutar. #endregion Fields #region Constructors public MinionPosition() { pathPosition = new PathPosition(0, 0); }
public float move(PathPosition currentPosition, float distance, out PathPosition newPosition) { newPosition = currentPosition.clone(); float diff = findDiffOnPath(currentPosition).magnitude; float bitDistance = distance / diff; newPosition.ratio += bitDistance; while (newPosition.ratio >= 1) { newPosition.ratio -= 1; newPosition.pointIndex += 3; if (newPosition.pointIndex == controlPoints.Count - 1) { float remaining = newPosition.ratio * diff; newPosition.pointIndex -= 3; newPosition.ratio = 1; return remaining; } } while (newPosition.ratio < 0) { newPosition.ratio += 1; newPosition.pointIndex -= 3; if (newPosition.pointIndex == -3) { float remaining = (newPosition.ratio - 1f) * diff; newPosition.pointIndex += 3; newPosition.ratio = 0; return remaining; } } return 0; }
public PathPosition getStartPoint() { PathPosition startPoint = new PathPosition(0, 0.0f); return startPoint; }
public PathPosition getEndPoint() { PathPosition endPoint = new PathPosition(controlPoints.Count - 4, 1.0f); return endPoint; }
private Vector3 findDiffOnPath(PathPosition position) { int index = position.pointIndex; Vector3 x = controlPoints[index]; Vector3 y = controlPoints[index + 1]; Vector3 z = controlPoints[index + 2]; Vector3 w = controlPoints[index + 3]; float t = position.ratio; return t * t * (-3 * x + 9 * y - 9 * z + 3 * w) + t * (6 * x - 12 * y + 6 * z) + (-3 * x + 3 * y); }