示例#1
0
文件: Floor.cs 项目: m-ishikawa/Rlike
    public bool CanAdvance(Loc fm, Dir dir)
    {
        Loc to = fm.Forward(dir);

        if (!(_map.IsRoomOrPassage(fm) && _map.IsRoomOrPassage(to)))
        {
            return(false);
        }

        // 障害物が配置されているなら進めない
        if (ExistsObstacle(to))
        {
            return(false);
        }

        if (fm.IsDiagonal(to))   // 斜め移動のときは、左右に障害物があるなら進めない
        {
            if (_map.IsWall(fm.Row, to.Col) || _map.IsWall(to.Row, fm.Col))
            {
                return(false);
            }
            return(true);
        }
        return(true); // to に移動できる
    }
示例#2
0
    public static IEnumerator Move(GameObject target, Loc fm, Loc to)
    {
        var src = fm.ToPosition();
        var dst = to.ToPosition();

        float speed    = fm.IsDiagonal(to) ? Config.DiagonalMoveSpeed : Config.MoveSpeed;
        float duration = Vector3.Distance(src, dst) / speed;

        yield return(Lerp(duration, src, dst, pos => {
            target.transform.position = pos;
        }));

        target.transform.position = dst;
    }
示例#3
0
    public static IEnumerator MoveEnemy(Enemy enemy, Loc to)
    {
        Loc fm  = enemy.Loc;
        var src = fm.ToPosition();
        var dst = to.ToPosition();

        float speed    = fm.IsDiagonal(to) ? Config.DiagonalMoveSpeed : Config.MoveSpeed;
        float duration = Vector3.Distance(src, dst) / speed;

        yield return(Lerp(duration, src, dst, pos => {
            enemy.Position = pos;
        }));

        enemy.UpdateLoc(to);
    }
示例#4
0
    // カメラ追従
    public static IEnumerator MovePlayer(Player player, Loc to)
    {
        Loc   fm       = player.Loc;
        var   src      = fm.ToPosition();
        var   dst      = to.ToPosition();
        float speed    = fm.IsDiagonal(to) ? Config.DiagonalMoveSpeed : Config.MoveSpeed;
        float duration = Vector3.Distance(src, dst) / speed;

        yield return(Lerp(duration, src, dst, pos => {
            player.Position = pos;
            player.SyncCameraPosition();
        }));

        player.UpdateLoc(to);
    }