Войти
ФлеймФорумПрограммирование

YouTube-канал про геймдев и программирование. Критикуйте, господа и дамы (6 стр)

Страницы: 15 6 7 810 Следующая »
#75
14:51, 13 июля 2019

Vlad2001_MFS
Ну я думал разбить экран на квадраты, как в марио. Каждый квадрат это по сути квадратный хитбокс. Так что проходим по массиву квадратов, вызываем у каждого метод isIntersection(AbstractHitbox 8 hitbox), передавая туда хитбоксы пуль, врагов игрока, чтобы посортировать их. А потом между собой сравнивать уже только из одного квадрата.

Вот на этой абстракции я вчера и застопорился. Может спать очень хотелось, а может в знаниях пробел.

Ну и во-первых, я хочу, чтобы враги и за пределами экрана могли сталкиваться (хоть и не отрисовываться, для проверки на отрисовку добавлю экрану свой хитбокс). Т.е. за пределами экрана тоже нужны хитбоксы?

Во-вторых, не могу понять, что происходит, когда два врага сталкиваются. Они должны продолжать идти в сторону игрока, но не проникать друг в друга при этом. Получается, нужно подкручивать им вектора скорости в разные стороны?

С пулей-враг и враг-игрок все просто и понятно.


#76
15:05, 13 июля 2019

Как потомок абстрактного класса поймет какого типа указатель на абстрактный класс ему передан? Enum с типами завести?

Т.е. круг должен уметь пересекаться с кругом и квадратом.
И квадрат точно так же. А реализации этих функций у них разные. Можно конечно отдельно завести функцию для круга и отдельно для квадрата. Но тогда какая-то херовая абстракция выходит

#77
15:11, 13 июля 2019

Robotex
> Как потомок абстрактного класса поймет какого типа указатель на абстрактный
> класс ему передан?
Да, мне кажется, что проще всего Enum сделать и получать его значение виртуальной функцией.

> И квадрат точно так же. А реализации этих функций у них разные. Можно конечно
> отдельно завести функцию для круга и отдельно для квадрата. Но тогда какая-то
> херовая абстракция выходит
Можно сделать какой-нибудь IShape c методом isIntersection для прямоугольника и круга. От него унаследовать Circle и Rect со своими реализациями этих функций. Громоздко как-то, но работать должно.

#78
15:41, 13 июля 2019

Vlad2001_MFS
> Можно сделать какой-нибудь IShape c методом isIntersection
Ты имеешь ввиду сделать интерфейс и приватно отнаследоваться от него?

#79
16:15, 13 июля 2019

Robotex
Что-то вроде этого. Это первое, что пришло в голову без какой-либо обдумки и обработки, так что скорее всего можно реализовать гораздо лучше, но идея думаю ясна.

enum class ShapeType {
    Circle,
    Rect
};

struct IShape {
    virtual bool isIntersect(IShape *shape) = 0;
    virtual ShapeType getType() = 0;
}

class Circle : public IShape {
public:
    bool isIntersect(IShape *shape) {
        switch (shape->getType()) {
            case ShapeType::Circle: {
                return mIsIntersectCircle(shape);
            }
            case ShapeType::Rect: {
                return mIsIntersectRect(shape);
            }
            default: {
                return false;
            }
        }
    }
    
private:
    bool mIsIntersectCircle(Circle *shape) {
        ...
    }
    
    bool mIsIntersectRect(Rect *shape) {
        ...
    }
}

class Rect {
    ...
}
#80
(Правка: 17:17) 17:13, 13 июля 2019

Вопрос, нужен ли энум? А если так:

struct IShape {
    virtual bool isIntersect(IShape *shape) = 0;
protected:
    virtual bool isIntersectCircle(Circle *circle) = 0;
    virtual bool isIntersectRect(Rect *rect) = 0;
}

class Circle : public IShape {
public:
    bool isIntersect(IShape *shape) {
        return shape->isIntersectCircle(this)
    }
    
protected:
    bool isIntersectCircle(Circle *shape) {...}
    bool isIntersectRect(Rect *shape) {...}
}

class Rect: public IShape {
public:
    bool isIntersect(IShape *shape) {
        return shape->isIntersectRect(this)
    }
    
protected:
    bool isIntersectCircle(Circle *shape) {...}
    bool isIntersectRect(Rect *shape) {...}
}

#81
17:23, 13 июля 2019

Видеоуроки не нужны и являются раком.

#82
17:50, 13 июля 2019

Zegalur
Возможно, так действительно лучше будет. Правда, я сначала что-то не вьехал, что тут проихсодит из-за невнимательности...

#83
(Правка: 19:08) 19:06, 13 июля 2019

MrShoor
> Вот внутри SetPos у этого чего-то и ставишь бряку по условию

void Node::updateSomeKindOfShit() {
  for(auto& child: _children) {
    child.pos.x = getSomeXFromSomeOtherShit();
  }
}

И ещё 100500 таких мест.
Поэтому бряка в SetPos не сработает. А если это ещё висит в виде лямбды где-то в таймерах, то вообще просто радуйся, если за день найдёшь сломанную ноду иерархии.

#84
20:44, 13 июля 2019

pahaa
> И ещё 100500 таких мест.
И почему же ты привел место без SetPos? Вот как раз у pos у child должен быть инкапсулирован. А x у pos - нет.

#85
(Правка: 20:57) 20:56, 13 июля 2019

Имхо лучший вариант исходя из задачи сделать вот так:

class CollisionSystem {
public:
  enum class ColliderKind {Circle, Rectangle};
  class Collider {
  private:
    CollisionSystem* m_owner;
    ColliderKind m_kind;
    vec2 m_pos;
    vec2 m_size;
  public:
    ColliderKind Kind() { return m_kind; }
    vec2 GetPos() { return m_pos; }
    vec2 SetPos(const vec2& pos ) {       
      if (m_owner)
        m_pos = m_owner->updateColliderPosition(this, m_pos, pos);
    }
    vec2 Size() { return m_size; }
  };
  using ColliderPtr = std::unique_ptr<Collider>;
public:
  ColliderPtr CreateRound(const vec2& pos, float radius);
  ColliderPtr CreateRectangle(const vec2& pos, const vec2& size);
}

#86
(Правка: 21:30) 21:21, 13 июля 2019

MrShoor
> Вот как раз у pos у child должен быть инкапсулирован
Может, так понятнее?

void Node::updateSomeKindOfShit() {
  for(const Node& child: _children) {
    child.pos.x = getSomeXFromSomeOtherShit();
  }
}

А ещё у этого класса есть пара друзей, и вообще, предыдущая команда решила, что pos удобнее сделать protected, потому что кто-то решил, что это нормально, если некоторые наследники будут управлять позицией как-то по-своему. При чём один из них зачем-то берёт pos.x и передаёт по ссылке куда-то в другой класс... И нет, это не придирки. Это ситуации из реальных проектов (да, я видел такое несколько раз, в разных компаниях).

#87
21:56, 13 июля 2019

Массовые коллизии нужно оптимизировать как-то вот так https://stackoverflow.com/questions/41946007/efficient-and-well-e… collision-det

#88
22:13, 13 июля 2019

pahaa
> Может, так понятнее?
Что понятнее? У тебя pos не инкапуслирован.
Держи вот:

class Node {
private:
  vec2 m_pos;
public:
  const vec2& GetPos() { return m_pos; }
  void SetPos(const vec2& newpos) { m_pos = newpos; }
}
А теперь повтори свой .x = getSomeXFromSomeOtherShit(); c этим классом
#89
(Правка: 22:20) 22:16, 13 июля 2019

MrShoor
> Имхо лучший вариант исходя из задачи сделать вот так:
что-то странное, почему нельзя делать так:

struct t_cd_sys{
  void solve(t_rect&a,t_circle&b){}
  void solve(t_rect&a,t_rect&b){}
  void solve(t_circle&a,t_circle&b){}
  template<class TYPE>void solve(vector<TYPE>&arr){for(size_t i=0;i<arr.size();i++)for(size_t j=i+1;j<arr.size();j++)solve(arr[i],arr[j]);}
  template<class A,class B>void solve(vector<A>&a,vector<B>&b){for(size_t i=0;i<a.size();i++)for(size_t j=0;j<b.size();j++)solve(a[i],b[j]);}
};
struct t_game{
  void update_cd(){
    cd_sys.solve(rects,circles);
    cd_sys.solve(rects);
    cd_sys.solve(circles);    
  }
};
а затем ещё заменить шаблонные solve на оптимизированные версии использующие особенности пространства?
Страницы: 15 6 7 810 Следующая »
ФлеймФорумПрограммирование