예제 #1
0
        public void Initialize()
        {
            if (Behaviour.RefNumber == 99) //flag waving guy
            {
                SetAction(Behaviour.Actions[7], true);
            }
            else
            {
                SetAction(Behaviour.Standing, true);
            }
            Position            = Instructions[InitialInstruction].Position;
            _currentInstruction = InitialInstruction;

            if (Instructions[_currentInstruction].AutoY)
            {
                StillDesign.PhysX.RaycastHit hit = PhysX.Instance.Scene.RaycastClosestShape(new StillDesign.PhysX.Ray(Position + new Vector3(0, 10, 0), Vector3.Down), StillDesign.PhysX.ShapesType.Static);
                Position = hit.WorldImpact;
            }

            ActorDescription actorDesc = new ActorDescription();

            actorDesc.BodyDescription = new BodyDescription(1);
            actorDesc.BodyDescription.MassSpaceInertia = new Vector3(1, 1, 1);
            actorDesc.BodyDescription.BodyFlags       |= BodyFlag.Kinematic;

            BoxShapeDescription box = new BoxShapeDescription(1.6f, 2.5f, 1.6f);

            box.Flags         = ShapeFlag.TriggerOnEnter;
            box.LocalPosition = new Vector3(0, 1, 0);
            actorDesc.Shapes.Add(box);
            _physXActor = PhysX.Instance.Scene.CreateActor(actorDesc);
            _physXActor.GlobalPosition = Position;
            _physXActor.UserData       = this;
        }
예제 #2
0
        public void Update()
        {
            if (_stopUpdating)
            {
                return;
            }

            float angle = Helpers.GetSignedAngleBetweenVectors(Engine.Camera.Orientation, _direction, false);

            angle = MathHelper.ToDegrees(angle);
            if (angle < 0)
            {
                angle += 360;
            }

            if (float.IsNaN(angle))
            {
                angle = 0;
            }

            int seq = 0;

            foreach (PedestrianActionSequenceMap seqMap in _currentAction.Sequences)
            {
                if (angle < seqMap.MaxBearing)
                {
                    seq = seqMap.SequenceIndex;
                    SetSequence(Behaviour.Sequences[seqMap.SequenceIndex]);
                    break;
                }
            }

            _frameTime += Engine.ElapsedSeconds;
            if (_frameTime > _frameRate)
            {
                _frameIndex++;
                _frameTime = 0;

                if (!_inLoopingFrames)
                {
                    if (_frameIndex >= _currentSequence.InitialFrames.Count)
                    {
                        if (_currentSequence.LoopingFrames.Count > 0)
                        {
                            _inLoopingFrames = true;
                            _frameIndex      = 0;
                        }
                        else
                        {
                            _frameIndex--;
                            _frameTime = -1;  //stop animating
                        }
                    }
                }
                else
                {
                    if (_frameIndex >= _currentSequence.LoopingFrames.Count)
                    {
                        _frameIndex = 0;
                        _frameTime  = 0;
                        UpdateFrameRate();
                    }
                }
            }

            if (IsHit)
            {
                Position += _direction * _hitSpeed * Engine.ElapsedSeconds;

                if (_hitSpinSpeed != 0)
                {
                    Position.Y  += _hitUpSpeed * Engine.ElapsedSeconds;
                    _hitUpSpeed -= Engine.ElapsedSeconds * 45;
                    _hitSpeed   -= Engine.ElapsedSeconds * 10;
                    if (Position.Y <= _groundHeight)
                    {
                        Position.Y      = _groundHeight;
                        _hitCurrentSpin = _hitSpinSpeed = _hitUpSpeed = 0;
                        _hitSpeed       = 0;
                        _stopUpdating   = true;
                    }
                    _hitCurrentSpin += _hitSpinSpeed * Engine.ElapsedSeconds;
                }
                else
                {
                    if (_frameTime == -1)
                    {
                        _stopUpdating = true;  //if were not spining the ped, stop them as soon as anim is finished
                    }
                }
                if (float.IsNaN(Position.X))
                {
                }

                _physXActor.GlobalPosition = Position;
            }
            else if (_isRunning)
            {
                Vector3 target = Instructions[_currentInstruction].Position;

                _direction = target - Position;
                if (float.IsNaN(_direction.X))
                {
                }
                if (_direction != Vector3.Zero)
                {
                    _direction.Normalize();
                    Position += _direction * RunningSpeed * Engine.ElapsedSeconds;
                    if (float.IsNaN(_direction.X))
                    {
                    }

                    if (Instructions[_currentInstruction].AutoY)
                    {
                        StillDesign.PhysX.RaycastHit hit = PhysX.Instance.Scene.RaycastClosestShape(new StillDesign.PhysX.Ray(Position + new Vector3(0, 10, 0), Vector3.Down), StillDesign.PhysX.ShapesType.Static);
                        target.Y = hit.WorldImpact.Y;
                        float fallDist = Position.Y - hit.WorldImpact.Y;
                        if (fallDist > 10)
                        {
                            SetAction(Behaviour.NonFatalFalling, true);
                            if (!_isFalling)
                            {
                                SoundCache.Play(Behaviour.FallingNoise, Race.Current.PlayerVehicle, true);
                            }
                            _isFalling = true;
                        }
                        if (fallDist > 0.5f)
                        {
                            Position.Y -= Engine.ElapsedSeconds * 20;
                        }
                        else
                        {
                            Position.Y = hit.WorldImpact.Y;
                            if (_isFalling)
                            {
                                OnHit(Race.Current.PlayerVehicle);
                                return;
                            }
                        }
                    }
                    _physXActor.GlobalPosition = Position;
                }

                if (Vector3.Distance(Position, target) < 0.5f)
                {
                    if (Instructions[_currentInstruction].Reverse)
                    {
                        _instructionDirection *= -1;
                    }
                    _currentInstruction += _instructionDirection;
                    if (_currentInstruction == -1)
                    {
                        _currentInstruction = 0; _instructionDirection *= -1;
                    }
                }
            }
        }