Четверг, 28 Марта 2024, 11:58

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
Форум игроделов » Программирование » C/C++ » Вопрос-Ответ (C++) (Вопросы по С++ задаём здесь.)
Вопрос-Ответ (C++)
KornivalДата: Воскресенье, 04 Сентября 2011, 19:10 | Сообщение # 1
The Witcher
Сейчас нет на сайте
Чтобы не создавать отдельную тему на каждый глупый вопрос, предлагаю задавать их здесь.

Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
kikas86Дата: Пятница, 17 Января 2014, 12:15 | Сообщение # 1181
постоянный участник
Сейчас нет на сайте
Цитата -l33t-h4xx- ()
kikas86, в замечательной книжке Л. Аммерала "Принципы программирования в машинной графике" в главе 2.5 ("Отсечение линий") описан хороший способ определения положения точки относительно прямоугольника с помощью битовых масок. Я думаю, приспособить его под пересекающиеся прямоугольники не составит большого труда.
Книжка легко гуглится.

Спасибо, сейчас найду =)

Добавлено (17.01.2014, 12:15)
---------------------------------------------
Здравствуйте, вот не могу сделать столкновение прямоугольников корректным, иногда из за большой скорости проходит сквозь элементы.
Делаю что то типо пинг понга.
Вот код проверки столкновения по сторонам прямоугольника:

Код
    private bool CollisionSide(double Px, double Py, double Pw, double Ph, double Bx, double By, double Bw, double Bh)
         {
             return (((Bx < Px) && (Bx + Bw >= Px)) || ((Bx > Px) && (Bx <= Px + Pw))) && (((By < Py) && (By + Bh >= Py)) || ((By > Py) && (By <= Py + Ph)));
         }

Проверяю с какой стороны находится элемент по вершинам прямоугольника, 2 функции что бы инвертировать вектор скорости, слева и справа инвертирую X, вверх и низ инвертирую Y:
1. Проверка расположения точки от прямоугольника:
Код
        private int PointLocation(double x, double y, double xmin, double ymin, double xmax, double ymax)
         {
             int p = 5;
             bool left = (x < xmin);
             bool right = (x > xmax);
             bool top = (y < ymin);
             bool bottom = (y > ymax);

             if (left) p = 2;
             if (top) p = 4;
             if (bottom) p = 6;
             if (right) p = 8;
             if (left && top) p = 1;
             if (left && bottom) p = 3;
             if (top && right) p = 7;
             if (bottom && right) p = 9;
             return p;
         }

2. Объединение этой функции с прямоугольником:
Код
        private int CebeLocation(double axmin, double aymin, double axmax, double aymax, double bxmin, double bymin, double bxmax, double bymax)
         {
             int a = PointLocation(axmin, aymin, bxmin, bymin, bxmax, bymax);
             int b = PointLocation(axmax, aymin, bxmin, bymin, bxmax, bymax);
             int c = PointLocation(axmin, aymax, bxmin, bymin, bxmax, bymax);
             int d = PointLocation(axmax, aymax, bxmin, bymin, bxmax, bymax);
             int p = 5;

             if (a == 5 || b == 5 || c == 5 || d == 5) return 5;

             if (a == 1 && b == 1 && c == 1 && d == 1) return 1;
             if (a == 3 && b == 3 && c == 3 && d == 3) return 3;
             if (a == 7 && b == 7 && c == 7 && d == 7) return 7;
             if (a == 9 && b == 9 && c == 9 && d == 9) return 9;

             if (a == 2 || b == 2 || c == 2 || d == 2) p = 2;
             if (a == 4 || b == 4 || c == 4 || d == 4) p = 4;
             if (a == 6 || b == 6 || c == 6 || d == 6) p = 6;
             if (a == 8 || b == 8 || c == 8 || d == 8) p = 8;

             return p;
         }

Помогите поправить недочеты, или подскажите свой способ рикошета от всех сторон поверхностей прямоугольники мяча. Мой способ хорош, но не корректный... Не доработан.


Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.
SnuuxДата: Пятница, 17 Января 2014, 14:25 | Сообщение # 1182
постоянный участник
Сейчас нет на сайте
При коллизии просто меняй координаты на противоположные. Для луа, тут хороший тутор: http://libzoetrope.org/docs/breaking_out. Обрати внимание на эти строки:
Код
onCollide = function (self, other)
    self.velocity.y = self.velocity.y * -1

   -- ... --
