| 
				
				Столкновение в 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) но и выталкивать игрока из стены     Вот как раз не знаю как это сделать  
 
          
 |  
| 
 | 
 |    |     
		
		 
 |