Воскресенье, 24 Ноября 2024, 08:06

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
Вопрос-Ответ (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)
Цитата
И где goto loop2;

он после
Код
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, который бы выполнялся все время сам по себе... wacko
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, консоль не может же бесконечно печатать... Пиши всё в файл wink

Код
#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)
---------------------------------------------

Код
srand(time(NULL));

ругается на эту строку 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;
}

Удалить сначала последный елемент, наверно, уже самому стоит постараться cool


Сообщение отредактировал Coment - Среда, 27 Ноября 2013, 18:44
DestroyДата: Четверг, 28 Ноября 2013, 01:47 | Сообщение # 1099
постоянный участник
Сейчас нет на сайте
Coment, спасибо все понял smile
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
Поиск:

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