Форум программистов, компьютерный форум, киберфорум
SFML
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 10.03.2025
Сообщений: 6

C# SFML Ошибка в логике коллизии игрока с врагом

03.04.2025, 18:08. Показов 3022. Ответов 2

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Пишу небольшой 2D-платформе на C# с использованием библиотеки SFML.
Есть трудность в написании метода столкновения игрока с врагами.
Если мы идем вправо на врага (или враг на нас слева), то при столкновении враг отталкивается от игрока, отнимаются жизни, всё нормально.
Если мы идем на врага влево (или враг на нас справа), то при столкновении враг просто упирается в игрока, а должен отталкиваться. В чем может быть ошибка?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 private void CollisionsWithGreenEnemies()
 {
     for (int i = 0; i < greenEnemies.Length; i++) // цикл по массиву врагов
     {
         if (player.sprite.GetGlobalBounds().Intersects(greenEnemies[i].sprite.GetGlobalBounds())) // если игрок сталкивается с врагом
         {
             if (greenEnemies[i].dx > 0) // если враг идет вправо
             {
                 if (player.dx <= 0)  // а игрок влево или стоит на месте
                 {
                     greenEnemies[i].x = player.x - 32; // координата врага = координата игрока - 32 (размер спрайта)
                 }
                 greenEnemies[i].dx *= -1; // движение врага в другую сторону
             }
 
             if (greenEnemies[i].dx < 0) // если враг идет влево
             {
                 if (player.dx > 0) // а игрок право
                 {
                     greenEnemies[i].x = player.x + 32; // координата врага = координата игрока + 32 (размер спрайта)
                 }
                 greenEnemies[i].dx *= -1; // движение врага в другу сторону
             }
             player.health -= 20; // отнимаем 20 жизней
         }
     }
 }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.04.2025, 18:08
Ответы с готовыми решениями:

В моменте добавления кода к анимации врага в строке с типом Duration возникает ошибка
Здравствуйте! Я учусь по книге &quot;изучаем C#&quot;.Сейчас прохожу главу по созданию игры. В моменте добавления кода к анимации врага с строке...

Игра танки тормозит при появлении 6 и более врагов
как то писал курсач -&quot;танки&quot;. c# знал плохо, ооп вообще не понимал. сейчас стал кое что понимать решил повторить попытку. столкнулся с тем,...

Здоровье врагов в массиве
Здравствуйте, название темы нелепое, за это простите пожалуйста. Значит так, пишу я игру, что то вроде tower defence. Есть у меня...

2
Just Do It!
 Аватар для XLAT
4211 / 2668 / 655
Регистрация: 23.09.2014
Сообщений: 9,082
Записей в блоге: 3
04.04.2025, 08:44
Цитата Сообщение от amarok36 Посмотреть сообщение
C++
18
if (player.dx > 0) // а игрок право
исправьте на:
C++
18
if (player.dx >= 0) // а игрок право
0
0 / 0 / 0
Регистрация: 10.03.2025
Сообщений: 6
04.04.2025, 17:35  [ТС]
Переписал метод на такой лад. И вроде бы всё работает. Но когда мы зажимаем врага рядом с одной из стен карты, мы все равно можем с ним пересечься, буквально наложить один спрайт на другой. Когда спрайт врага и спрайт игрока наложены друг на друга у самого края стены, враг вылетает за пределы карты и игра вылетает с исключением Unhandled exception. System.IndexOutOfRangeException: Index was outside the bounds of the array at System.String.get_Chars(Int32 index)

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void CollisionsWithGreenEnemies()
{
    for (int i = 0; i < greenEnemies.Length; i++)
    {
        if (player.sprite.GetGlobalBounds().Intersects(greenEnemies[i].sprite.GetGlobalBounds()))
        {
            if ((player.x - greenEnemies[i].x) <= 32 && player.dx < 0)
            {
                greenEnemies[i].x = player.x - 32;
            }
 
            if ((greenEnemies[i].x - player.x) <= 32 && player.dx > 0)
            {
                greenEnemies[i].x = player.x + 32;
            }
            player.health -= 20;
            greenEnemies[i].dx *= -1;
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
04.04.2025, 17:35
Помогаю со студенческими работами здесь

Как реализовать навыки врагам?
Я создал класс с параметрами имя хп атк скил На основе этого класса создал героя и 3х врагов метода файт

Как сделать коллизиум в данной программе
По заданию, я почти все сделала. Столкновение со стенками, скольжение и т.п. Помогите пожалуйста теперь сделать соприкосновение с объектом...

Коллизии и Hashtable
Уважаемые форумчане, пишу я программу с использованием стандартной шарповской хеш-таблицы. Как ключ у нас есть число, а как значение массив...

Определить коллизию прямоугольников
Ребят зашел в тупик(. Моя задача такова: у меня есть 2 прямоугольника. Надо определить их коллизию и еще координаты прямоугольника...

Коллизии при использовании статического массива многими клиентами одновременно
Есть массив internal static int. К нему обращаются на чтение и запись клиенты. Какие могут возникать коллизии и как их избежать?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru