示例#1
0
文件: Piston.cs 项目: supernikx/Poxy
    public void Setup()
    {
        if (!activeFromStart)
        {
            model.material = disabledMaterial;
            currentState   = PistonState.Forward;
        }
        else
        {
            model.material = activeMaterial;
            currentState   = PistonState.Backward;
        }
        colliderToCheck = GetComponent <Collider>();
        CalculateRaySpacing();

        if (direction == PistonDirection.Vertical)
        {
            initialPosition = waypointStart.position.y;
            targetPosition  = waypoint.position.y;
        }
        else if (direction == PistonDirection.Horizontal)
        {
            initialPosition = waypointStart.position.x;
            targetPosition  = waypoint.position.x;
        }
        else if (direction == PistonDirection.Platform)
        {
            initialPosition = waypointStart.position.z;
            targetPosition  = waypoint.position.z;
        }
    }
        /// <summary>
        /// Simulate Engine Operation
        /// </summary>
        public void EngineOperate(double milSecPerFrame)
        {
            // Every frame we have a random piston speed because of random engine RPM
            double MPH = CalculatePistonSpeed();

            // Just a conversion from MPH to IPMS
            double IPMS = ConvertMPHToIPMS(MPH);

            // Calculate piston traveled distance per frame
            double distanceTraveled = IPMS * milSecPerFrame;

            // Before updating with new piston state, get previous state
            PistonState prevPistonState = _piston.GetState();

            // Negative travel distance if piston is moving from top to bottom
            if (prevPistonState == PistonState.TopToMid || prevPistonState == PistonState.MidToBot || prevPistonState == PistonState.Top)
            {
                distanceTraveled *= -1;
            }


            // Update piston state
            _piston.UpdatePistonStates(distanceTraveled, MPH);


            // Implement spark plug control via event
            // Activate spark plug if new piston state is at top, else deactivate spark plug.
            _piston.PistonStateChangeEvent += _piston_PistonStateChangeEvent;


            // Print info. to console
            PrintParams();
        }
示例#3
0
    // Use this for initialization
    void Start()
    {
        state = PistonState.Waiting;
        PistonAnimation.Play("Idle");

        NextActivationDuration = InitialOffset;
        if(RandomMin != RandomMax)
            NextActivationDuration += Random.Range(RandomMin, RandomMax);
    }
 /// <summary>
 /// Piston State Change Event handler
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void _piston_PistonStateChangeEvent(object sender, PistonState e)
 {
     if (e == PistonState.Top)
     {
         _sprakPlug.Ignition();
     }
     else
     {
         _sprakPlug.StopIgnition();
     }
 }
示例#5
0
    // Use this for initialization
    void Start()
    {
        state = PistonState.Waiting;
        PistonAnimation.Play("Idle");

        NextActivationDuration = InitialOffset;
        if (RandomMin != RandomMax)
        {
            NextActivationDuration += Random.Range(RandomMin, RandomMax);
        }
    }
示例#6
0
    //This callback is called when the user selects an element in the Add Element dropdown menu
    void OnReorderableListAddDropdownClick(object target)
    {
        PistonState state = (PistonState)target;

        int index = m_List.serializedProperty.arraySize;

        m_List.serializedProperty.arraySize++;
        m_List.index = index;

        SerializedProperty element = m_List.serializedProperty.GetArrayElementAtIndex(index);

        element.FindPropertyRelative("Name").stringValue           = state.Name;
        element.FindPropertyRelative("DelayAfterwards").floatValue = 0f;

        serializedObject.ApplyModifiedProperties();
    }
        public Piston(double displacement)
        {
            if (displacement <= 0)
            {
                throw new Exception("Piston stroke is invalid");
            }

            // Set initial state of piston to bottom
            _state = PistonState.Bot;

            // Set position of piston
            _curDisplacement = -displacement / 2;

            // Set speed
            _speed = 0;

            // Set stroke
            _displacement = displacement;
        }
示例#8
0
    private void StartWorking()
    {
        if (path != null)
        {
            _currentPoint = path.GetPathEnumerator();
            _currentPoint.MoveNext();

            if (_currentPoint.Current == null)
            {
                return;
            }

            transform.position = _currentPoint.Current.position;
        }

        _isReadyToMove = false;
        startTime      = 0;
        _isStarting    = true;
        state          = PistonState.Splash;
        //StartCoroutine("StartWorking");
    }
        public void UpdatePistonStates(double traveledDistance, double speed)
        {
            _curDisplacement += traveledDistance;
            _speed            = speed;
            if (_curDisplacement >= _displacement / 2)
            {
                _state           = PistonState.Top;
                _curDisplacement = _displacement / 2;
                _speed           = 0;
            }
            else if (_curDisplacement <= -1)
            {
                _state           = PistonState.Bot;
                _curDisplacement = -_displacement / 2;
                _speed           = 0;
            }
            else if (_curDisplacement >= 0 && _curDisplacement < _displacement / 2 && traveledDistance > 0)
            {
                _state = PistonState.MidToTop;
            }
            else if (_curDisplacement <= 0 && _curDisplacement > -_displacement / 2 && traveledDistance < 0)
            {
                _state = PistonState.MidToBot;
            }
            else if (_curDisplacement >= 0 && _curDisplacement < _displacement / 2 && traveledDistance < 0)
            {
                _state = PistonState.TopToMid;
            }
            else if (_curDisplacement <= 0 && _curDisplacement > -_displacement / 2 && traveledDistance > 0)
            {
                _state = PistonState.BotToMid;
            }


            PistonStateChangeEvent?.Invoke(this, _state);
        }
示例#10
0
    // Update is called once per frame
    void Update()
    {
        switch(state)
        {
        case PistonState.Waiting:
            if(!IsAnyAnimPlaying())
            {
                RunningTime += Time.deltaTime;
                if(RunningTime > NextActivationDuration)
                {
                    PistonAnimation.Play("Hit");
                    state = PistonState.Extending;
                    NextActivationDuration = 0.0f;
                    RunningTime = 0.0f;
                }
            }
            break;

        case PistonState.Extending:
            if(!IsAnyAnimPlaying())
            {
                RunningTime += Time.deltaTime;
                if(RunningTime > NextActivationDuration)
                {
                    state = PistonState.Extended;

                    NextActivationDuration = ExtendedWaitTime;
                    if(RandomMin != RandomMax)
                        NextActivationDuration += Random.Range(RandomMin, RandomMax);
                    RunningTime = 0.0f;
                }
            }
            break;

        case PistonState.Extended:
            if(!IsAnyAnimPlaying())
            {
                RunningTime += Time.deltaTime;
                if(RunningTime > NextActivationDuration)
                {
                    state = PistonState.Retracting;
                    PistonAnimation.Play ("Retract");
                    NextActivationDuration = 0.0f;
                    RunningTime = 0.0f;
                }
            }
            break;

        case PistonState.Retracting:
            if(!IsAnyAnimPlaying())
            {
                RunningTime += Time.deltaTime;
                if(RunningTime >= NextActivationDuration)
                {
                    state = PistonState.Waiting;
                    PistonAnimation.Play ("Idle");

                    NextActivationDuration = IdleWaitTime;
                    if(RandomMin != RandomMax)
                        NextActivationDuration += Random.Range(RandomMin, RandomMax);
                    RunningTime = 0.0f;
                }
            }
            break;
        }
    }
示例#11
0
    // Update is called once per frame
    void Update()
    {
        switch (state)
        {
        case PistonState.Waiting:
            if (!IsAnyAnimPlaying())
            {
                RunningTime += Time.deltaTime;
                if (RunningTime > NextActivationDuration)
                {
                    PistonAnimation.Play("Hit");
                    state = PistonState.Extending;
                    NextActivationDuration = 0.0f;
                    RunningTime            = 0.0f;
                }
            }
            break;

        case PistonState.Extending:
            if (!IsAnyAnimPlaying())
            {
                RunningTime += Time.deltaTime;
                if (RunningTime > NextActivationDuration)
                {
                    state = PistonState.Extended;

                    NextActivationDuration = ExtendedWaitTime;
                    if (RandomMin != RandomMax)
                    {
                        NextActivationDuration += Random.Range(RandomMin, RandomMax);
                    }
                    RunningTime = 0.0f;
                }
            }
            break;

        case PistonState.Extended:
            if (!IsAnyAnimPlaying())
            {
                RunningTime += Time.deltaTime;
                if (RunningTime > NextActivationDuration)
                {
                    state = PistonState.Retracting;
                    PistonAnimation.Play("Retract");
                    NextActivationDuration = 0.0f;
                    RunningTime            = 0.0f;
                }
            }
            break;

        case PistonState.Retracting:
            if (!IsAnyAnimPlaying())
            {
                RunningTime += Time.deltaTime;
                if (RunningTime >= NextActivationDuration)
                {
                    state = PistonState.Waiting;
                    PistonAnimation.Play("Idle");

                    NextActivationDuration = IdleWaitTime;
                    if (RandomMin != RandomMax)
                    {
                        NextActivationDuration += Random.Range(RandomMin, RandomMax);
                    }
                    RunningTime = 0.0f;
                }
            }
            break;
        }
    }
示例#12
0
    public void Update()
    {
        if (_isReadyToMove == true)
        {
            if (_currentPoint == null || _currentPoint.Current == null)
            {
                return;
            }

            var speed = state == PistonState.Splash ? returningSpeed : splashSpeed;

            if (Type == FollowType.MoveTowards)
            {
                transform.position = Vector3.MoveTowards(transform.position, _currentPoint.Current.position, Time.deltaTime * speed);
            }
            else if (Type == FollowType.Lerp)
            {
                transform.position = Vector3.Lerp(transform.position, _currentPoint.Current.position, Time.deltaTime * speed);
            }

            var distance = (transform.position - _currentPoint.Current.position).sqrMagnitude;
            if (distance < maxDistance * maxDistance)
            {
                float delay;
                if (state == PistonState.Splash)
                {
                    delay = delayBetweenSplash;
                    state = PistonState.Return;
                    if (killingZone != null)
                    {
                        killingZone.SetEnabled();
                    }

                    if (_forceTurnOff)
                    {
                        _isReadyToMove = false;
                        _forceTurnOff  = false;
                        if (_forceTurnOn)
                        {
                            _forceTurnOn = false;
                            StartWorking();
                        }
                        else
                        {
                            this.enabled = false;
                        }
                    }
                }
                else
                {
                    delay = returningDelay;
                    state = PistonState.Splash;
                    if (killingZone != null)
                    {
                        killingZone.SetDisabled();
                    }
                }

                StartCoroutine("Move", delay);
            }
        }

        else if (_isStarting)
        {
            if (Mathf.Abs(startTime -= Time.deltaTime) > startDelay)
            {
                _isStarting    = false;
                _isReadyToMove = true;
            }
        }
    }
示例#13
0
    public void Update()
    {
        if (_isReadyToMove == true)
        {
            if (_currentPoint == null || _currentPoint.Current == null)
            {
                return;
            }

            var speed = state == PistonState.Splash ? returningSpeed : splashSpeed;

            if (Type == FollowType.MoveTowards)
            {
                transform.position = Vector3.MoveTowards(transform.position, _currentPoint.Current.position, Time.deltaTime * speed);
            }
            else if (Type == FollowType.Lerp)
            {
                transform.position = Vector3.Lerp(transform.position, _currentPoint.Current.position, Time.deltaTime * speed);
            }

            var distance = (transform.position - _currentPoint.Current.position).sqrMagnitude;
            if (distance < maxDistance * maxDistance)
            {
                float delay;
                if (state == PistonState.Splash)
                {
                    delay = delayBetweenSplash;
                    state = PistonState.Return;
                    if (killingZone != null)
                    {
                        killingZone.SetEnabled();
                    }

                    if (_forceTurnOff)
                    {
                        _isReadyToMove = false;
                        _forceTurnOff = false;
                        if (_forceTurnOn)
                        {
                            _forceTurnOn = false;
                            StartWorking();
                        }
                        else
                        {
                            this.enabled = false;
                        }
                    }

                }
                else
                {
                    delay = returningDelay;
                    state = PistonState.Splash;
                    if (killingZone != null)
                    {
                        killingZone.SetDisabled();

                    }

                }

                StartCoroutine("Move", delay);

            }
        }

        else if (_isStarting)
        {
            if (Mathf.Abs(startTime -= Time.deltaTime) > startDelay)
            {
                _isStarting = false;
                _isReadyToMove = true;
            }
        }
    }
示例#14
0
    private void StartWorking()
    {
        if (path != null)
        {
            _currentPoint = path.GetPathEnumerator();
            _currentPoint.MoveNext();

            if (_currentPoint.Current == null)
            {
                return;
            }

            transform.position = _currentPoint.Current.position;
        }

        _isReadyToMove = false;
        startTime = 0;
        _isStarting = true;
        state = PistonState.Splash;
        //StartCoroutine("StartWorking");
    }
示例#15
0
文件: Piston.cs 项目: supernikx/Poxy
    public override void MoveBehaviour()
    {
        if (activeFromStart)
        {
            if (currentState == PistonState.Forward)
            {
                movementVelocity = new Vector3(0, -downMovementSpd, 0);
            }
            else if (currentState == PistonState.Backward)
            {
                movementVelocity = new Vector3(0, upMovementSpd, 0);
            }

            CheckMovementCollisions(movementVelocity * Time.deltaTime);

            transform.Translate(movementVelocity * Time.deltaTime);

            if (currentState == PistonState.Forward)
            {
                if (direction == PistonDirection.Vertical && Vector3.up == transform.up && transform.position.y <= targetPosition)
                {
                    sfxCtrl.PlayClip();
                    stompVFX.Play();
                    currentState = PistonState.Backward;
                }
                else if (direction == PistonDirection.Vertical && Vector3.up != transform.up && transform.position.y >= targetPosition)
                {
                    sfxCtrl.PlayClip();
                    stompVFX.Play();
                    currentState = PistonState.Backward;
                }
                else if (direction == PistonDirection.Horizontal && Vector3.left == transform.up && transform.position.x >= targetPosition)
                {
                    sfxCtrl.PlayClip();
                    stompVFX.Play();
                    currentState = PistonState.Backward;
                }
                else if (direction == PistonDirection.Horizontal && Vector3.left != transform.up && transform.position.x <= targetPosition)
                {
                    sfxCtrl.PlayClip();
                    stompVFX.Play();
                    currentState = PistonState.Backward;
                }
                else if (direction == PistonDirection.Platform)
                {
                    if ((Vector3.forward == transform.up && transform.position.z <= targetPosition) || (Vector3.forward != transform.up && transform.position.z >= targetPosition))
                    {
                        currentState = PistonState.Backward;
                    }
                }
            }

            if (currentState == PistonState.Backward)
            {
                if (direction == PistonDirection.Vertical && Vector3.up == transform.up && transform.position.y >= initialPosition)
                {
                    currentState = PistonState.Forward;
                }
                else if (direction == PistonDirection.Vertical && Vector3.up != transform.up && transform.position.y <= initialPosition)
                {
                    currentState = PistonState.Forward;
                }
                else if (direction == PistonDirection.Horizontal && Vector3.left == transform.up && transform.position.x <= initialPosition)
                {
                    currentState = PistonState.Forward;
                }
                else if (direction == PistonDirection.Horizontal && Vector3.left != transform.up && transform.position.x >= initialPosition)
                {
                    currentState = PistonState.Forward;
                }
                else if (direction == PistonDirection.Platform)
                {
                    if ((Vector3.forward == transform.up && transform.position.z >= initialPosition) ||
                        (Vector3.forward != transform.up && transform.position.z <= initialPosition))
                    {
                        currentState = PistonState.Forward;
                    }
                }
            }
        }
    }
示例#16
0
 public BlockActionPiston(byte byte1, byte byte2, int blockType)
 {
     PistonState     = (PistonState)byte1;
     PistonDirection = (PistonDirection)byte2;
     BlockType       = blockType;
 }
示例#17
0
 public void SetPistonAction(int x, int y, int z, PistonState state, PistonDirection direction)
 {
     X = x;
     Y = y;
     Z = z;
     DataA = (sbyte)state;
     DataB = (sbyte)direction;
 }
 public BlockActionPiston(byte byte1, byte byte2, int blockType)
 {
     PistonState = (PistonState) byte1;
     PistonDirection = (PistonDirection) byte2;
     BlockType = blockType;
 }