Пятница, 26 Апреля 2024, 23:50

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Форум игроделов » Программирование » C/C++ » Помогите с элементарной механикой игры!!!
Помогите с элементарной механикой игры!!!
ezhickovichДата: Пятница, 27 Августа 2010, 16:15 | Сообщение # 21
[Великий и могучий хозяинъ]
Сейчас нет на сайте
WXZRW, но оба эти варианта менее удобны, простым наследованием можно легко обойтись без этих костылей...


Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
WXZRWДата: Пятница, 27 Августа 2010, 16:43 | Сообщение # 22
Thousand faces conspiration
Сейчас нет на сайте
Quote (ezhickovich)
но оба эти варианта менее удобны, простым наследованием можно легко обойтись без этих костылей...

Да можно, я же не говорю что надо делать именно так как я сказал, я только ээээ... упомянул эти факты как то что они есть, к тому же не факт что стоит пихать ООП всегда и везде, тем более класс сравнительно небольшой.... Вобщем это решать автору как ему делать... Мой пост был для информационных целей... Чтобы человек знал о том что есть и другие пути... в случае если он не знал об этих именно путях или забыл о них...

Сообщение отредактировал WXZRW - Пятница, 27 Августа 2010, 16:44
RenusДата: Суббота, 28 Августа 2010, 07:54 | Сообщение # 23
почетный гость
Сейчас нет на сайте
Спасибо огромное всем!
Пока все получается и работает happy
Если будут еще какие вопросы, а я думаю они будут dry напишу в эту же тему.

Добавлено (28.08.2010, 07:54)
---------------------------------------------
А вот и вопрос)
Как удалить переменную из вектора? Ведь erase работает только с итераторами.
Это что, переделывать цикл под итераторы?
Вот код переделанной программы от bum'a:

Code
#include <iostream>  
#include <vector>  

using namespace std;  

class CObject  
{  
public:  
        CObject() {}  
        virtual void Process() {cout << "Общий класс" << endl;}  
};  

class CPlayer : public CObject  
{  
public:  
        CPlayer() {}  
        virtual void Process() {cout << "Игрок" << endl;}  
};  

std::vector <CObject*> ObjectsList;  

int main()  
{  
        ObjectsList.push_back(new CObject());  
        ObjectsList.push_back(new CPlayer());  

        for(int i = 0; i < ObjectsList.size(); i++)  
        {  
           ObjectsList[i]->Process();  
        }  

}
ТехникДата: Суббота, 28 Августа 2010, 12:45 | Сообщение # 24
Глава X-ray Games
Сейчас нет на сайте
Предлагаю реализовать аккумулятор.Объясню, что это такое,если кто не знает.Вообщем,чтобы не затормаживать компьютер и не засорять зря память надо во время загрузки создать и загрузить в аккумулятор n-кол-во пуль.После этого реализовать их невидимость до использования,либо поместить их за игровое пространство.А при необходимости стрельбы перемещать и использовать их в нужном месте.После расхода пуль, их обратно помещают на первоначальное место.
Это мое объяснение.
А движение пули я предлагаю реализовать при помощи матрицы перемещения.
По теме аккумулятора предлагаю почитать книгу "как стать создателем компьютерных игр" Касихина. Там в дополнительных матералах описан этот метод на дельфи.
ezhickovichДата: Суббота, 28 Августа 2010, 13:12 | Сообщение # 25
[Великий и могучий хозяинъ]
Сейчас нет на сайте
Техник, хранить всю геометрию таким образом - зло...


Я: О великий повелитель этой ничтожной вселенной - сокращённо ЁЖ!
WXZRWДата: Суббота, 28 Августа 2010, 14:00 | Сообщение # 26
Thousand faces conspiration
Сейчас нет на сайте
Quote (Renus)
Как удалить переменную из вектора? Ведь erase работает только с итераторами.
Это что, переделывать цикл под итераторы?

// Например снести третий элемент из массива, предположим он там есть....
int delete_item = 3;

ObjectsList.erase(ObjectsList.begin() + delete_item);

Quote (Техник)
Предлагаю реализовать аккумулятор.

Если пули видны (хмм 2Д игра что ли...) и у них есть геометрическое представление... можно создать одну пулю в виде геометрии заранее, все остальные создавать динамически в виде позиции (для 2д это два скаляра) и ориентации (для 2д это 4 скаляра), потом при рендере рисовать пулю с геометрией но трансформировать ее матрицей и выставить позицию... Если пуля вышла за пределы экрана, тогда ее удалять... при стрельбе создавать новые... Тогда одни будут удаляться, другие создаваться.. динамически. Пуля с геометрией остается всегда и выступает как прокси для рендера и т.д.

Сообщение отредактировал WXZRW - Суббота, 28 Августа 2010, 14:01
RenusДата: Четверг, 02 Сентября 2010, 01:39 | Сообщение # 27
почетный гость
Сейчас нет на сайте
WXZRW, спасибо, проглядел что .begin() итератор возвращает.
Ну тогда, на сколько я понимаю, код должен выглядеть так:

