Столкновения платформы C #, не работающие с несколькими платформами - PullRequest
0 голосов
/ 21 ноября 2018

Сейчас я пытаюсь сделать простой редактор игр на C #, однако есть проблема с тем, когда пользователь добавляет на экран более одной платформы:

private void tmrRunGame_Tick(object sender, EventArgs e)
        {
            foreach(Platform plat in platList)
            {
                if (plat.getBounds().IntersectsWith(player.getBounds()))
                {
                    tmrGravity.Stop();
                    isColliding = true;
                }
                else
                {
                    isColliding = false; 
                }
            }

            if(player.getY() < 500 && !isJumping && !isColliding)
            {
                tmrGravity.Start();
            }
            else
            {
                tmrGravity.Stop();
            }
        }

Этот код останавливает пользователяот провала через последнюю созданную платформу, все из которых до этого пользователь мог просто провалиться.Что делает это еще более запутанным, так это то, что программа выявляет коллизии для всех платформ, но делает только то, что должна для одной!Это очень расстраивает, и любая помощь приветствуется.

Вот как я добавляю платформы, если это помогает каким-либо образом:

private void pbPlatformSelect_MouseClick(object sender, MouseEventArgs e)
        {
            Platform plat = new Platform(100, 10, 50, 50);
            plat.drawTo(this);
            platList.Add(plat);
        }

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Замените цикл foreach на этот код:

var playerBounds = player.GetBounds ();
isColliding = platList.Any (plat => plat.GetBounds ().IntersectsWith (playerBounds);
if (isColliding) tmrGravity.Stop ();

, если вам не нравится LINQ, вы можете изменить свой цикл следующим образом:

var playerBounds = player.GetBounds ();
isColliding = false;
foreach (var plat in platList) {
    if (plat.GetBounds ().IntersectsWith (playerBounds)) {
        isColliding = true;
        tmrGravity.Stop ();
        break;
    }
}
0 голосов
/ 21 ноября 2018

Я думаю, что вы хотите выйти из цикла foreach, как только определите, что столкнулись с чем-то.Если у вас есть 3 платформы, и вы сталкиваетесь с первой, isColliding имеет значение true, но если он не сталкивается со второй платформой, он переключит isColliding на false.В конце концов, каким бы ни был результат пересечения последней платформы в списке, это и будет значением isColliding.

Так что попробуйте поставить 'break;'сразу после «isColliding = true»;

Это также повышение эффективности, потому что если у вас 1000 платформ, а игрок сталкивается с первой, нас не волнуют другие (из того, что я могу сказать)) и мы экономим 999 итераций цикла.

...