예제 #1
0
    private void Move()
    {
        moveTimer += Time.deltaTime;
        if (moveTimer >= moveTimerMax)
        {
            GameManager.Instance.GetAllPartsBack();

            moveTimer -= moveTimerMax;

            if (snakeTailPositions.Count < 1)
            {
                snakeTailPositions.Insert(0, new TailPosition(direction, pos, direction));
            }
            else
            {
                snakeTailPositions.Insert(0, new TailPosition(snakeTailPositions[0].direction, pos, direction));
            }

            pos += moveDirection;

            if (snakeTailPositions.Count >= snakeLenght + 1)
            {
                snakeTailPositions.RemoveAt(snakeTailPositions.Count - 1);
            }

            for (int i = 0; i < snakeTailPositions.Count; i++)
            {
                TailPosition curretTail = snakeTailPositions[i];

                if (curretTail.direction != curretTail.previousDir)
                {
                    float angle = GetCurvedAngle(curretTail.previousDir, curretTail.direction);

                    Vector2Int snakeMovePos = curretTail.position;

                    GameManager.Instance.SetTailToPosition(snakeMovePos.x, snakeMovePos.y, angle + 180, true);
                }
                else
                {
                    Vector2Int snakeMovePos = curretTail.position;

                    float angle = i == 0 ? GetAngleFromPos(moveDirection) - 90 : snakeMovePos.x == snakeTailPositions[i - 1].position.x ? 0 : 90;

                    GameManager.Instance.SetTailToPosition(snakeMovePos.x, snakeMovePos.y, angle, false);
                }
            }
        }

        rectTransform.anchoredPosition = new Vector3(pos.x, pos.y);
        rectTransform.eulerAngles      = new Vector3(0, 0, GetAngleFromPos(moveDirection) - 90);
    }
        public SnakeWorm(LevelState parentWorld, Vector2 position)
        {
            this.parentWorld = parentWorld;
            this.position    = position;
            this.dimensions  = new Vector2(24);

            snakeState = SnakeWormState.Moving;

            velocity = Vector2.Zero;

            direction      = (float)(Game1.rand.NextDouble() * Math.PI * 2);
            dirModifier    = 1.0f;
            switchTimer    = 0.0f;
            switchDuration = averageSwitchDuration;

            enemy_life = 16;
            enemy_type = EnemyType.Alien;

            prob_item_drop    = 0.3;
            number_drop_items = 4;

            tailData       = new TailPosition[tailPiecesCount, positionsCount];
            tailMostRecent = 0;
            for (int j = 0; j < tailPiecesCount; j++)
            {
                for (int i = 0; i < positionsCount; i++)
                {
                    tailData[j, i] = new TailPosition(position, direction);
                }
            }

            secondaryHitBoxes = new SecondaryHitBox[secondaryHitBoxCount];
            for (int i = 0; i < secondaryHitBoxCount; i++)
            {
                secondaryHitBoxes[i] = new SecondaryHitBox(position, new Vector2(16));
            }

            testAnim       = AnimationLib.getFrameAnimationSet("snakeA");
            tailAnimA      = AnimationLib.getFrameAnimationSet("snakeB");
            tailAnimB      = AnimationLib.getFrameAnimationSet("snakeC");
            animation_time = 0;
        }
        public override void update(GameTime currentTime)
        {
            animation_time += currentTime.ElapsedGameTime.Milliseconds;

            if (snakeState == SnakeWormState.Moving)
            {
                switchTimer += currentTime.ElapsedGameTime.Milliseconds;
                if (switchTimer > switchDuration)
                {
                    dirModifier *= -1;

                    switchTimer    = 0;
                    switchDuration = averageSwitchDuration + (float)(1000f * Game1.rand.NextDouble());
                }

                direction += turnAmount * dirModifier;

                velocity = new Vector2((float)(Math.Cos(direction) * wormSpeed), (float)(Math.Sin(direction) * wormSpeed));

                if (enemy_life < 1)
                {
                    snakeState = SnakeWormState.Dying;
                    parentWorld.pushCoin(this);
                }

                foreach (Entity en in parentWorld.EntityList)
                {
                    if (en.Enemy_Type == EnemyType.Alien)
                    {
                        continue;
                    }

                    if (Vector2.Distance(en.CenterPoint, CenterPoint) < 500f)
                    {
                        if (hitTest(en))
                        {
                            en.knockBack(en.Position - position, 2.0f, 5);
                        }
                    }
                }
            }
            else if (snakeState == SnakeWormState.KnockedBack)
            {
                knockBackTime += currentTime.ElapsedGameTime.Milliseconds;

                //direction += turnAmount * 3;

                if (knockBackTime > knockBackDuration)
                {
                    snakeState = SnakeWormState.Moving;
                }
            }
            else if (snakeState == SnakeWormState.Dying)
            {
                remove_from_list = true;
            }


            for (int i = 0; i < tailPiecesCount; i++)
            {
                if (i == tailPiecesCount - 1)
                {
                    tailData[i, tailMostRecent] = new TailPosition(position, direction + (float)(Math.PI));
                }
                else
                {
                    tailData[i, tailMostRecent] = tailData[(i - 1 + tailPiecesCount) % tailPiecesCount, (tailMostRecent + 1) % positionsCount];
                }
            }

            for (int i = 0; i < tailPiecesCount - 1; i++)
            {
                Vector2 posDiff = tailData[i + 1, tailMostRecent].position - tailData[i, tailMostRecent].position;

                tailData[i, tailMostRecent].rotation = (float)(Math.Atan2(posDiff.Y, posDiff.X));
            }

            tailMostRecent = (tailMostRecent + 1) % positionsCount;

            for (int i = 0; i < secondaryHitBoxCount; i++)
            {
                secondaryHitBoxes[i].Position = tailData[(int)(i * ((tailPiecesCount - 1.0f) / secondaryHitBoxCount)), tailMostRecent].position;
            }

            Vector2 newPos = position + (this.velocity * currentTime.ElapsedGameTime.Milliseconds);

            position = parentWorld.Map.reloactePosition(position, newPos, dimensions);
        }
예제 #4
0
 public TailChecksumWriter(TailPosition ChecksumPosition)
 {
     _checksumPosition = ChecksumPosition;
 }