首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何修复我基于瓷砖的游戏的瓷砖移动代码?(就像CandyCrush风格)

如何修复我基于瓷砖的游戏的瓷砖移动代码?(就像CandyCrush风格)
EN

Game Development用户
提问于 2016-03-07 14:18:21
回答 2查看 355关注 0票数 0

我目前正在创建一个基于瓷砖的游戏,像一个CandyCrush风格的方向运动(只有向下移动没有问题),试图用一块板来平滑,而不是滞后的瓷砖运动,我现在正在写一份关于它的报告。

然而,我发现很难恰当地描述它。我的瓷砖移动代码有一些奇怪的问题。我正在努力使它是一个平稳的,有序的,和分蘖没有分类,小马车,蓝色的。需要更多优化..。

更新:

-I删除了代码上的DiagonallyMover,现在它很简单。-But,Vector3 fallDestination总是得到最新的空片段。没有分类。

Update2:

-I在这里添加了我的移动代码。-When移动方向的x和y,而不是0,它是横向移动的。

我的代码就是这样工作的;

我不想做的;

有人能修一下这段代码吗?

我的行动守则:

代码语言:javascript
复制
public bool UpdateTilePhysics(DestructionBoardPiece curPiece) {
    this.UpdateFallingTilePosition(curPiece);
    bool hasTileReachedFallDestination = this.HasTileReachedFallDestination(ref this.fallDestination);
    if (!hasTileReachedFallDestination) {
        this.moveVelocity = Mathf.Min(this.moveVelocity + this.acceleration * Time.smoothDeltaTime, this.maxVelocity);
    } else {
        if (this.isSpawnedFromBehindMask) {
            this.distanceSinceSpawned = Mathf.Max(1f, this.distanceSinceSpawned);
            this.CheckDistanceSinceSpawnedTriggers();
        }
        base.LocalPosition = this.fallDestination;
    }
    return hasTileReachedFallDestination;
}

protected void UpdateFallingTilePosition(DestructionBoardPiece curPiece) {
    if (this.isSpawnedFromBehindMask) {
        Vector3 a = this.fallDestination;
        a.z = base.LocalPosition.z;
        this.moveDirection = (a - base.LocalPosition).normalized;
        base.LocalPosition += this.moveDirection * this.moveVelocity * Time.deltaTime;
        this.distanceSinceSpawned += this.moveVelocity * Time.deltaTime;
        this.CheckDistanceSinceSpawnedTriggers();
        return;
    }
   
    this.moveDirection = (this.fallDestination - base.LocalPosition).normalized;
    base.LocalPosition += this.moveDirection * this.moveVelocity * Time.deltaTime;
}

我的重力代码:

代码语言:javascript
复制
protected IEnumerator ActiveGravityChecker() {
    DestructionBoardPiece destructionBoardPiece = null;
    DestructionBoardPiece destructionBoardPiece2 = null;
    DestructionBoardPiece destructionBoardPiece3 = null;
    while (this.GravityUpdateEnabled) {
        if (!base.enabled || !this.GravityEnabled || base.BoardPiece == null) {
            yield return null;
        } else {
            this.debugActiveGravity = true;
            destructionBoardPiece = (base.BoardPiece as DestructionBoardPiece);
            if (destructionBoardPiece3 == null) destructionBoardPiece3 = destructionBoardPiece;
            this.fallDestination = destructionBoardPiece.LocalPosition;
            bool canMoveDown = false;
            if (destructionBoardPiece.LockCount <= 0 && destructionBoardPiece.BottomLink != null && !destructionBoardPiece.BottomLink.IsBlocked && ((this.tileMovedDiagonally && this.HasReachedBoardPieceArea()) || !this.tileMovedDiagonally)) {
                if (destructionBoardPiece.BottomLink.Tile == null) {
                    destructionBoardPiece2 = destructionBoardPiece.BottomLink;
                    canMoveDown = true;
                    this.tileMovedDiagonally = false;
                } else if (destructionBoardPiece.BottomLink.Tile.IsMoving && this.HasTileInArea(destructionBoardPiece.BottomLink.Tile as DestructionTile)) {
                    this.moveVelocity = (destructionBoardPiece.BottomLink.Tile as DestructionTile).moveVelocity;
                }
            }
            if (destructionBoardPiece.LockCount <= 0 && !canMoveDown && this.HasReachedBoardPieceArea()) {
              
              //Removed DiagonallyMover Code
            }
            if (canMoveDown) {
                this.fallDestination = destructionBoardPiece2.LocalPosition;
                if (destructionBoardPiece.Tile == this) {
                    destructionBoardPiece.MoveTileTo(destructionBoardPiece2);
                }
                destructionBoardPiece.UpdateOrphanState();
            }
            if (!canMoveDown && this.UpdateTilePhysics(destructionBoardPiece) && (destructionBoardPiece2 == null || (destructionBoardPiece2.Tile != null && !destructionBoardPiece2.Tile.IsMoving) || destructionBoardPiece == destructionBoardPiece2 || destructionBoardPiece.LockCount > 0)) {
                destructionBoardPiece.Tile = this;
                destructionBoardPiece.ResetTilePosition();
                this.TileStoppedMoving(ref destructionBoardPiece3);
                base.IsMoving = false;
                this.RaiseEventTileFinishedActiveGravity(destructionBoardPiece3);
                this.moveVelocity = 0f;
                break;
            }
            yield return null;
        }
    }
    this.debugActiveGravity = false;
    yield break;
}
EN

回答 2

Game Development用户

发布于 2016-03-07 15:37:18

我没看你的密码。

你想要复制的东西似乎有两个“轨道”,糖果跟着。他们似乎只有在自己的轨道上有可用的空间的情况下才能前进。

您的实现似乎使糖果直接走到了应有的位置,这使它们偏离了自己的轨道。另外,你的一些糖果看起来像是改变了轨道。

我撒谎了,我看了你的密码。

您的代码看起来非常复杂,调试起来也很困难。

我建议你实施一个简单的‘跟踪’系统,糖果将遵循。你假装轨道上的重力。或者,如果我们用另一种方式来看它,它就会和我们星期一早上在繁忙的街道上看到的一样的行为:交通拥挤的汽车。

你的第一首曲目应该是一组直线,然后你可以添加曲线。

票数 2
EN

Game Development用户

发布于 2016-03-07 17:45:46

几年前,我在类似的瓷砖运动系统上工作时,你似乎走了一条我曾经做过的路。最后,我选择了一条类似于“糖果粉碎”的路线。

首先要考虑的是,在您的示例中,当其他瓷砖仍在移动时,您将移除瓷砖。糖果粉碎不会那么做的。你交换两块,然后游戏反应,清除那些瓷砖,并移动所有的东西。然后,它允许你再次互动。

这样做的好处是,它在逻辑中创建了不同的点,在这里,您可以计算碎片在瓷砖系统中的移动位置,然后将其动画到这些点上。

除此之外,请参考Alexandre的建议,因为运动的路径系统更适合这个应用程序。这消除了所有的含糊不清的方向块应该在板周围流动,并消除了许多复杂性在您的系统。

票数 1
EN
页面原文内容由Game Development提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://gamedev.stackexchange.com/questions/117843

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档