end
kikas86Дата: Пятница, 17 Января 2014, 14:57 | Сообщение # 1183
постоянный участник
Сейчас нет на сайте
Цитата Snuux ()
При коллизии просто меняй координаты на противоположные. Для луа, тут хороший тутор: http://libzoetrope.org/docs/breaking_out. Обрати внимание на эти строки:
Код
onCollide = function (self, other)
    self.velocity.y = self.velocity.y * -1

   -- ... --
end

Это же обычная инверсия. если просто удариться сверху или снизу, нужно тока менять вектор Y, а если слева и справа то только X, так что проверка должна быть... Это же рикошет, а если при коллизии менять оба вектора скорости то он просто полетит в туже сторону откуда летел!


Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.
goldsphereДата: Четверг, 23 Января 2014, 14:59 | Сообщение # 1184
заслуженный участник
Сейчас нет на сайте
Вот намутил по одному уроку клиент-серверное приложение, 2 квадратика, все дела... Но вот проблема. Когда друг включает сервер и я к нему подключаюсь по его ip - Всё нормально. Но если я включаю сервер, то он ко мне по моему ip подключиться не может. Я пробовал сам к себе по своему ip подключаться, тоже самое. Пробовал по 127.0.0.1 - всё работает. То есть по хорошему запускается 2 окна и там игроки, как у 2 пользователей, а в плохом случае только 1 и видимо клиентское, хотя не знаю. Вот фрагмент кода:
Код
string iptext;
sf::TcpSocket socket;
char connectionType, mode;
sf::IpAddress ip;
cout<<"Enter (s) for Server or (c) for client: ";
cin>>connectionType;
if(connectionType == 's')
{
   ip = sf::IpAddress::getPublicAddress();
   sf::TcpListener listener;
   listener.listen(53000);
   listener.accept(socket);
}
else if(connectionType == 'c')
{
   cin>>iptext;
   ip = sf::IpAddress(iptext);
   socket.connect(ip, 53000);
}


FinderX - Android Аркада

Сообщение отредактировал goldsphere - Четверг, 23 Января 2014, 15:00
-l33t-h4xx-Дата: Четверг, 23 Января 2014, 15:06 | Сообщение # 1185
участник
Сейчас нет на сайте
goldsphere, а ты перенаправление портов настраивал? Очень часто проблема в том, что порт, через который запрашивается доступ, закрыт.
В руководстве к модему должно быть написано, как открыть.


Как правильно задавать вопросы

Сообщение отредактировал -l33t-h4xx- - Четверг, 23 Января 2014, 15:07
goldsphereДата: Пятница, 24 Января 2014, 06:11 | Сообщение # 1186
заслуженный участник
Сейчас нет на сайте
-l33t-h4xx-, не помогло(

FinderX - Android Аркада
PAMCECДата: Четверг, 30 Января 2014, 18:42 | Сообщение # 1187
был не раз
Сейчас нет на сайте
Я выполнял задание по своему учебнику. Мне чтоб выполнить упражнение надо написать программу сложения двух чисел. Но у меня ответ, всегда какие бы числа я не вводил, получается 8. Вот текст программы:
Как мне исправить программу и в чем я ошибся? help


PAMCEC II

Сообщение отредактировал PAMCEC - Четверг, 30 Января 2014, 18:46
maxxCДата: Четверг, 30 Января 2014, 19:14 | Сообщение # 1188
был не раз
Сейчас нет на сайте
PAMCEC,
>A=W+L;
складывать нужно после получения значений W и L.
PAMCECДата: Четверг, 30 Января 2014, 20:07 | Сообщение # 1189
был не раз
Сейчас нет на сайте
Спасибо

PAMCEC II
SanoraagДата: Четверг, 30 Января 2014, 21:52 | Сообщение # 1190
почетный гость
Сейчас нет на сайте
а так код нельзя?

так код более читаем. (Это так что бы легче можно было читать)


IzaronДата: Четверг, 30 Января 2014, 22:37 | Сообщение # 1191
Rammstein forever
Сейчас нет на сайте
Ну да, можно и так
Вопрос был довольно странный, учитывая то, что переменные W и L во время работы программы могут принимать хз какие значения, и А тоже
PAMCECДата: Пятница, 31 Января 2014, 08:43 | Сообщение # 1192
был не раз
Сейчас нет на сайте
Опять прошу помощи. В прошлый раз ваш совет был очень полезен. Но в новой программе я опять налажал. Мой компилятор написал целую кучу ошибок хотя я уверен что все написал правильно и не могу понять как исправить программу.
Вот код программы:

Вот ошибки которые написал мой компилятор:

Помогите пожалуйста help


PAMCEC II

Сообщение отредактировал PAMCEC - Пятница, 31 Января 2014, 08:45
goldsphereДата: Пятница, 31 Января 2014, 09:49 | Сообщение # 1193
заслуженный участник
Сейчас нет на сайте
Tc=Convert(float);
что там делает float?
Ты передаёшь аргумент функции, аргумент, в твоём случае, это - переменная. Надо хотя бы интуитивно понимать, что чтобы функция использовала данные, их надо ей предоставить.
Tc=Convert(Tf);
setlocale(0, "") - точки с запятыми надо ставить)


