コード例 #1
0
            public override void update()
            {
                if (MapCharacterMoveSystem.arrived(mParent.parent, mTargetPosition))
                {
                    //移動先に着いた
                    mParent.mWalkState = new StoppingState(mParent);
                    return;
                }
                //移動方向の決定
                Vector2 tDirection = mTargetPosition - mParent.parent.mMapPosition.vector2;

                mParent.parent.mState.move(new Vector3(tDirection.x, 0, tDirection.y));
            }
コード例 #2
0
    //<summary>フレーム毎の更新</summary>
    public static void updateWorld(MapWorld aWorld)
    {
        //キャラの内部状態を更新して移動先決定
        foreach (MapCharacter tChara in aWorld.mCharacters)
        {
            tChara.updateInternalState();
            //移動用データ初期化
            MapCharacterMoveSystem.initFrameMovingData(tChara);
        }
        //キャラの移動
        //まだ移動可能なキャラ
        List <MapCharacter> tWaiting    = new List <MapCharacter>();
        List <MapCharacter> tProcessing = new List <MapCharacter>(aWorld.mCharacters);
        bool tExistWaiting = false;

        for (; ;)
        {
            foreach (MapCharacter tCharacter in tProcessing)
            {
                //移動
                bool tRemainedDistance;
                if (tCharacter.mMovingData.mRemainingDistance > 0)
                {
                    tRemainedDistance = MapCharacterMoveSystem.moveCharacter(tCharacter);
                    //高さ更新
                    if (MapHeightUpdateSystem.updateHeight(tCharacter))
                    {
                        //高さ更新で座標が変更された
                        if (MapCharacterMoveSystem.isCollided(tCharacter))
                        {
                            //高さ更新の結果衝突した
                            MapCharacterMoveSystem.resetMoveDelta(tCharacter);//delta移動処理をリセット
                        }
                    }
                    //trigger
                    MapTriggerUpdater.trigger(tCharacter, aWorld.mEventSystem);
                    //encount
                    if (tCharacter.isPlayer() && tCharacter.getOperation() == MapCharacter.Operation.free)
                    {
                        encountCount(tCharacter, aWorld);
                    }
                }
                else
                {
                    tRemainedDistance = false;
                }

                //まだ移動できるか
                if (tRemainedDistance)
                {
                    tWaiting.Add(tCharacter);
                    tExistWaiting = true;
                }

                //これ以上移動しない
                //画像イベント
                applyImageEvent(tCharacter);
                //影
                MapShadowUpdater.updateShadow(tCharacter);
                //移動データリセット
                MapCharacterMoveSystem.resetFrameMovingData(tCharacter);
                //delegateに移動通知
                if (tCharacter.isPlayer() && tCharacter.getOperation() == MapCharacter.Operation.free)
                {
                    aWorld.mMap.mDelegate.report("move", new Arg(new Dictionary <string, object>()
                    {
                        { "distance", (tCharacter.mMovingData.mPrePosition.vector2 - tCharacter.mMapPosition.vector2).magnitude }
                    }));
                }
            }
            if (!tExistWaiting)
            {
                break;
            }
            tProcessing = tWaiting;
            tWaiting.Clear();
            tExistWaiting = false;
        }
        //エンカウント
        if (aWorld.mMap.mEncountSystem.mIsFire)
        {
            if (aWorld.mEventSystem.encount(aWorld.mMap.mEncountSystem.mEncountKey))
            {
                aWorld.mMap.mEncountSystem.resetCount();//エンカウントイベント実行成功
            }
            else
            {
                aWorld.mMap.mEncountSystem.lastCount();//エンカウントイベント実行失敗
            }
        }
        //話しかけるor調べる
        foreach (MapCharacter tCharacter in aWorld.mCharacters)
        {
            if (!tCharacter.mMovingData.mSpeak)
            {
                continue;
            }
            MapSpeakUpdater.speak(tCharacter, aWorld.mEventSystem);
            tCharacter.mMovingData.mSpeak = false;
        }
        //待機中のイベントを実行
        aWorld.mEventSystem.runWaitingEvents();
    }