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

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

03.04.2025, 18:08. Показов 2147. Ответов 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
4166 / 2600 / 650
Регистрация: 23.09.2014
Сообщений: 8,331
Записей в блоге: 2
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
Ответ Создать тему
Новые блоги и статьи
Dev-c++5.11 Покорение вершины
russiannick 02.06.2025
С утра преследовала одна мысль - вот бы выучить С++. Сказано-сделано. Окончив смену, скачал в интернете бестселлер Дэвиса Dev-C++ для чайников. Книга оказалась интересной и я скачал среду, на примере. . .
Тестирование Pull Request в Kubernetes с GitHub Actions и GKE
Mr. Docker 02.06.2025
Мы все знаем, что тестирование на локальной машине или в изолированном CI-окружении — это не совсем то же самое, что тестирование в реальном кластере Kubernetes. Контекстно-зависимые ошибки, проблемы. . .
Оптимизация CMake для ускорения сборки
bytestream 02.06.2025
Вы когда-нибудь ловили себя на мысле, что пока ваш проект компилируется, можно успеть сварить кофе, прочитать главу книги или даже сбегать в соседний офис? Если да, то добро пожаловать в клуб. . .
JS String.prototype.localeCo­mpare()
mr_dramm 02.06.2025
скопировано из этой темы чтобы не потерялось. localeCompare без указания локали для сравнения строк под капотом использует Intl. Collator , который работает согласно Unicode Collation Algorithm. . .
Облако проектов
russiannick 01.06.2025
Слава Джа, написал прогу для компиляции. Значит написал компилятор? Обьем кода 300+ строк. Язык-яву. Вводим данные, заполняем поля, тычем радиобаттоны. И по итогу в поле результат получам листинг. . .
Rust и квантовые вычисления: интеграция с Q# и Qiskit
golander 01.06.2025
Мир квантовых вычислений традиционно оставался закрытым клубом для высокоуровневых языков типа Python и специализированных DSL вроде Q#. Однако в последние годы Rust начал тихую революцию в этой. . .
Кэш REDIS и C#
UnmanagedCoder 01.06.2025
Redis (Remote Dictionary Server) - это ультраскоростное хранилище данных в оперативной памяти, работающее по принципу "ключ-значение". Суть проста: данные хранятся не на диске, а прямо в RAM, что. . .
Lenovo IH110CX Rev: 1.0 motherboard manual
Maks 01.06.2025
Размещения без повторений
VistaSV30 31.05.2025
Код возвращает список вариантов размещений A^{k}_{n}=\frac{n!}{(n-k)!} from itertools import permutations def pwr(k, n): # Размещение без повторений (Placement without repetition) if k. . .
Redis и Node.js с TypeScript - решения для высоконагруженных систем
Reangularity 31.05.2025
Redis (Remote Dictionary Server) — сверхбыстрое хранилище данных в памяти, способное обрабатывать операции за микросекунды. И что особенно важно для нас — с удивительно простым API. А теперь. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru
OSZAR »