Вопрос-Ответ (C++)
| |
Kornival | Дата: Воскресенье, 04 Сентября 2011, 19:10 | Сообщение # 1 |
The Witcher
Сейчас нет на сайте
| Чтобы не создавать отдельную тему на каждый глупый вопрос, предлагаю задавать их здесь.
Saitei: все вопросы по С задаём в теме Вопрос-Ответ (С). Благодарю за внимание!
|
|
| |
goldsphere | Дата: Пятница, 25 Октября 2013, 07:55 | Сообщение # 1081 |
заслуженный участник
Сейчас нет на сайте
| Забыл прояснить. enemy_i - заменяет итератор для врагов. int enemy_i; У меня сделано так, что она в основном цикле игры всё время меняется и e[enemy_i] проверяется на столкновение с пулей. Функция столкновения рабочая. Она проверяет расстояние от пули до врага и если оно меньше ширины врага, возвращает true.Цитата MR_Borg ( ) Ну и в третих непонял кто с кем сталкивается в Код *for(int i = 0;i < e.size();++i)//столкновение с врагом (вылетает ошибка i) ну, дык с врагом Код for(int i = 0;i < e.size();++i)//столкновение с врагом (вылетает ошибка vector interator not dereferencable) { loop1: if(it->isCollision(e[i])) Цитата MR_Borg ( ) Зачем еще раз? Это не ещё раз, это ещё один вариант, но он закоменчен, так как (вылетает ошибка vector interator not dereferencable) он после Код for(auto it = b.begin(); it!= b.end();)//обработка механики пули но, он так же как и цикл обработки столкновения закоменчен.
FinderX - Android Аркада
|
|
| |
Archido | Дата: Пятница, 25 Октября 2013, 08:20 | Сообщение # 1082 |
Сэнсэй
Сейчас нет на сайте
| Хм, а почему бы не сделать внутри цикла с Bullet вложенный цикл с Enemy и тоже на итераторах?
Код /////////////////////////////////////////////////////////// bullets for(auto Bullet = b.begin(); Bullet != b.end();)//обработка механики пули { bool Collision = false;
for(auto Enemy = e.begin(); Enemy != e.end();) { if(Bullet->isCollision(*Enemy)) { Enemy->Spawn(res); Enemy->Destroy(); e.erase(Enemy);
Bullet->Destroy(); Bullet = b.erase(Bullet);
Player::Score++;
Collision = true; break; } }
if (Collision == false) Bullet++; }
А "vector iterator not derefencable" обычно вываливается, когда итератор невалиден, т.е. указывает в "никуда". Такое может быть, например, при попытке получить и разыменовать итератор у пустого вектора.
C++ - он особенный. С помощью него можно не только выстрелить себе в ногу, но и повеситься в пустой комнате:)
|
|
| |
froex | Дата: Пятница, 25 Октября 2013, 09:56 | Сообщение # 1083 |
Руководитель Froexilize team
Сейчас нет на сайте
| Цитата goldsphere ( ) иногда снаряды пролетают сквозь них(чем их больше тем чаще), при этом с пули так с 3-4 он всё таки попадёт в него. В принципе, я понимаю что это может быть из-за того что при обработке столкновений он может не успеть проверить кого-то Чтобы не возникало проблемы отсутствия столкновений ввиду дискретных переходов снаряда по траектории его движения, предлагаю создать непрерывность траектории путём добавления мнимого снаряда (невидимого для конечного пользователя), который будет больше по длине, чем сам снаряд. Например, если снарядом является точка, то мнимый снаряд будет отрезком. В алгоритме просчёта столкновений использовать зону мнимого снаряда, а не реального. При использовании математических методов в реализацию включить проверку нахождения одной из точек отрезка в зоне объекта. Чтобы было понятней, прикладываю рисунок. Из рисунка видно, что дискретизация полёта снаряда может не позволить определить столкновение снаряда, если отрезок дискретизации больше минимальной длины объекта столкновения. Проблема решается тремя способами: - Уменьшение отрезка дискретизации (повышение частоты расчётов). - Введение мнимого объекта для расчётов. - Изменение алгоритма расчёта столкновения. По последнему пункту скажу предположения, что стоит смотреть на сравнение текущего и предыдущего положения снаряда. Эта задача сводится ко второму пункту.
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
|
|
| |
avolkoff | Дата: Пятница, 25 Октября 2013, 11:27 | Сообщение # 1084 |
частый гость
Сейчас нет на сайте
| Может, при расчете проверять траекторию, то есть пересечение вектора пули с объектом, то есть от начала до конца в кадре. Например, в кадре начало пули (0, 0), после добавления вектора стала (5, 0), потом проверяем было ли что-нибудь на промежутке от (0, 0) до (5, 0). По идее с любой скоростью движения должно работать.
|
|
| |
goldsphere | Дата: Пятница, 25 Октября 2013, 11:47 | Сообщение # 1085 |
заслуженный участник
Сейчас нет на сайте
| Archido, Спасибо, сработало)
FinderX - Android Аркада
|
|
| |
froex | Дата: Пятница, 25 Октября 2013, 11:52 | Сообщение # 1086 |
Руководитель Froexilize team
Сейчас нет на сайте
|
Не превращайте форум в чат. Пишите более развернуто и понятно - всё равно вас попросят объяснить подробнее. Алгоритмы, программирование, оптимизация, тестирование, ведение проектов. Ищу художника, дизайнера, тестера, программистов С и С++ Обучаю процессам разработки и программированию.
|
|
| |
Deswing | Дата: Воскресенье, 27 Октября 2013, 17:41 | Сообщение # 1087 |
заслуженный участник
Сейчас нет на сайте
| А как в консоли можно вывести графику? Ну там квадрат, круг и т.п... А без winapi можно?
|
|
| |
Izaron | Дата: Воскресенье, 27 Октября 2013, 17:45 | Сообщение # 1088 |
Rammstein forever
Сейчас нет на сайте
| Deswing, никак. Можно только символы,а в качестве бонуса - изменять цвет фона и символов, гы) Скачай библиотеки для вывода графики - SDL или SFML (я предпочитаю второе), они легкие ващеДобавлено (27.10.2013, 17:45) --------------------------------------------- WinAPI, кстати, графику не рисует. Это DirectX рисует графику, и берет объект окна
|
|
| |
GECK | Дата: Воскресенье, 27 Октября 2013, 20:14 | Сообщение # 1089 |
заслуженный участник
Сейчас нет на сайте
| Можно с помощью GDI что-нибудь рисовать, если очень хочется. Код #include <windows.h>
void main() { HWND console_handle = GetConsoleWindow(); HDC device_context = GetDC(console_handle);
HPEN pen =CreatePen(PS_SOLID,5,RGB(255,0,0)); SelectObject(device_context,pen); Ellipse(device_context, 10, 10, 100, 100); ReleaseDC(console_handle, device_context); }
Всё гениальное просто. И хреново работает.
|
|
| |
GantZ_Yaka | Дата: Вторник, 29 Октября 2013, 19:05 | Сообщение # 1090 |
почетный гость
Сейчас нет на сайте
| Хелп!Хелп!Хелп! Пишу клиент-серверную игрушку на Unity и столкнулся с проблемой. Серверную часть взял готовую - она написана на C#, открывается в Visual Studio и работает ... какбы правильней выразиться... На откликах от клиента. То есть клиент прислал команду - включается какойто Void на сервере и внутри него можно программировать какие перемены в игре вызвала присланная команда и послать в ответ клиенту. И все работает таким образом - клиент спросил - сервер обработал - ответил. И все. все остальное время сервер тупо ждет команды. На C# не программировал раньше, поэтому возник вопрос. Как реализовать самостоятельный Loop в коде сервера? Например в Unity есть заранее заготовленная функция Update(), в ней все время каждый игровой кадр происходит просчет всего содержимого, да и во многих других игровых движках есть такие же функции. подскажите плиз как заставить сервер постоянно гонять цикл своих личных расчетов, например таймер, каждые 5 минут рассылающий сообщения игрокам, независимо от их запросов, внутренний Void, который бы выполнялся все время сам по себе...
|
|
| |
pelmenka | Дата: Вторник, 29 Октября 2013, 19:30 | Сообщение # 1091 |
Драгоценный Тунеядец
Сейчас нет на сайте
| GantZ_Yaka, по C#, вроде, есть другая тема. А вообще обычным циклом, проверяя внутри цикла прошедшее время и делач акое- то действие по его прошествии.
Сталина в каждый дом!
|
|
| |
Deswing | Дата: Понедельник, 04 Ноября 2013, 18:42 | Сообщение # 1092 |
заслуженный участник
Сейчас нет на сайте
| Я забацал вот такую программку (и не спрашивайте зачем я писал "Level"))) По сути это арифметическая прогрессия): Код #include <iostream> using namespace std;
const int d = 1500; int buffer = d;
int main() { for(int i = 1; i <= 400; i++) { cout<<"Level "<<i<<": "<<buffer<<endl; buffer = buffer + d; } system("PAUSE"); } вопрос: почему консоль удаляет более старые записи? Я хочу, чтобы она перестала это делать
|
|
| |
SEvg | Дата: Пятница, 08 Ноября 2013, 18:11 | Сообщение # 1093 |
Алхимик
Сейчас нет на сайте
| Deswing, консоль не может же бесконечно печатать... Пиши всё в файл
Код #include <fstream>
using namespace std;
int main() { const int d = 1500; int buffer = d; ofstream file("test.txt"); for(int i = 1; i <= 400; i++) { file<<"Level "<<i<<": "<<buffer<<endl; buffer = buffer + d; } }
|
|
| |
Labirintik | Дата: Воскресенье, 24 Ноября 2013, 11:40 | Сообщение # 1094 |
постоянный участник
Сейчас нет на сайте
| Нубский вопрос, ну как исправить предупреждение: аргумент: преобразование "time_t" в "unsigned int", возможна потеря данных. Код srand(time(NULL)); int random =rand() % 10000; cout << random << "\n";
|
|
| |
Snuux | Дата: Воскресенье, 24 Ноября 2013, 12:14 | Сообщение # 1095 |
постоянный участник
Сейчас нет на сайте
| Labirintik, Код srand(time(NULL)); int random =(int)(rand() % 10000); cout << random << "\n";
Как то так. Вообще странно, не должен выдавать такой ошибки...
Добавлено (24.11.2013, 12:14) --------------------------------------------- http://ideone.com/p4rD73 тут не пишет никаких варнингов.
Сообщение отредактировал Snuux - Воскресенье, 24 Ноября 2013, 12:14 |
|
| |
Labirintik | Дата: Воскресенье, 24 Ноября 2013, 12:29 | Сообщение # 1096 |
постоянный участник
Сейчас нет на сайте
| Цитата Snuux ( ) Как то так. Вообще странно, не должен выдавать такой ошибки... не помогло ...Добавлено (24.11.2013, 12:27) ---------------------------------------------
ругается на эту строку O_0Добавлено (24.11.2013, 12:29) --------------------------------------------- Исправил на Код srand( (unsigned int) time(NULL) ); пропал warring O_0
|
|
| |
Destroy | Дата: Среда, 27 Ноября 2013, 16:24 | Сообщение # 1097 |
постоянный участник
Сейчас нет на сайте
| возникла проблема удалить последний элемент массива и переставить(НЕ ВЫВЕСТИ!) элементы массива в противоположном порядке, без использования другого массива.
|
|
| |
Coment | Дата: Среда, 27 Ноября 2013, 18:44 | Сообщение # 1098 |
почетный гость
Сейчас нет на сайте
| Код на Java, но думаю смысл понятенЖ Код for(int i = 0; i<array.length/2; i++) { int tmp = array[i]; array[i] = array[array.length-i-1]; array[array.length-i-1] = tmp; } Удалить сначала последный елемент, наверно, уже самому стоит постараться
Сообщение отредактировал Coment - Среда, 27 Ноября 2013, 18:44 |
|
| |
Destroy | Дата: Четверг, 28 Ноября 2013, 01:47 | Сообщение # 1099 |
постоянный участник
Сейчас нет на сайте
| Coment, спасибо все понял
|
|
| |
Labirintik | Дата: Воскресенье, 01 Декабря 2013, 07:33 | Сообщение # 1100 |
постоянный участник
Сейчас нет на сайте
| Добавлено (01.12.2013, 07:33) --------------------------------------------- Код srand( (unsigned int) time(NULL) ); random1 =rand() % 255; random2 =rand() % 255; random3 =rand() % 255; glColor3f(random1/255,random2/255,random3/255); glBegin(GL_QUADS); glVertex2i(x*32-16,y*32+16); glVertex2i(x*32+16,y*32+16); glVertex2i(x*32+16,y*32-16); glVertex2i(x*32-16,y*32-16); glEnd(); почему этот код рисует только черный квадрат?
Сообщение отредактировал Labirintik - Воскресенье, 01 Декабря 2013, 07:34 |
|
| |
|