Code
for(int i = 0; i < ObjectsList.size();)  
       {  
          if (ObjectsList[i]->kill==1)  
          {
             ObjectsList.erase(ObjectsList.begin()+i);
          }
          else i++;
       }

Тогда подскажите как очистить память с такого вызова посредством delete:
Code
ObjectsList.push_back(new CPlayer());

Добавлено (29.08.2010, 02:03)
---------------------------------------------
Вот, я сделал так, скажите правильно или нет?

Code
    CObject* pObject;
    for(int i = 0; i < ObList.size();)
    {
       ObList[i]->Process();
       if (ObList[i]->kill==1)  
       {
          pObject = ObList[i];
          ObList.erase(ObList.begin()+i);
          delete pObject;
       }
       else i++;
    }

Добавлено (02.09.2010, 01:39)
---------------------------------------------
Назрел такой вопрос, помогите пожалуйста!
Есть функция которая возвращает столкновения объектов, к примеру такая: bool Col_AABB( PAABB2D A, PAABB2D B );
Каким образом реализовать механизм опроса столкновений?
Это что для каждой пули, каждый кадр обрабатывать столкновения со всеми возможными объектами?
Или есть какой то более хитрый способ выбрать объекты с которыми она может столкнуться(по ближайшим координатам и типу объектов например), разъясните пожалуйста, буду очень благодарен!!!!

bumДата: Четверг, 02 Сентября 2010, 13:34 | Сообщение # 28
почетный гость
Сейчас нет на сайте
Quote (Renus)
Назрел такой вопрос, помогите пожалуйста!
Есть функция которая возвращает столкновения объектов, к примеру такая: bool Col_AABB( PAABB2D A, PAABB2D B );
Каким образом реализовать механизм опроса столкновений?
Это что для каждой пули, каждый кадр обрабатывать столкновения со всеми возможными объектами?

А чем плохо после отработки перемещения пули сразу же проверять не попала ли она куда либо?
RenusДата: Пятница, 03 Сентября 2010, 02:31 | Сообщение # 29
почетный гость
Сейчас нет на сайте
Каким образом? Функции для проверки не попала она во что либо нету)))
Обьясни сам механизм пожалуйста...

Тоесть, перебором каких либо обьектов или как там?

Добавлено (03.09.2010, 02:31)
---------------------------------------------
Включив мозги сделал так:

Code
// Проверка столкновений
       for(int i = 0; i < ObList.size(); i++)
       {
          if ((Col_AABB(&col_box, &(ObList[i]->col_box))==true) && ObList[i]->type=="bullet")
          {
             kill=true;
             ObList[i]->kill=true;
          }
       }

Я правильно уловил концепцию? Или можно как то более рационально?
WXZRWДата: Пятница, 03 Сентября 2010, 15:15 | Сообщение # 30
Thousand faces conspiration
Сейчас нет на сайте
Quote (Renus)
Тоесть, перебором каких либо обьектов или как там?

Нужно проверить столкновения пули со всеми обьектами, с которыми она должна сталкиваться. Да, здесь нужен перебор. Можно как-то оптимизировать чтобы отбросить лишние обьекты на раннем этапе.

Если пуля имеет обьем, то есть это не точка, а например круг или прямоугольник, можно сделать swept test, особенно если пуля летит по прямой. Если пуля в виде точки, а ее траектория сводится к отрезку (line segment), тогда тест упрощается до проверки коллизии линии с каким либо обьемом (круг, прямоугольник и т.д.).

Swept test прямоугольной (или круглой, вобщем обьемной) пули, имеющей линейную траекторию (лайн сегмент) сводится к формированию прямоугольника в виде движения самой прямоугольной пули от начала лайна до конца лайна. То есть выставив два прямоугольника в начале и конце лайна, также получается новый прямоугольник, внутри которого пуля могла бы двигаться по данной линии от ее начала к ее концу. При таком тесте точка контакта пули с препятствием может быть найдена заранее, при условии что все препятствия статичны, либо тест также должен поддерживать динамические препятствия.

RenusДата: Суббота, 04 Сентября 2010, 04:56 | Сообщение # 31
почетный гость
Сейчас нет на сайте
Та ну с коллизиями оно то понятно, просто думал может есть какой то мастерский подход, который менее ресурсоёмок для проца.

Тут вот какая как бяка назрела, и букварик Страуструпа не помогает(((
Как в при использовании омеги разбить исходный код на файлы, ведь при работе с ней надо кроме OMEGA_functions.h подключать еще и OMEGA_code.cpp, а если его включать в несколько файлов то выдаются ошибки типа ...OMEGA_code.cpp redefinition... и т.д.
Надо стражей куда то поставить??? Объясните плиз, а то как с такими включениями кода работать я не знаю и инфы найти не могУ(((

WXZRWДата: Суббота, 04 Сентября 2010, 14:16 | Сообщение # 32
Thousand faces conspiration
Сейчас нет на сайте
OMEGA Engine что ли? Была где-то у автора данного движка тема или даже подраздел на одном из форумов, где он обитает... На mirgames.ru если я не ошибаюсь. Если это именно та Омега, о которой речь, пробуй связаться с автором там, на форуме.. он вроде бы поддерживал своих фанов и отвечал на вопросы.
RenusДата: Суббота, 04 Сентября 2010, 14:18 | Сообщение # 33
почетный гость
Сейчас нет на сайте
Да автор двиг уже вроде не поддерживает(((
Спрошу ка я на форуме про движке, думаю есть же кто с ней работал...
simtikoДата: Суббота, 04 Сентября 2010, 14:37 | Сообщение # 34
почти ветеран
Сейчас нет на сайте
Решил не создавать новую тему, а написать в этой.
Сегодня попробовал написать вот что. При нажатии на Enter, создается объект. Объект засчитывается на счетчике. Каждый объект генерирует рандомное число. И под конец, У каждого объекта выводится адрес.

Вот код.

Code

#include "stdafx.h"
#include <conio.h>
#include <stdio.h>
#include <iostream>
using namespace std;

int i;
int r;

class someclass {
public:
  someclass() {
  i++;
  r=rand() % 100;
  cout <<"I am object number "<<i<<" My random number is "<<r<<" My adress is ";
  }
};

int main() {
  int c;
  while(1) {
  c=_getch();
  if (c==13) {
  void* p=new someclass();
  cout<<p<<"\n";
  }

  }
}

Вроде бы все работает, но адрес объекта выводится не из самого объекта, а из функции Main(). Как сделать так, что бы объект сам выводил свой адрес?

P.S.

RenusДата: Суббота, 04 Сентября 2010, 19:53 | Сообщение # 35
почетный гость
Сейчас нет на сайте
Ну адрес объекта берется так: &variable, в твоем случае &p
Я не пойду что ты там выводишь, класс?)))
В конструктор ты это зря такое запихнул)

Сделай в классе функцию:
void write_info() {cout <<"I am object number "<<i<<" My random number is "<<r<<" My adress is ";}
Переменные i и r лучше объяви внутри класса, а на конструкторе пусть они получают значение.

И выводи ее так cout<<p->write_info<<"\n";

Добавлено (04.09.2010, 15:01)
---------------------------------------------
поправка &p, в данном случае ссылка на указатель получается)

Добавлено (04.09.2010, 19:53)
---------------------------------------------
Ребята расскажите как вы в ваших играх разбиваете код на файлы!
Я вывел отдельно классы и ресурсы в classes.h и resources.h, но там все вместе реализацией, я в принципе писал все функции прям в классах не выносил... И вот таким макаром все работает, но Страуструп говорит что нельзя реализацию в хедеры вставлять, что ее надо в сипишники отдельно ложить, почему так?
Объясните как все это грамотно связать плиз....

simtikoДата: Пятница, 10 Сентября 2010, 23:49 | Сообщение # 36
почти ветеран
Сейчас нет на сайте
У меня вопрос. На форме находится компонент PictureBox. Он играет роль игрока, и может передвигаться.
Я пытаюсь сделать так, что бы мой ГГ, мог стрелять. Пули, я решил тоже сделать из PictureBox;

Нужно создать PictureBox в конкретных координатах.

Code
private: System::Void Form1_Click(System::Object^  sender, System::EventArgs^  e) {
      gcnew System::Windows::Forms::PictureBox(Location = System::Drawing::Point(100,50));
     }
  

В этом коде, при нажатии на форму, должна создаваться пуля, но выходит ошибка.

Code
error C3673: 'System::Windows::Forms::PictureBox' : class does not have a copy-constructor

Как же ее создавать?

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

ZiegfridДата: Суббота, 11 Сентября 2010, 00:02 | Сообщение # 37
был не раз
Сейчас нет на сайте
Quote (simtiko)
На форме находится компонент PictureBox. Он играет роль игрока, и может передвигаться.

surprised
Не проще ли спрайт кинуть.

simtikoДата: Суббота, 11 Сентября 2010, 00:05 | Сообщение # 38
почти ветеран
Сейчас нет на сайте
Quote (Ziegfrid)
Не проще ли спрайт кинуть.

surprised

Как?

ZiegfridДата: Суббота, 11 Сентября 2010, 00:21 | Сообщение # 39
был не раз
Сейчас нет на сайте
Quote (simtiko)
Как?

Эмм.. ну примерно так:



Сообщение отредактировал Ziegfrid - Суббота, 11 Сентября 2010, 00:21
BetMoraДата: Суббота, 11 Сентября 2010, 08:45 | Сообщение # 40
постоянный участник
Сейчас нет на сайте
Quote (simtiko)
Как же ее создавать?

у тебя пост не по теме, читай ошибку которую тебе выдала студия, игра, слепленная из компонентиков ЦЛР'a eek


Перекуём баги на фичи!
Форум игроделов » Программирование » C/C++ » Помогите с элементарной механикой игры!!!
  • Страница 2 из 3
  • «
  • 1
  • 2
  • 3
  • »
Поиск:

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