kikas86, в замечательной книжке Л. Аммерала "Принципы программирования в машинной графике" в главе 2.5 ("Отсечение линий") описан хороший способ определения положения точки относительно прямоугольника с помощью битовых масок. Я думаю, приспособить его под пересекающиеся прямоугольники не составит большого труда. Книжка легко гуглится.
Спасибо, сейчас найду =)
Добавлено (17.01.2014, 12:15) --------------------------------------------- Здравствуйте, вот не могу сделать столкновение прямоугольников корректным, иногда из за большой скорости проходит сквозь элементы. Делаю что то типо пинг понга. Вот код проверки столкновения по сторонам прямоугольника:
Проверяю с какой стороны находится элемент по вершинам прямоугольника, 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, свой движок.
При коллизии просто меняй координаты на противоположные. Для луа, тут хороший тутор: http://libzoetrope.org/docs/breaking_out. Обрати внимание на эти строки: Код onCollide = function (self, other) self.velocity.y = self.velocity.y * -1
-- ... -- end
Это же обычная инверсия. если просто удариться сверху или снизу, нужно тока менять вектор Y, а если слева и справа то только X, так что проверка должна быть... Это же рикошет, а если при коллизии менять оба вектора скорости то он просто полетит в туже сторону откуда летел! Услуги создания сайтов, верстки сайтов. Своя CMS, свой движок.
Вот намутил по одному уроку клиент-серверное приложение, 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); }
goldsphere, а ты перенаправление портов настраивал? Очень часто проблема в том, что порт, через который запрашивается доступ, закрыт. В руководстве к модему должно быть написано, как открыть. Как правильно задавать вопросы
Сообщение отредактировал -l33t-h4xx- - Четверг, 23 Января 2014, 15:07
Я выполнял задание по своему учебнику. Мне чтоб выполнить упражнение надо написать программу сложения двух чисел. Но у меня ответ, всегда какие бы числа я не вводил, получается 8. Вот текст программы:
Код
#include <conio.h> typedef unsigned short int u; int main() { setlocale( LC_ALL, "Russian" ); u W,L,A=W+L; std::cout<<"Введите первое слагаемое\n"; std::cin>>W; std::cout<<"Введите второе слагаемое\n"; std::cin>>L; std::cout<<"Сумма равна: "<<A; getch(); return 0; }
Как мне исправить программу и в чем я ошибся? PAMCEC II
Сообщение отредактировал PAMCEC - Четверг, 30 Января 2014, 18:46
#include <conio.h> #include <iostream> using std::cout; using std::cin; typedef unsigned short int u; int main() { setlocale( LC_ALL, "Russian" ); u W,L,A,; cout<<"Введите первое слагаемое\n"; cin>>W; cout<<"Введите второе слагаемое\n"; cin>>L; A=W+L; cout<<"Сумма равна: "<<A; getch(); return 0; }
так код более читаем. (Это так что бы легче можно было читать)
Ну да, можно и так Вопрос был довольно странный, учитывая то, что переменные W и L во время работы программы могут принимать хз какие значения, и А тоже
Опять прошу помощи. В прошлый раз ваш совет был очень полезен. Но в новой программе я опять налажал. Мой компилятор написал целую кучу ошибок хотя я уверен что все написал правильно и не могу понять как исправить программу. Вот код программы:
Код
#include <iostream> #include<conio.h> using namespace std; float Convert(float); int main() { setlocale(0, "") float Tf,Tc; cout<<"Введите градусы по фаренгейту: "; cin>>Tf; Tc=Convert(float); cout<<"Градусы в Цельсиях: "<<Tc<<endl; getch(); return 0; } float Convert(float Tf) { float Tc; Tc=((Tf-32)*5)/9; return Tc; }
Вот ошибки которые написал мой компилятор:
1) In function 'int main()':: 2) expected ';' before 'float' 3) 'Tf' was not declared in this scope 4) 'Tc' was not declared in this scope 5) expected primary-expression before 'float'
Помогите пожалуйста PAMCEC II
Сообщение отредактировал PAMCEC - Пятница, 31 Января 2014, 08:45
Tc=Convert(float); что там делает float? Ты передаёшь аргумент функции, аргумент, в твоём случае, это - переменная. Надо хотя бы интуитивно понимать, что чтобы функция использовала данные, их надо ей предоставить. Tc=Convert(Tf); setlocale(0, "") - точки с запятыми надо ставить) FinderX - Android Аркада
Сообщение отредактировал goldsphere - Пятница, 31 Января 2014, 09:55
Я поменял Tc=Convert(float) На Tc=Convert(Tf); Но ошибки при компиляции все равно осалить. И перед setlocale(0, "") поставил точку с запятой Но ошибки еще есть
Добавлено (31.01.2014, 10:01) --------------------------------------------- Я наверное никогда не сделаю этот Дурацкий вычислитель градусов Цельсия!!! PAMCEC II
Сообщение отредактировал PAMCEC - Пятница, 31 Января 2014, 10:03
Здравствуйте товарищи, подскажите с таким вопросом. Имел ли кто дело с zlib? А конкретно у меня есть строка с данными нужно её сжать. Пытался разобраться сам, но не получается. Изучаю C++ попутно пишу игру.
(студент) Получил задание на написание клавиатурного тренажёра на С для консоли. Мучает вопрос, выводить изображение с падающими буквами в массиве или без него?
Вопрос уже не актуален. Всё стало серым...
Сообщение отредактировал REaveR - Воскресенье, 23 Февраля 2014, 12:44
Вопрос. Сейчас смотрел реализацию POSIX va_list. Там каждый следующий параметр считается через выравнивание(4 байта). На самом деле ли все параметры так выравниваются? Просто судя по реализации той, при передаче в функцию двух short'ов(размером 2 байта), на самом деле они будут занимать 8 байт. Жизнь игра, и мы в ней пешки... А я кушаю пельмешки)