Столкновение в HGE
| |
Els | Дата: Понедельник, 26 Декабря 2011, 19:40 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| Доброго времени суток . Появился вопрос как в HGE сделать столкновение между обьектами , прошу помощи реализовать .
|
|
| |
Rorschach | Дата: Понедельник, 26 Декабря 2011, 19:46 | Сообщение # 2 |
участник
Сейчас нет на сайте
| Quote (Els) Доброго времени суток . Появился вопрос как в HGE сделать столкновение между обьектами , прошу помощи реализовать В ХГЕ нет встроенных средств для этого. Можно к примеру так определить столкновение между двумя спрайтами: Code if(sprite1.X < sprite2.X && sprite1.x+sprite.width > sprite2.X && sprite1.Y < sprite2.Y && sprite1.Y+sprite.height > sprite2.Y)
Never compromise. Not even in the face of Armageddon.
Сообщение отредактировал Rorschach - Понедельник, 26 Декабря 2011, 20:02 |
|
| |
Els | Дата: Понедельник, 26 Декабря 2011, 19:56 | Сообщение # 3 |
почетный гость
Сейчас нет на сайте
| Можно в примере(если не трудно) ?
|
|
| |
Rorschach | Дата: Понедельник, 26 Декабря 2011, 20:03 | Сообщение # 4 |
участник
Сейчас нет на сайте
| ХГЕ у меня сейчас нет, пример дать не могу. Но код я тебе дал, что непонятно?
Never compromise. Not even in the face of Armageddon.
|
|
| |
Els | Дата: Понедельник, 26 Декабря 2011, 20:26 | Сообщение # 5 |
почетный гость
Сейчас нет на сайте
| В примере проще понять
|
|
| |
Matou | Дата: Понедельник, 26 Декабря 2011, 21:30 | Сообщение # 6 |
Исходный коТ
Сейчас нет на сайте
| Quote (Rorschach) В ХГЕ нет встроенных средств для этого. Можно к примеру так определить столкновение между двумя спрайтами: if(sprite1.X < sprite2.X && sprite1.x+sprite.width > sprite2.X && sprite1.Y < sprite2.Y && sprite1.Y+sprite.height > sprite2.Y)
Ну рас уж юзать ХГЕ, то следует хотябы не забывать о классе hgeRect и его методах: Encapsulate, TestPoint, Intersect.
|
|
| |
Rorschach | Дата: Понедельник, 26 Декабря 2011, 22:07 | Сообщение # 7 |
участник
Сейчас нет на сайте
| Quote (Matou) Ну рас уж юзать ХГЕ, то следует хотябы не забывать о классе hgeRect и его методах: Encapsulate, TestPoint, Intersect. Не был в курсе. Спасибо что поправил.
Never compromise. Not even in the face of Armageddon.
Сообщение отредактировал Rorschach - Понедельник, 26 Декабря 2011, 22:08 |
|
| |
SanAV | Дата: Понедельник, 26 Декабря 2011, 22:12 | Сообщение # 8 |
Alex Versus
Сейчас нет на сайте
| Code hgeRect *rect; rect = new hgeRect;
rect->SetRadius(x, y, 32);
if(rect->Intersect(other.rect)) { printf("collision"); }
Это создание rect'а для одного класса и проверка столкновения с другим rect'ом. Не забудь создать для класса other этот самый rect.
My Games: · [2D, TDS] Death Embrace.
|
|
| |
SanAV | Дата: Понедельник, 26 Декабря 2011, 22:12 | Сообщение # 9 |
Alex Versus
Сейчас нет на сайте
| В ближайшее время напишу туториал на блоге, но уже после Нового Года, ибо дел много. Там подробно и будет описана проверка столкновений.
My Games: · [2D, TDS] Death Embrace.
|
|
| |
Els | Дата: Понедельник, 26 Декабря 2011, 22:37 | Сообщение # 10 |
почетный гость
Сейчас нет на сайте
| Quote (SanAV) В ближайшее время напишу туториал на блоге, но уже после Нового Года, ибо дел много. Там подробно и будет описана проверка столкновений. Буду ждать если сам не смогу разобраться
|
|
| |
RipDev | Дата: Пятница, 30 Декабря 2011, 00:47 | Сообщение # 11 |
гейм-дизайнер
Сейчас нет на сайте
| Возьми готовую физику, на много проще Box2D самое то.
Взгляни на сей изукрашенный образ, на тело, полное изъянов, составленное из частей, болезненное, исполненное многих мыслей, в которых нет ни определённости, ни постоянства.
|
|
| |
noname | Дата: Понедельник, 06 Февраля 2012, 19:05 | Сообщение # 12 |
заслуженный участник
Сейчас нет на сайте
| Quote (Els) как в HGE сделать столкновение между обьектами Quote (SanAV) Это создание rect'а для одного класса и проверка столкновения с другим rect'ом а если объекты произвольной формы?
я думаю, что это можно сделать как-то так: - для каждого спрайта создаём чёрно-белую маску - при необходимости проверить столкновение двух объектов, накладываем друг на друга их маски по AND: если получился белый(пустой) спрайт, то- столкновения нет, если спрайт получился не пустой- значит столкнулись.
только остаётся не ясным: - может быть в движке уже есть быстрая реализация этого дела? - как быстро выяснить, пустой получился спрайт или нет? - если на экране движется множество объектов, как лучше организовать отслеживание столкновений?Добавлено (06.02.2012, 17:29) --------------------------------------------- кажется, до меня начинает доходить: возможно, метод SanAV будет действовать для любых спрайтов, проверяя столкновение непрозрачных частей. надо будет покурить хелп по методу Intersect. Добавлено (06.02.2012, 19:05) --------------------------------------------- нет, похоже, там отслеживаются только прямоугольники.
все правила форумной игры Дуэль Программистов
|
|
| |
RomanNVKZ | Дата: Воскресенье, 01 Апреля 2012, 15:26 | Сообщение # 13 |
участник
Сейчас нет на сайте
| Вот тоже вопрос поставил в тупик:
есть такой код
main.cpp Code #include "hge.h" #include "hgesprite.h" #include "hgefont.h"
#include "ball.h" #include "levels.h" HGE *hge=0;
//Инициализация объектов hgeSprite* ball_spt; hgeSprite* space_spt; hgeSprite* wall_spt; hgeFont* fnt;
//Инициализяция текстур HTEXTURE ball_tex; HTEXTURE wall_tex; HTEXTURE space_tex;
float _x, _y;
bool renderFunc() { for (int xx = 0; xx < 11; xx++) { for (int yy = 0; yy < 11; yy++) { switch (map[(int)yy][(int)xx]) { case 0: space_spt->Render(xx * 32, yy * 32); break; case 1: wall_spt->Render(xx * 32 + 16, yy * 32 + 16); break; case 2: x = xx * 32; y = yy * 32; space_spt->Render(xx * 32, yy * 32); map[(int)xx][(int)yy] = 0; break; } } } ball_spt->Render(x, y); return false; }
bool FrameFunc() { //получаем дельту времени float dt=hge->Timer_GetDelta();
//Детектор событий(нажатия клавиш) if (hge->Input_GetKeyState(HGEK_ESCAPE)) return true; if (hge->Input_GetKeyState(HGEK_LEFT)) dx-=speed*dt; if (hge->Input_GetKeyState(HGEK_RIGHT)) dx+=speed*dt; if (hge->Input_GetKeyState(HGEK_UP)) dy-=speed*dt;
//вычисление скорости и обнаружение столкновений //x+=dx; y+=dy; if (map[(int)(y - 16) / 32][(int)x / 32] == 1) {_y = y; dy = -dy; y = _y;} if (map[(int)(y + 16) / 32][(int)x / 32] == 1) { dy = -dy; } if (map[(int)y / 32][(int)(x - 16) / 32] == 1) { dx = -dx; } if (map[(int)y / 32][(int)(x + 16) / 32] == 1) { dx = -dx; } else {dy = (dy + 9.81 * dt) * friction; dx*=friction; x+=dx; y+=dy;}
//if(x>784) //{ // x=784-(x-784); // dx=-dx; //} //if(x < 16) //{ // x=16+16-x; // dx=-dx; //} //if(y>=584) //{ // y=584-(y-584); // dy=-dy / 2; //} //if(y<16) //{ // y=16+16-y; // dy=-dy; //} return false; }
bool RenderFunc() { //Рендер графики hge->Gfx_BeginScene(); hge->Gfx_Clear(0); renderFunc(); fnt->printf(5, 5, HGETEXT_LEFT, "dt:%.3f\nFPS:%d (constant)", hge->Timer_GetDelta(), hge->Timer_GetFPS()); hge->Gfx_EndScene();
return false; }
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) { hge = hgeCreate(HGE_VERSION);
hge->System_SetState(HGE_LOGFILE, "hge_tut03.log"); hge->System_SetState(HGE_FRAMEFUNC, FrameFunc); hge->System_SetState(HGE_RENDERFUNC, RenderFunc); hge->System_SetState(HGE_TITLE, "HGE Tutorial 03 - Using helper classes"); hge->System_SetState(HGE_FPS, 100); hge->System_SetState(HGE_WINDOWED, true); hge->System_SetState(HGE_SCREENWIDTH, 800); hge->System_SetState(HGE_SCREENHEIGHT, 600); hge->System_SetState(HGE_SCREENBPP, 32);
if(hge->System_Initiate()) {
//Загрузка ресурсов ball_tex=hge->Texture_Load("ball.png"); wall_tex=hge->Texture_Load("wall.png"); space_tex=hge->Texture_Load("space.png"); if(!ball_tex || !wall_tex) { //Если один из файлов не найден //Выводим сообщение об ошибке MessageBox(NULL, "Can't load one of the following files:\nwall.png or ball.png", "Error", MB_OK | MB_ICONERROR | MB_APPLMODAL); hge->System_Shutdown(); hge->Release(); return 0; }
//создаём и устанавливаем спрайт ball_spt=new hgeSprite(ball_tex, 96, 96, 32, 32); ball_spt->SetHotSpot(16,16);
wall_spt=new hgeSprite(wall_tex, 32, 32, 32, 32); wall_spt->SetHotSpot(16,16);
space_spt=new hgeSprite(space_tex, 32, 32, 32, 32); wall_spt->SetHotSpot(16,16);
//Загрузка шрифта fnt=new hgeFont("font1.fnt");
// давайте обновляться hge->System_Start();
//Удаление созданных спрайтов и очистка ресурсов delete fnt; delete wall_spt; delete ball_spt; hge->Texture_Free(ball_tex); hge->Texture_Free(wall_tex); }
// Очистка и закрытие hge->System_Shutdown(); hge->Release(); return 0; }
ball.h Code #pragma once float x, y; float dx, dy; float speed = 15; float jump_speed = 30; const float friction = 0.98; int state = 0;
levels.h Code #pragma once
int map[10][10] = {{1,1,1,1,1,1,1,1,1,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,2,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,0,1}, {1,0,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1}};
Проблема. При столкновении спрайта со стенками и постоянном движении к этому спрайту он(мяч) начинает медленно "входить" в стенку
До сих пор разоьраться не могу =/Добавлено (01.04.2012, 15:26) --------------------------------------------- Неужели никто не может помочь?
|
|
| |
SanAV | Дата: Понедельник, 02 Апреля 2012, 15:45 | Сообщение # 14 |
Alex Versus
Сейчас нет на сайте
| Quote (RomanNVKZ) При столкновении спрайта со стенками и постоянном движении к этому спрайту он(мяч) начинает медленно "входить" в стенку Не очень понятна сама проблема. Выложите скомпилированный проект, дабы видеть проблему.
My Games: · [2D, TDS] Death Embrace.
|
|
| | |
Нохчи | Дата: Суббота, 21 Апреля 2012, 15:46 | Сообщение # 16 |
заслуженный участник
Сейчас нет на сайте
| Лол, залей релизную сборку.
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |
RomanNVKZ | Дата: Суббота, 21 Апреля 2012, 18:43 | Сообщение # 17 |
участник
Сейчас нет на сайте
| Исходники
Сообщение отредактировал RomanNVKZ - Суббота, 21 Апреля 2012, 18:56 |
|
| |
GECK | Дата: Суббота, 21 Апреля 2012, 19:19 | Сообщение # 18 |
заслуженный участник
Сейчас нет на сайте
| При обнаружении столкновения нужно не только инвертировать скорость, но и выталкивать игрока из стены. Самое простое - сделать x -= dx; но правильно будет выровнять по тайловой сетке.
Всё гениальное просто. И хреново работает.
|
|
| |
Нохчи | Дата: Суббота, 21 Апреля 2012, 20:31 | Сообщение # 19 |
заслуженный участник
Сейчас нет на сайте
| Инвертировать скорость нужно в зависимости от текущего направления.
Многие вопросы по Windows отпадут, если посмотреть тут
|
|
| |
RomanNVKZ | Дата: Воскресенье, 22 Апреля 2012, 07:48 | Сообщение # 20 |
участник
Сейчас нет на сайте
| Quote (GECK) но и выталкивать игрока из стены Вот как раз не знаю как это сделать
|
|
| |
|