我目前正在创建一个基于瓷砖的游戏,像一个CandyCrush风格的方向运动(只有向下移动没有问题),试图用一块板来平滑,而不是滞后的瓷砖运动,我现在正在写一份关于它的报告。
然而,我发现很难恰当地描述它。我的瓷砖移动代码有一些奇怪的问题。我正在努力使它是一个平稳的,有序的,和分蘖没有分类,小马车,蓝色的。需要更多优化..。
-I删除了代码上的DiagonallyMover,现在它很简单。-But,Vector3 fallDestination总是得到最新的空片段。没有分类。
-I在这里添加了我的移动代码。-When移动方向的x和y,而不是0,它是横向移动的。
我的代码就是这样工作的;
我不想做的;
有人能修一下这段代码吗?
我的行动守则:
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;
}
我的重力代码:
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;
}
发布于 2016-03-07 15:37:18
我没看你的密码。
你想要复制的东西似乎有两个“轨道”,糖果跟着。他们似乎只有在自己的轨道上有可用的空间的情况下才能前进。
您的实现似乎使糖果直接走到了应有的位置,这使它们偏离了自己的轨道。另外,你的一些糖果看起来像是改变了轨道。
我撒谎了,我看了你的密码。
您的代码看起来非常复杂,调试起来也很困难。
我建议你实施一个简单的‘跟踪’系统,糖果将遵循。你假装轨道上的重力。或者,如果我们用另一种方式来看它,它就会和我们星期一早上在繁忙的街道上看到的一样的行为:交通拥挤的汽车。
你的第一首曲目应该是一组直线,然后你可以添加曲线。
发布于 2016-03-07 17:45:46
几年前,我在类似的瓷砖运动系统上工作时,你似乎走了一条我曾经做过的路。最后,我选择了一条类似于“糖果粉碎”的路线。
首先要考虑的是,在您的示例中,当其他瓷砖仍在移动时,您将移除瓷砖。糖果粉碎不会那么做的。你交换两块,然后游戏反应,清除那些瓷砖,并移动所有的东西。然后,它允许你再次互动。
这样做的好处是,它在逻辑中创建了不同的点,在这里,您可以计算碎片在瓷砖系统中的移动位置,然后将其动画到这些点上。
除此之外,请参考Alexandre的建议,因为运动的路径系统更适合这个应用程序。这消除了所有的含糊不清的方向块应该在板周围流动,并消除了许多复杂性在您的系统。
https://gamedev.stackexchange.com/questions/117843
复制相似问题