Вторник, 26 Ноября 2024, 08:07

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Помогите дописать игру :3
sooquaДата: Вторник, 04 Декабря 2012, 23:49 | Сообщение # 1
был не раз
Сейчас нет на сайте
Пишу на C++, использую движок HGE. Это моя первая игра..)
У меня есть класс MapBuilder:
Code
class MapBuilderClass
{
public:
  class BlockClass
  {
  public:
   hgeSprite* Sprite;
   float X;
   float Y;
  };
public:
  std::vector<MapBuilderClass::BlockClass*> CreateMap(char* blocks);
  void RenderBlocks(std::vector<MapBuilderClass::BlockClass*> Blocks);
} MapBuilder;
CreateMap принимает в арг. строку содержащую цифры от 1 до 7, пробелом и символом конца строки, а возвращает массив(вектор) блоков.
Например, вот это:

Создаст вот такую карту:


Но вот незадача - игрок может проходить сквозь стены, не может бегать по "крышам" блоков и тд.
Как сделать чтоб он мог бегать по блокам, прыгать с одного на другой, врезался в стены etc?
Много раз открывал проект, пытался, ничего не получалось, закрывал)) Уже 2 месяца так xD Охота уже закончить....

Пишите сюда, или в скайп: sooqua
Буду безмерно благодарен)
ReanДата: Пятница, 07 Декабря 2012, 19:10 | Сообщение # 2
участник
Сейчас нет на сайте
То есть???
Автор осилил генерацию карты, парс строки, перемещение спрайта и вывод через HGE, но не смог сделать элементарную коллизию?
А там, откуда вы код копировали, коллизии не было?

О чем нам должно сказать описание класса MapBuilder?

Декабрь подсказывает мне, что началась пора сдачи курсовых... smile


Сообщение отредактировал Rean - Пятница, 07 Декабря 2012, 19:13
FERAMONДата: Пятница, 07 Декабря 2012, 19:11 | Сообщение # 3
Dansy Riter
Сейчас нет на сайте
sooqua, И чем это магивара Луффи занимается в твоей игре?

Наш проект "ИСТОРИЯ АНГЕЛА "
sooquaДата: Пятница, 07 Декабря 2012, 21:12 | Сообщение # 4
был не раз
Сейчас нет на сайте
Rean, Код написал я) С логикой у меня всё в порядке, а с HGE реализация генерации карты из строки не требует кроме логики и небольших знаний в С++ ничего. А вот с физикой, геометрией и тд у меня проблемы)) Вот и не выходит ничего.

FERAMON, Даже не знал как зовут этого персонажа) Нашёл в гугле несколько анимаций бегущего человечка, на тот момент он бегал красивее всех biggrin

Добавлено (07.12.2012, 21:12)
---------------------------------------------
Ах да, забыл сказать самое главное) Я уже сделал. Наконец-то)
Костыльно, но работает) Тему можно клоуз))

FERAMONДата: Пятница, 07 Декабря 2012, 21:15 | Сообщение # 5
Dansy Riter
Сейчас нет на сайте
Quote (sooqua)
, Даже не знал как зовут этого персонажа)


Этот персонаж из знаменитого аниме Ван Писс, который снимается уже много лет и выпущено 570 серий, а так же популярна его манга.

Ты отхватил великого героя среди анимешников и даже не удосужился узнать кто он!

Узри же истину


Наш проект "ИСТОРИЯ АНГЕЛА "
sooquaДата: Пятница, 07 Декабря 2012, 21:17 | Сообщение # 6
был не раз
Сейчас нет на сайте
Не увлекаюсь аниме biggrin
ReanДата: Пятница, 07 Декабря 2012, 21:17 | Сообщение # 7
участник
Сейчас нет на сайте
Quote
Костыльно, но работает) Тему можно клоуз))

Ну уж нет! Описывай как сделал - алгоритм и примеры кода приветствуются!
А иначе зачем создавал тему? Вдруг у кого-нибудь такой же вопрос будет - помогайте друг другу.
sooquaДата: Пятница, 07 Декабря 2012, 21:26 | Сообщение # 8
был не раз
Сейчас нет на сайте
Rean, да пожалуйста)
раз:
Code
struct Point
{
  float X;
  float Y;

  Point() : X(0.0f), Y(0.0f) { }
  Point(float x, float y) : X(x), Y(y) { }
};
struct AABB
{
  Point Center;
  float r[2];

  AABB(Point CenterAABB, float HalfWidth, float HalfHeight)
  {
   this->Center = CenterAABB;
   this->r[0] = HalfWidth;
   this->r[1] = HalfHeight;
  }
};

Point OverlapAABB(AABB A, AABB <img src="http://s12.ucoz.net/sm/1/cool.gif" border="0" align="absmiddle" alt="cool" />
  {
   float Result_X = 0.0f;
   float Result_Y = 0.0f;

   double rcx = fabs(A.Center.X - B.Center.X);
   double rcy = fabs(A.Center.Y - B.Center.Y);
   double rx = A.r[0] + B.r[0];
   double ry = A.r[1] + B.r[1];
   double overlap_x = rx - rcx;
   double overlap_y = ry - rcy;
   if (overlap_x < overlap_y)
   {
    Result_X = (float)overlap_x;
    if (A.Center.X < B.Center.X)
     Result_X = -Result_X;
   }
   else
   {
    Result_Y = (float)overlap_y;
    if (A.Center.Y < B.Center.Y)
     Result_Y = -Result_Y;
   }

   return Point(Result_X, Result_Y);
  }
OverlapAABB принимает в себя два прямоугольника, и возвращает две координаты (Х и У) - на сколько надо сдвинуть первый прямоугольник, чтобы он "вышел" из второго biggrin

Потом в цикле проверям каждый "блок" на столкновение с игроком и вытаскиваем игрока из блока) Потом смотрим если OverlapAABB вернула 0 по иксу(Х) и <0(меньше нуля) по Y то игрок "на блоке" и делаем Player.OnGround = true; чтоб можно было прыгнуть с блока, бегать по нему и тд.
  • Страница 1 из 1
  • 1
Поиск:

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