Вы можете найти полный код здесь: 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
Как исправить движение Pacman на случай, если есть стена, но пользователь может изменить направление? ⇐ C#
Место общения программистов C#
1750551180
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"/>
То же самое здесь, в этом случае Пакман движется вправо, и я могу изменить его направление, которое не является логикой
Подробнее здесь: [url]https://stackoverflow.com/questions/79674615/how-to-fix-the-pacman-movement-in-case-there-is-a-wall-but-the-user-can-change-d[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия