예제 #1
0
        /// <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);
        }
예제 #2
0
        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();
            }
        }
예제 #3
0
        /// <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);
            }

        }
예제 #4
0
        public Board board;               // suan yurumekte oldugu board

        public MinionPosition()
        {
            pathPosition = new PathPosition(0, 0);
        }
예제 #5
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;
        }
예제 #6
0
 public Vector3 getLocalPosition(PathPosition pathPosition)
 {
     return points[pathPosition.pointIndex] + (points[pathPosition.pointIndex+1] - points[pathPosition.pointIndex])*pathPosition.ratio ;
 }
예제 #7
0
        public PathPosition pathPosition; // suan yurumekte oldugu yolun yuzde kacini yurudugunu tutar.

        #endregion Fields

        #region Constructors

        public MinionPosition()
        {
            pathPosition = new PathPosition(0, 0);
        }
예제 #8
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;
        }
예제 #9
0
 public PathPosition getStartPoint()
 {
     PathPosition startPoint = new PathPosition(0, 0.0f);
     return startPoint;
 }
예제 #10
0
 public PathPosition getEndPoint()
 {
     PathPosition endPoint = new PathPosition(controlPoints.Count - 4, 1.0f);
     return endPoint;
 }
예제 #11
0
        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);
        }