Понедельник, 25 Ноября 2024, 22:42

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

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 2
  • 1
  • 2
  • »
Столкновение в 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.
RomanNVKZДата: Суббота, 21 Апреля 2012, 15:36 | Сообщение # 15
участник
Сейчас нет на сайте
http://narod.ru/disk/44975866001.e549ac1e042a043df54881b014dbb430/Debug.rar.html

Добавлено (21.04.2012, 15:36)
---------------------------------------------
Ответа так и не будет? dry




НохчиДата: Суббота, 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)
но и выталкивать игрока из стены

Вот как раз не знаю как это сделать dry




  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

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