Помогите дописать игру :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?
Декабрь подсказывает мне, что началась пора сдачи курсовых...
Сообщение отредактировал Rean - Пятница, 07 Декабря 2012, 19:13 |
|
| |
FERAMON | Дата: Пятница, 07 Декабря 2012, 19:11 | Сообщение # 3 |
Dansy Riter
Сейчас нет на сайте
| sooqua, И чем это магивара Луффи занимается в твоей игре?
Наш проект "ИСТОРИЯ АНГЕЛА "
|
|
| |
sooqua | Дата: Пятница, 07 Декабря 2012, 21:12 | Сообщение # 4 |
был не раз
Сейчас нет на сайте
| Rean, Код написал я) С логикой у меня всё в порядке, а с HGE реализация генерации карты из строки не требует кроме логики и небольших знаний в С++ ничего. А вот с физикой, геометрией и тд у меня проблемы)) Вот и не выходит ничего.
FERAMON, Даже не знал как зовут этого персонажа) Нашёл в гугле несколько анимаций бегущего человечка, на тот момент он бегал красивее всех Добавлено (07.12.2012, 21:12) --------------------------------------------- Ах да, забыл сказать самое главное) Я уже сделал. Наконец-то) Костыльно, но работает) Тему можно клоуз))
|
|
| |
FERAMON | Дата: Пятница, 07 Декабря 2012, 21:15 | Сообщение # 5 |
Dansy Riter
Сейчас нет на сайте
| Quote (sooqua) , Даже не знал как зовут этого персонажа)
Этот персонаж из знаменитого аниме Ван Писс, который снимается уже много лет и выпущено 570 серий, а так же популярна его манга.
Ты отхватил великого героя среди анимешников и даже не удосужился узнать кто он!
Узри же истину
Наш проект "ИСТОРИЯ АНГЕЛА "
|
|
| |
sooqua | Дата: Пятница, 07 Декабря 2012, 21:17 | Сообщение # 6 |
был не раз
Сейчас нет на сайте
| Не увлекаюсь аниме
|
|
| |
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 принимает в себя два прямоугольника, и возвращает две координаты (Х и У) - на сколько надо сдвинуть первый прямоугольник, чтобы он "вышел" из второго
Потом в цикле проверям каждый "блок" на столкновение с игроком и вытаскиваем игрока из блока) Потом смотрим если OverlapAABB вернула 0 по иксу(Х) и <0(меньше нуля) по Y то игрок "на блоке" и делаем Player.OnGround = true; чтоб можно было прыгнуть с блока, бегать по нему и тд.
|
|
| |