Как исправить движение Pacman на случай, если есть стена, но пользователь может изменить направление?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как исправить движение Pacman на случай, если есть стена, но пользователь может изменить направление?

Сообщение Anonymous »

Вы можете найти полный код здесь: https://github.com/chocolade1972/pacman
Например, я перемещаю Пакмана вправо, но нет никаких путей вверх/вниз, но я все еще могу изменить направление Пакмана вверх или вниз. Pacman будет продолжать пытаться подняться. Вверх и столкнуться со стеной. Но в некоторых местах на карте вы можете изменить направление либо вверх/вниз, слева/справа, даже если нет пути, и пакман просто столкнется с стеной, пытаясь двигаться таким образом.private bool CanMove(PointF pos, Dir dir)
{
if (dir == Dir.None) return false;
var next = MovePoint(pos, dir, 0.5f);
int x = (int)MathF.Round(next.X);
int y = (int)MathF.Round(next.Y);

// Allow horizontal tunnel wrap at Y = 14
if (y == 14 && (x < 0 || x >= Cols))
return true;

if (x < 0 || x >= Cols || y < 0 || y >= Rows)
{
return false;
}
return _map[y][x] != '#';
}
< /code>
И в этом методе я называю его и использую: < /p>
private void StepPacman()
{
// Try to apply player input (_nextDir), if possible
if (CanMove(_pac, _nextDir))
{
_pacDir = _nextDir;
}

// Move Pacman if possible
if (CanMove(_pac, _pacDir))
{
_pac = MovePoint(_pac, _pacDir, PacmanMoveSpeed);

// Tunnel wrap on row Y = 14
if (MathF.Round(_pac.Y) == 14)
{
if (_pac.X < -1f)
_pac.X = Cols;
if (_pac.X > Cols)
_pac.X = -1f;
}

// Lock axis — snap to nearest tile center
if (_pacDir == Dir.Left || _pacDir == Dir.Right)
_pac.Y = (float)Math.Round(_pac.Y);
else if (_pacDir == Dir.Up || _pacDir == Dir.Down)
_pac.X = (float)Math.Round(_pac.X);
}

// Animate Pacman mouth
_mouthAnim += MouthSpeed;
if (_mouthAnim > MathF.PI) _mouthAnim -= MathF.PI;

int cx = (int)MathF.Round(_pac.X);
int cy = (int)MathF.Round(_pac.Y);

// Prevent index error when wrapping out of bounds
if (cx >= 0 && cx < Cols && cy >= 0 && cy < Rows && _map[cy][cx] is '.' or 'o')
{
ReplaceMapTile(cx, cy, ' ');
_score += 10;
_pelletCount--;
if (_rawMap[cy][cx] == 'o') ActivatePower();
if (_pelletCount == 0) ResetLevel();
}
}
< /code>
Что я попробовал до сих пор: < /p>
Изменил это, если проверка строка: < /p>
if (CanMove(_pac, _nextDir))
< /code>
до этого: < /p>
if (IsCentered(_pac) && CanMove(new PointF((float)Math.Round(_pac.X), (float)Math.Round(_pac.Y)), _nextDir))
< /code>
Но это делает коллайдер Pacman на стену, а затем никогда больше не движется. < /p>
Я тоже пытался изменить его на это: < /p>
if (IsAligned(_pac, _nextDir) && CanMove(_pac, _nextDir))
< /code>
и добавил этот метод помощник: < /p>
private static bool IsAligned(PointF p, Dir dir)
{
if (dir == Dir.Left || dir == Dir.Right)
return Math.Abs(p.Y - Math.Round(p.Y)) < 0.15f;
else if (dir == Dir.Up || dir == Dir.Down)
return Math.Abs(p.X - Math.Round(p.X)) < 0.15f;
else
return true;
}
< /code>
Но та же проблема, что и раньше, теперь я могу снова переместить Пакмана, но проблема с человеком остается. Справа. src = "https://i.sstatic.net/wxgluetw.jpg"/>
То же самое здесь, в этом случае Пакман движется вправо, и я могу изменить его направление, которое не является логикой


Подробнее здесь: https://stackoverflow.com/questions/796 ... n-change-d
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»