Пример #1
0
    protected void launchMissile()
    {
        // 发射导弹
        bool success = false;

        if (mAimTarget != null)
        {
            MissileParam param = new MissileParam();
            param.mPosition = mPlayer.getPosition() + new Vector3(0.0f, 2.5f, 0.0f);
            param.mTarget   = mAimTarget;
            SceneMissile missile = mItemManager.createItem <SceneMissile>(SCENE_ITEM.SI_MISSILE, param);
            if (mPlayer.isType(CHARACTER_TYPE.CT_MYSELF))
            {
                GameTools.PLAY_AUDIO_OBJECT(missile, SOUND_DEFINE.SD_FIRE_MISSILE);
            }
            // 通知锁定玩家
            CommandCharacterNotifyMissileLocked cmdLock = newCmd(out cmdLock);
            cmdLock.mLocked  = true;
            cmdLock.mMissile = missile;
            pushCommand(cmdLock, mAimTarget);
            success = true;
        }
        // 移除瞄准状态
        CommandCharacterRemoveState cmdState = newCmd(out cmdState);

        cmdState.mState = mType;
        pushCommand(cmdState, mPlayer);
        // 发射成功后移除角色背包中的导弹道具
        if (success)
        {
            CommandCharacterRemoveItem cmdRemove = newCmd(out cmdRemove);
            cmdRemove.mItem = mPlayer.getPlayerPack().getCurItem();
            pushCommand(cmdRemove, mPlayer);
        }
    }
    public override void execute()
    {
        Character      character = mReceiver as Character;
        CharacterOther player    = character as CharacterOther;

        if (player == null)
        {
            return;
        }
        // 移除瞄准状态
        if (player.hasState(PLAYER_STATE.PS_AIM))
        {
            CommandCharacterRemoveState cmdState = newCmd(out cmdState);
            cmdState.mState = PLAYER_STATE.PS_AIM;
            pushCommand(cmdState, character);
        }

        PlayerPack pack             = player.getPlayerPack();
        int        nextNotNullIndex = mIndex != -1 ? mIndex : pack.getNextNotEmptyIndex();

        if (nextNotNullIndex == -1)
        {
            return;
        }
        pack.setItemIndex(nextNotNullIndex);
        // 通知布局
        if (player.isType(CHARACTER_TYPE.CT_MYSELF))
        {
            mScriptProps.showIndex(nextNotNullIndex);
        }
    }
Пример #3
0
    //--------------------------------------------------------------------------------------------------------------
    protected void removeSelf(string param = null)
    {
        CommandCharacterRemoveState cmd = newCmd(out cmd, false);

        cmd.mState = this;
        cmd.mParam = param;
        pushCommand(cmd, mPlayer);
    }
Пример #4
0
 public virtual void update(float elapsedTime)
 {
     if (mStateTime >= 0.0f)
     {
         mStateTime -= elapsedTime;
         if (mStateTime <= 0.0f)
         {
             mStateTime = -1.0f;
             CommandCharacterRemoveState cmd = newCmd(out cmd);
             cmd.mState = mType;
             pushCommand(cmd, mPlayer);
         }
     }
 }
Пример #5
0
 public override void update(float elapsedTime)
 {
     base.update(elapsedTime);
     mWrongDirectionTime += elapsedTime;
     if (mWrongDirectionTime >= GameDefine.WRONG_DIRECTION_TIME)
     {
         // 重置角色方向
         pushCommand <CommandCharacterReset>(mPlayer);
         // 退出当前状态
         CommandCharacterRemoveState cmdState = newCmd(out cmdState);
         cmdState.mState = mType;
         pushCommand(cmdState, mPlayer);
     }
 }
Пример #6
0
    public override void execute()
    {
        Character character = mReceiver as Character;
        // 无论是否完成比赛,都需要添加完成比赛的状态
        CommandCharacterAddState cmdState = newCmd(out cmdState);

        cmdState.mState = PLAYER_STATE.PS_FINISH;
        pushCommand(cmdState, character);
        // 如果是玩家自己,则显示是否比赛完成
        if (character.isType(CHARACTER_TYPE.CT_MYSELF))
        {
            mScriptCircleTip.notifyFinishRace(mFinish);
        }
        // 移除瞄准状态
        if ((character as CharacterOther).getStateMachine().hasState(PLAYER_STATE.PS_AIM))
        {
            CommandCharacterRemoveState cmdRemoveState = newCmd(out cmdRemoveState);
            cmdRemoveState.mState = PLAYER_STATE.PS_AIM;
            pushCommand(cmdRemoveState, character as CharacterOther);
        }
    }
Пример #7
0
 public override void update(float elapsedTime)
 {
     if (mData.mSpeed > 0.0f)
     {
         // 判断当前方向是否合法
         bool wrongDirection = directionCheck();
         // 圈数检测,更新当前移动距离,反向检测,完成比赛检测
         if (!wrongDirection)
         {
             int   curPointIndex = mData.mCurWayPoint;
             float runDistance   = mWayPointManager.getRunDistance(mCharacter.getPosition(), ref curPointIndex, curPointIndex);
             if (!mPassedPointList.Contains(curPointIndex))
             {
                 mPassedPointList.Add(curPointIndex);
             }
             // 防止在游戏开始后 后退到终点线之前 导致已过路点添加错误 最后圈数检测错误
             if (runDistance >= mWayPointManager.getTotalLength() / 2 && mPassedPointList.Count <= mWayPointManager.getPointCount() / 3)
             {
                 mPassedPointList.Clear();
             }
             // 已经进入下一圈,并且上一次经过的是当前圈的最后一个路段,当前正处于第0个路段,并且已经完成了当前圈一半以上的路段
             if (runDistance > 0.0f &&
                 curPointIndex == 0 && mPassedPointList[mPassedPointList.Count - 1] == mWayPointManager.getPointCount() - 1 &&
                 mPassedPointList.Count >= mWayPointManager.getPointCount() / 2)
             {
                 // 圈数改变
                 mPassedPointList.Clear();
                 CommandCharacterCircleChanged cmdCircle = newCmd(out cmdCircle);
                 cmdCircle.mCircle = mData.mCircle + 1;
                 pushCommand(cmdCircle, mCharacter);
             }
             // 如果已经跑完比赛了,则将距离和路点清零
             if (mCharacter.hasState(PLAYER_STATE.PS_FINISH))
             {
                 curPointIndex = 0;
                 runDistance   = 0.0f;
             }
             // 里程改变,必须在更新圈数后才能更新里程,因为计算里程会使用圈数
             CommandCharacterDistanceChanged cmdDistance = newCmd(out cmdDistance, false);
             cmdDistance.mWayPoint = curPointIndex;
             cmdDistance.mDistance = runDistance;
             pushCommand(cmdDistance, mCharacter);
             mWrongDirectionTime = 0.0f;
             //方向正确后退出游戏中的错误方向状态
             if (mCharacter.hasState(PLAYER_STATE.PT_WRONG_DIRECTION))
             {
                 CommandCharacterRemoveState cmdRemoveState = newCmd(out cmdRemoveState);
                 cmdRemoveState.mState = PLAYER_STATE.PT_WRONG_DIRECTION;
                 pushCommand(cmdRemoveState, mCharacter);
             }
         }
         else
         {
             if (!mCharacter.hasState(PLAYER_STATE.PT_WRONG_DIRECTION))
             {
                 mWrongDirectionTime += elapsedTime;
                 if (mWrongDirectionTime >= GameDefine.WRONG_DIRECTION_TIPS_TIME)
                 {
                     CommandCharacterAddState cmdState = newCmd(out cmdState);
                     cmdState.mState = PLAYER_STATE.PT_WRONG_DIRECTION;
                     pushCommand(cmdState, mCharacter);
                     mWrongDirectionTime = 0.0f;
                 }
             }
         }
     }
     base.update(elapsedTime);
 }