Возникла проблема с остановкой барабана игрового автомата в нужном месте. - PullRequest
1 голос
/ 20 июня 2019

Я строю игру на игровом автомате в Cocossharp, и у меня возникают проблемы с остановкой барабанов в правильном месте и для поддержания равного расстояния между фигурами.Нижняя часть каждой строки должна быть равна нижней переменной.

Чтобы заставить части в правильном месте, я вызываю AdjustStoppedPosition ().Проблема в том, что он начинает помещать дополнительное пространство между частями.

moveBySpeed = 95;
offset = 10;
bottom = 260; // this is where the bottom of the last visible piece should be
// lastNode is set to the last (very top) piece that was added

private void OnFrame(float timeInSeconds)
{
    if (doneCount == ChildrenCount)
    {
        doneCount = 0;
        adjusting = false;
        OnStopped();
    }

//The following is being called in the game loop:

if (moveBySpeed <= 0)
    return;

for (int i = 0; i < ChildrenCount; i++)
{
    var piece = Children[i];
    if (piece.PositionY - moveBySpeed >= 0)
    {
        piece.Position = new CCPoint(piece.PositionX, piece.PositionY - moveBySpeed);
    }
    else
    {
        // Move back to the top.                
        piece.Position = new CCPoint(piece.PositionX, lastNode.BoundingBox.MaxY + offset);
        lastNode = piece;                        
    }
}

moveBySpeed -= .25f;

if (moveBySpeed <= 0)
   AdjustStoppedPosition();
}

private void AdjustStoppedPosition()
{
    adjusting = true;

    CCNode closest = null;
    float distance = float.MaxValue;

    for (int i = 0; i < ChildrenCount; i++)
    {
        var diff = Children[i].BoundingBox.MinY - bottom;

        if (diff > 0 && diff < distance)
        {
            distance = diff;
            closest = Children[i];
        }
    }

    for (int i = 0; i < ChildrenCount; i++)     
        Children[i].RunAction(new CCSequence(new CCMoveTo(.5f, new CCPoint(Children[i].PositionX, Children[i].BoundingBox.MinY - distance)), new CCCallFunc( () => {doneCount++;})));

}     
...