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); }
public TailChecksumWriter(TailPosition ChecksumPosition) { _checksumPosition = ChecksumPosition; }