FinderX - Android Аркада

Сообщение отредактировал goldsphere - Пятница, 31 Января 2014, 09:55
PAMCECДата: Пятница, 31 Января 2014, 10:01 | Сообщение # 1194
был не раз
Сейчас нет на сайте
Я поменял Tc=Convert(float) На Tc=Convert(Tf); Но ошибки при компиляции все равно осалить. И перед setlocale(0, "") поставил точку с запятой Но ошибки еще есть help

Добавлено (31.01.2014, 10:01)
---------------------------------------------
cry Я наверное никогда не сделаю этот Дурацкий вычислитель градусов Цельсия!!! cry


PAMCEC II

Сообщение отредактировал PAMCEC - Пятница, 31 Января 2014, 10:03
goldsphereДата: Пятница, 31 Января 2014, 14:24 | Сообщение # 1195
заслуженный участник
Сейчас нет на сайте
У меня она заработала, я больше ничего не менял. Пересобери весь проект полностью

Добавлено (31.01.2014, 14:24)
---------------------------------------------



FinderX - Android Аркада
SanoraagДата: Пятница, 31 Января 2014, 17:25 | Сообщение # 1196
почетный гость
Сейчас нет на сайте
Это никуда не годиться!! вот рабочий тебе код

пусть хотя бы так.


MR_BorgДата: Суббота, 01 Февраля 2014, 19:46 | Сообщение # 1197
участник
Сейчас нет на сайте
Здравствуйте товарищи, подскажите с таким вопросом. Имел ли кто дело с zlib? А конкретно у меня есть строка с данными нужно её сжать. Пытался разобраться сам, но не получается.

Изучаю C++ попутно пишу игру.
REaveRДата: Суббота, 22 Февраля 2014, 22:24 | Сообщение # 1198
уже был
Сейчас нет на сайте
(студент) Получил задание на написание клавиатурного тренажёра на С для консоли.
Мучает вопрос, выводить изображение с падающими буквами в массиве или без него?

Вопрос уже не актуален.


Всё стало серым...

Сообщение отредактировал REaveR - Воскресенье, 23 Февраля 2014, 12:44
SaiteiДата: Суббота, 22 Февраля 2014, 22:39 | Сообщение # 1199
старожил
Сейчас нет на сайте
Можете скинуть пример простейшего ИИ, который реализован "деревом"?
vasua99Дата: Понедельник, 24 Февраля 2014, 19:09 | Сообщение # 1200
GNU follower
Сейчас нет на сайте
Вопрос. Сейчас смотрел реализацию POSIX va_list. Там каждый следующий параметр считается через выравнивание(4 байта). На самом деле ли все параметры так выравниваются? Просто судя по реализации той, при передаче в функцию двух short'ов(размером 2 байта), на самом деле они будут занимать 8 байт.

Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)
Форум игроделов » Программирование » C/C++ » Вопрос-Ответ (C++) (Вопросы по С++ задаём здесь.)
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг