public void SwitchMovement(PlayerMovementMode mode) { DeactivateAllModes(); switch (mode) { case PlayerMovementMode.Realistic: activeMovementMode = GetComponent <RealisticMovement>(); break; case PlayerMovementMode.Mainframe: activeMovementMode = GetComponent <MainframeMovement>(); break; case PlayerMovementMode.LiveWire: activeMovementMode = GetComponent <LiveWireMovement>(); break; default: activeMovementMode = GetComponent <MainframeMovement>(); break; } activeMovementMode.Activate(); }
IEnumerator TrailEffectCoroutine(GameObject trailPlayer, float timeStamp, PlayerMovementMode currentPlayerMovementMode) // DelayJump { float timeOffset = 0; while (timeOffset < timeStamp) { yield return(null); if (DragonakSwoopGameManager.instance.gameState != GameState.paused) { timeOffset += Time.deltaTime; if (timeOffset > timeStamp) { if (currentPlayerMovementMode == PlayerMovementMode.Jumping) { Jump(trailPlayer.GetComponent <Rigidbody2D> ()); } else if (currentPlayerMovementMode == PlayerMovementMode.floating) { Float(trailPlayer.GetComponent <Rigidbody2D> ()); } } } } timeOffset = 0; }
/// <summary> /// Sets the ground movement mode based on current parameters. /// </summary> private void SetMovementMode() { if (_falling) { _movementMode = PlayerMovementMode.Floor; return; } var oldMode = _movementMode; if ((_groundAngle >= 45) && (_groundAngle < 135)) { _movementMode = PlayerMovementMode.RightWall; } else if ((_groundAngle >= 135) && (_groundAngle < 225)) { _movementMode = PlayerMovementMode.Ceiling; } else if ((_groundAngle >= 225) && (_groundAngle < 315)) { _movementMode = PlayerMovementMode.LeftWall; } else { _movementMode = PlayerMovementMode.Floor; } if (oldMode != _movementMode) { TraceSource.TraceEvent(TraceEventType.Verbose, 0, $"Switching to movement mode {_movementMode} from {oldMode}."); } }
public PlayerControllerComponent(Entity referringEntity) : base(referringEntity) { _movementMode = PlayerMovementMode.ThirdPerson; referringEntity.Position = _cameraTargetPosition; Speed = 2.0f; RotationSpeed = 2f; }
/// <summary> /// gives effect for delay jump /// </summary> public void TrailEffect(PlayerMovementMode playerMovementMode) // argument is declared for consistency movement between main player and trail.(It will remain following when continuously switching mode) { int count = 0; foreach (GameObject trailPlayer in trailPlayerList) { count++; StartCoroutine(TrailEffectCoroutine(trailPlayer, trailPlayerMovementDelay * count, playerMovementMode)); } }
/// <summary> /// Places the player into a falling state. /// </summary> private void Fall() { if (_falling) { return; } _movementMode = PlayerMovementMode.Floor; _falling = true; }
public void SwitchMode(PlayerMovementMode movementMode) { if (movementMode == PlayerMovementMode.Jumping) { movement = null; movement += JumpMode; } else if (movementMode == PlayerMovementMode.floating) { movement = null; movement += FloatMode; } }
public void SetPlayerMovementMode(PlayerMovementMode mode) { playerMovementMode = mode; }
/// <summary> /// Performs a jump. /// </summary> private void Jump() { if (_falling) { // cant jump whilst in the air return; } var position = _player.Position; var size = _player.Size; _jumping = true; double deltaX, deltaY; switch (_movementMode) { case PlayerMovementMode.Floor: deltaX = 0.0; deltaY = -((size.Y / 2) + 5.0); break; case PlayerMovementMode.Ceiling: deltaX = 0.0; deltaY = ((size.Y / 2) + 5.0); break; case PlayerMovementMode.RightWall: deltaX = -((size.Y / 2) + 5.0); deltaY = 0.0; break; case PlayerMovementMode.LeftWall: deltaX = ((size.Y / 2) + 5.0); deltaY = 0.0; break; default: deltaX = 0.0; deltaY = 0.0; break; } var tq = new TraceQuery { Line = new Line(position.X, position.Y, position.X + deltaX, position.Y + deltaY), CollisionPath = _player.CollisionPath, Options = TraceLineOptions.IgnoreJumpThrough | TraceLineOptions.SolidOnly, Ignore = _player }; var tr = _collisionService.TraceLine(tq); if (tr.Hit) { // relative ceiling too low, nowhere to jump return; } _movementMode = PlayerMovementMode.Floor; _falling = true; _rolling = true; _player.SetBoundingBox(Player.RollingBox); var rad = _groundAngle * (Math.PI / 180.0); _xsp -= JumpSpeed * -Math.Sin(rad); _ysp -= JumpSpeed * -Math.Cos(rad); if (_ysp < JumpSpeed) { _ysp = JumpSpeed; } if (JumpSound != 0) { _audioService.PlaySoundEffect(JumpSound); } }
/// <summary> /// Calculates the ground angle from the contacted tiles. /// </summary> /// <param name="trA">The trace result from sensor A.</param> /// <param name="trB">The trace result from sensor B.</param> /// <param name="mode">The movement mode.</param> private void CalculateGroundAngle(TraceResult trA, TraceResult trB, PlayerMovementMode mode) { if (!trA.Hit && !trB.Hit) { TraceSource.TraceEvent(TraceEventType.Warning, 0, "Unable to calculate player angle!"); return; } TraceResult tr; if (trA.Hit && !trB.Hit) { tr = trA; } else if (!trA.Hit && trB.Hit) { tr = trB; } else { if (mode == PlayerMovementMode.Ceiling) { if (trA.ContactPoint.Y > trB.ContactPoint.Y) { tr = trA; } else { tr = trB; } } else if (mode == PlayerMovementMode.RightWall) { if (trA.ContactPoint.X < trB.ContactPoint.X) { tr = trA; } else { tr = trB; } } else if (mode == PlayerMovementMode.LeftWall) { if (trA.ContactPoint.X > trB.ContactPoint.X) { tr = trA; } else { tr = trB; } } else { if (trA.ContactPoint.Y < trB.ContactPoint.Y) { tr = trA; } else { tr = trB; } } } if (tr.Entity != null) { _groundAngle = 0.0; } else { _groundAngle = tr.Tile.Definition.Angles[(int)mode]; } _groundAngle = Utils.ClampAngle(_groundAngle); }
private void Update() { //Used for crisp jumping float gravity = GravityScale; //Cancel velocity when colliding with wall if (m_Controller.collisionState.left || m_Controller.collisionState.right) { m_Velocity.x = 0.0f; } if (m_Controller.collisionState.above || m_Controller.collisionState.below) { m_Velocity.y = 0.0f; } //Change the movement method depending on the current movement mode switch (MovementMode) { case PlayerMovementMode.Running: //Switch to Skateboarding if (m_Switch) { MovementMode = PlayerMovementMode.Skateboarding; break; } //Run Run(); break; case PlayerMovementMode.Skateboarding: //Switch to Running if (m_Switch) { MovementMode = PlayerMovementMode.Running; break; } //Skateboard Skateboard(); break; } //Set up last jump time if (m_Jump && !m_JumpLast) { m_LastJumpTime = 0.0f; } else { m_LastJumpTime += Time.deltaTime; } //Check if the player is grounded and prevent them from gaining momentum if (m_Controller.isGrounded) { m_TimeSinceLastGround = 0.0f; m_Velocity.y = 0.0f; } else { //Check if the player is falling if (m_Velocity.y < 0) { gravity *= FallMultiplier; } //Check if the player isn't holding the jump button else if (m_Velocity.y > 0 && !m_Jump) { gravity *= LowJumpMultiplier; } m_TimeSinceLastGround += Time.deltaTime; } //Check for jumping if (m_LastJumpTime <= JumpTime && m_TimeSinceLastGround <= CoyoteTime) { m_Velocity.y = m_JumpVelocity; } //Add gravity m_Velocity.y += Physics2D.gravity.y * Time.deltaTime * gravity; //Move the player m_Controller.Move(m_Velocity * Time.deltaTime); //Flip the sprite depending on the sign if (m_Velocity.x > 0) { m_Renderer.flipX = false; } else if (m_Velocity.x < 0) { m_Renderer.flipX = true; } }
public Player(World world) { _inputSystem = GameInstance.GetService <InputSystem>(); _playerEntity = world.EntitySystem.CreateEntity(true); var mesh = new Mesh(GameInstance.GraphicsDevice, Primitives.GenerateQuadForYBillboard()); var diffuseTexture = GameInstance.Content.Load <Texture2D>(ResourceNames.Textures.DefaultGuy); var material = new Material { DiffuseTexture = diffuseTexture, UseTransparency = true, TexcoordScale = diffuseTexture.GetTexcoordsFromPixelCoords(32, 32), IsUnlit = true }; _modelEntityComponent = _playerEntity.AddComponent(new ModelEntityComponent(_playerEntity, mesh, material, true)); _cameraEntity = world.EntitySystem.CreateEntity(); _cameraEntity.SetParent(_playerEntity); var cameraComponent = _cameraEntity.AddComponent(new CameraEntityComponent(_cameraEntity, new Skybox(GameInstance) { Scale = 50, Texture = GameInstance.Content.Load <Texture2D>(ResourceNames.Textures.skybox_texture) })); cameraComponent.FarClipDistance = 50.0f; Camera = cameraComponent.Camera; Speed = 2.0f; RotationSpeed = 2f; var forward = Animation.CreateDiscrete(0.65f, new[] { diffuseTexture.GetTexcoordsFromPixelCoords(0, 0), diffuseTexture.GetTexcoordsFromPixelCoords(32, 0), diffuseTexture.GetTexcoordsFromPixelCoords(0, 0), diffuseTexture.GetTexcoordsFromPixelCoords(64, 0), }, t => _modelEntityComponent.Material.TexcoordOffset = t, true); var left = Animation.CreateDiscrete(0.65f, new[] { diffuseTexture.GetTexcoordsFromPixelCoords(0, 32), diffuseTexture.GetTexcoordsFromPixelCoords(32, 32), diffuseTexture.GetTexcoordsFromPixelCoords(0, 32), diffuseTexture.GetTexcoordsFromPixelCoords(64, 32), }, t => _modelEntityComponent.Material.TexcoordOffset = t, true); var right = Animation.CreateDiscrete(0.65f, new[] { diffuseTexture.GetTexcoordsFromPixelCoords(0, 96), diffuseTexture.GetTexcoordsFromPixelCoords(32, 96), diffuseTexture.GetTexcoordsFromPixelCoords(0, 96), diffuseTexture.GetTexcoordsFromPixelCoords(64, 96), }, t => _modelEntityComponent.Material.TexcoordOffset = t, true); var backward = Animation.CreateDiscrete(0.65f, new[] { diffuseTexture.GetTexcoordsFromPixelCoords(0, 64), diffuseTexture.GetTexcoordsFromPixelCoords(32, 64), diffuseTexture.GetTexcoordsFromPixelCoords(0, 64), diffuseTexture.GetTexcoordsFromPixelCoords(64, 64), }, t => _modelEntityComponent.Material.TexcoordOffset = t, true); _playerEntity.AddComponent(new FigureMovementAnimationComponent(_playerEntity, forward, backward, left, right)); _movementMode = PlayerMovementMode.ThirdPerson; _cameraEntity.Position = _cameraTargetPosition; var colliderComponent = new CollisionEntityComponent(_playerEntity, new Vector3(0.35f, 0.6f, 0.35f), new Vector3(0.0f, 0.3f, 0.0f), "Player") { ResolvesPosition = true, }; _playerEntity.AddComponent(colliderComponent); _playerEntity.Position = new Vector3(5, 0, 8); }