Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Вниз

Помогите с физикой в 2D аркаде !   Найти похожие ветки 

 
ZAROLF ©   (2003-12-11 10:16) [0]

Подскажите как сделать - чтобы кругообразный объект в паденнии скатывался
по ступенькам, и продолжал катиться в определённом направлении.
-------------------------------------------------------------------------
И ещё, здесь такая проблема:
Нужно чтобы кругообразный объект отскакивал от стен в моей карте(по горизонтали).

if  x >= form1.DXDraw1.SurfaceWidth -image.Width  then
   x := form1.DXDraw1.SurfaceWidth -image.Width;
if  x <= 0 then
   x := 1;

Данный пример мне не помог, подскажите как правильно сделать.


 
ZAROLF ©   (2003-12-11 10:16) [0]

Подскажите как сделать - чтобы кругообразный объект в паденнии скатывался
по ступенькам, и продолжал катиться в определённом направлении.
-------------------------------------------------------------------------
И ещё, здесь такая проблема:
Нужно чтобы кругообразный объект отскакивал от стен в моей карте(по горизонтали).

if  x >= form1.DXDraw1.SurfaceWidth -image.Width  then
   x := form1.DXDraw1.SurfaceWidth -image.Width;
if  x <= 0 then
   x := 1;

Данный пример мне не помог, подскажите как правильно сделать.


 
pavel_k   (2003-12-11 20:04) [1]

А как осуществляется движение?
По идее, у каждого объекта должны быть переменные (например incX и incY), на которые прибавляются к координатам объекта кажджый DoMove. Тогда надо просто поменять знак приращения координаты: incX:=-IncX;
Приведенный тобой код приводит к тому, что спрайт не может вылететь за границы экрана, к отскакиванию он не имеет отношения.

Первый вопрос поставлен мягко говоря некорректно :) .
Что такое "кругообразный объект" и как определить: кругообразный объект или нет?. А эллипсообразные объекты не отскакивают от стен? :)
Что такое "ступеньки"? В программировании я такого понятия не встречал. Видимо, имеется в виду спрайт, картинка которого является ступеньками :) . Тогда надо знать, как эти "ступеньки" выводятся, рассчитываются и т.д. и т.п. Универсального способа "скатывания предмета по ступенькам" не существует (имеется в виду программный, а не реальный способ скатывания, реально скатить все что хочешь очень просто :) ).

ЗЫ >кругообразный объект в паденнии скатывался
по ступенькам

Я себе это как-то слабо представляю :)


 
pavel_k   (2003-12-11 20:04) [1]

А как осуществляется движение?
По идее, у каждого объекта должны быть переменные (например incX и incY), на которые прибавляются к координатам объекта кажджый DoMove. Тогда надо просто поменять знак приращения координаты: incX:=-IncX;
Приведенный тобой код приводит к тому, что спрайт не может вылететь за границы экрана, к отскакиванию он не имеет отношения.

Первый вопрос поставлен мягко говоря некорректно :) .
Что такое "кругообразный объект" и как определить: кругообразный объект или нет?. А эллипсообразные объекты не отскакивают от стен? :)
Что такое "ступеньки"? В программировании я такого понятия не встречал. Видимо, имеется в виду спрайт, картинка которого является ступеньками :) . Тогда надо знать, как эти "ступеньки" выводятся, рассчитываются и т.д. и т.п. Универсального способа "скатывания предмета по ступенькам" не существует (имеется в виду программный, а не реальный способ скатывания, реально скатить все что хочешь очень просто :) ).

ЗЫ >кругообразный объект в паденнии скатывался
по ступенькам

Я себе это как-то слабо представляю :)


 
mrAld ©   (2003-12-12 01:13) [2]

Гляди на мир :)! Физика природы реально подскажет тебе, что надо делать. Задай вектор объекту и следи за коллизией. Если она произошла, то угол падения равен углу отражения, минус скорости при столкновении, перенаправляешь зеркально вектор, описываешь формулу движения объекта (с замедлением скорости или без, с гравитацией или в свободном полёте)  и готово!
Чтобы он скатывался вниз, задай силу тяжести и направь её вертикально вниз. Дальше - школьная физика. Приложенный к объекту вектор тяги складывается с силой тяжести и даёт вектор движения. Ну и считай силу, противостоящую падению - ступеньки. Если движение объекта прекратилось, то его обработка завершается.


 
mrAld ©   (2003-12-12 01:13) [2]

Гляди на мир :)! Физика природы реально подскажет тебе, что надо делать. Задай вектор объекту и следи за коллизией. Если она произошла, то угол падения равен углу отражения, минус скорости при столкновении, перенаправляешь зеркально вектор, описываешь формулу движения объекта (с замедлением скорости или без, с гравитацией или в свободном полёте)  и готово!
Чтобы он скатывался вниз, задай силу тяжести и направь её вертикально вниз. Дальше - школьная физика. Приложенный к объекту вектор тяги складывается с силой тяжести и даёт вектор движения. Ну и считай силу, противостоящую падению - ступеньки. Если движение объекта прекратилось, то его обработка завершается.


 
G A M E R ©   (2003-12-13 01:27) [3]

Ну, если это аркада, то попробуй сделать как я, вот тут
http://www.alecsander4.narod.ru/v0.9.2beta.exe (614Кб)
Можно посмотреть, как гранаты летают.
А вот как они летают:


struct Granade
{
float x,y,sx,sy,ro;
int d,r,timer,time;
};

void Game::ProgressGranades()
{
static Granade* g;
static float step;
static int colsteps;
static bool a;

for(int i = 0;i<ColGranades;i++)
{
g = &((Granade*)granades)[i];

step = g->sx/Abs(g->sx);

colsteps = (int)Abs(g->sx);

if(GetTickCount()-g->time>=g->timer)
{
 Drag(g->x,g->y,g->r);
 for(int k = 0;k<ColHeros;k++)
 {
  static Hero h;
  static float distance,factor;

  AddBoom(g->x-g->r,g->y-g->r,g->r*2);
  h = ((Hero*)Heros)[k];

  distance = Distance(h.posx+h.anim[0][0]->w/2,h.posy+h.anim[0][0]->h/2,g->x,g->y);

   if(!(distance>g->r))
   {
    factor = (1-(distance/g->r));
    ((Hero*)Heros)[k].hels -= g->d*factor;
    AddBlood(BloodDamage/2,h.posx,h.posy,h.xspeed,h.yspeed,50,63488+rand()%15);
    AddBlood(BloodDamage/2,h.posx,h.posy,h.xspeed,h.yspeed,75,63488+rand()%15);
    ((Hero*)Heros)[k].xspeed += (g->r-(-g->x+((Hero*)Heros)[k].posx));
    ((Hero*)Heros)[k].yspeed += (g->r-(-g->y+((Hero*)Heros)[k].posy));
   }
 }
 DeleteGranade(i);
 a = 1;
}
else
 a = 0;

for(int i = 0;i<colsteps&&!a;i++)
{
 if(getpixel((BITMAP*)map,g->x+step,g->y)!=alpha)
 {
  g->sx = -(float)(g->sx/2);
  break;
 }
 else
 {
  g->x+=step;
  g->ro+=step*3;
  g->sx-=(float)(0.05f*step);
 }
}

step = g->sy/Abs(g->sy);

colsteps = (int)Abs(g->sy);

for(i = 0;i<colsteps&&!a;i++)
{
 if(getpixel((BITMAP*)map,g->x,g->y+step)!=alpha)
 {
  g->sy = -(float)(g->sy/2);
  break;
 }
 else
 {
  g->y+=step;
  g->sy-=(float)(0.05f*step);
 }
}

g->sy += (float)1.0f;
}

}


 
G A M E R ©   (2003-12-13 01:27) [3]

Ну, если это аркада, то попробуй сделать как я, вот тут
http://www.alecsander4.narod.ru/v0.9.2beta.exe (614Кб)
Можно посмотреть, как гранаты летают.
А вот как они летают:


struct Granade
{
float x,y,sx,sy,ro;
int d,r,timer,time;
};

void Game::ProgressGranades()
{
static Granade* g;
static float step;
static int colsteps;
static bool a;

for(int i = 0;i<ColGranades;i++)
{
g = &((Granade*)granades)[i];

step = g->sx/Abs(g->sx);

colsteps = (int)Abs(g->sx);

if(GetTickCount()-g->time>=g->timer)
{
 Drag(g->x,g->y,g->r);
 for(int k = 0;k<ColHeros;k++)
 {
  static Hero h;
  static float distance,factor;

  AddBoom(g->x-g->r,g->y-g->r,g->r*2);
  h = ((Hero*)Heros)[k];

  distance = Distance(h.posx+h.anim[0][0]->w/2,h.posy+h.anim[0][0]->h/2,g->x,g->y);

   if(!(distance>g->r))
   {
    factor = (1-(distance/g->r));
    ((Hero*)Heros)[k].hels -= g->d*factor;
    AddBlood(BloodDamage/2,h.posx,h.posy,h.xspeed,h.yspeed,50,63488+rand()%15);
    AddBlood(BloodDamage/2,h.posx,h.posy,h.xspeed,h.yspeed,75,63488+rand()%15);
    ((Hero*)Heros)[k].xspeed += (g->r-(-g->x+((Hero*)Heros)[k].posx));
    ((Hero*)Heros)[k].yspeed += (g->r-(-g->y+((Hero*)Heros)[k].posy));
   }
 }
 DeleteGranade(i);
 a = 1;
}
else
 a = 0;

for(int i = 0;i<colsteps&&!a;i++)
{
 if(getpixel((BITMAP*)map,g->x+step,g->y)!=alpha)
 {
  g->sx = -(float)(g->sx/2);
  break;
 }
 else
 {
  g->x+=step;
  g->ro+=step*3;
  g->sx-=(float)(0.05f*step);
 }
}

step = g->sy/Abs(g->sy);

colsteps = (int)Abs(g->sy);

for(i = 0;i<colsteps&&!a;i++)
{
 if(getpixel((BITMAP*)map,g->x,g->y+step)!=alpha)
 {
  g->sy = -(float)(g->sy/2);
  break;
 }
 else
 {
  g->y+=step;
  g->sy-=(float)(0.05f*step);
 }
}

g->sy += (float)1.0f;
}

}


 
G A M E R ©   (2003-12-13 01:30) [4]

Вот это полет
for(int i = 0;i<colsteps&&!a;i++)
{
if(getpixel((BITMAP*)map,g->x+step,g->y)!=alpha)
{
 g->sx = -(float)(g->sx/2);
 break;
}
else
{
 g->x+=step;
 g->ro+=step*3;
 g->sx-=(float)(0.05f*step);
}
}

step = g->sy/Abs(g->sy);

colsteps = (int)Abs(g->sy);

for(i = 0;i<colsteps&&!a;i++)
{
if(getpixel((BITMAP*)map,g->x,g->y+step)!=alpha)
{
 g->sy = -(float)(g->sy/2);
 break;
}
else
{
 g->y+=step;
 g->sy-=(float)(0.05f*step);
}
}


А вот это гравитация
g->sy += (float)1.0f;
Я сейчас делаю, чтобы оно скатывалось по горке.


 
G A M E R ©   (2003-12-13 01:30) [4]

Вот это полет
for(int i = 0;i<colsteps&&!a;i++)
{
if(getpixel((BITMAP*)map,g->x+step,g->y)!=alpha)
{
 g->sx = -(float)(g->sx/2);
 break;
}
else
{
 g->x+=step;
 g->ro+=step*3;
 g->sx-=(float)(0.05f*step);
}
}

step = g->sy/Abs(g->sy);

colsteps = (int)Abs(g->sy);

for(i = 0;i<colsteps&&!a;i++)
{
if(getpixel((BITMAP*)map,g->x,g->y+step)!=alpha)
{
 g->sy = -(float)(g->sy/2);
 break;
}
else
{
 g->y+=step;
 g->sy-=(float)(0.05f*step);
}
}


А вот это гравитация
g->sy += (float)1.0f;
Я сейчас делаю, чтобы оно скатывалось по горке.


 
ZAROLF ©   (2003-12-13 11:23) [5]

Вообще я на Delphi пишу, но и на C++ иногда,т.к сложно.
Этот эфект применялся в игре Worms2, но исходников похожих немогу найти.


 
ZAROLF ©   (2003-12-13 11:23) [5]

Вообще я на Delphi пишу, но и на C++ иногда,т.к сложно.
Этот эфект применялся в игре Worms2, но исходников похожих немогу найти.


 
G A M E R ©   (2003-12-13 11:35) [6]

Не, я сам это писал. На С (или С++) + Allegro( http://alleg.sourceforge.net/wip.html ) несложнее, чем на Delphi. Чем мне больше С++ нравится, так это тем, что он легче в использовании, особенно указатели.


 
G A M E R ©   (2003-12-13 11:35) [6]

Не, я сам это писал. На С (или С++) + Allegro( http://alleg.sourceforge.net/wip.html ) несложнее, чем на Delphi. Чем мне больше С++ нравится, так это тем, что он легче в использовании, особенно указатели.



Страницы: 1 вся ветка

Форум: "Игры";
Текущий архив: 2004.04.11;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.037 c
6-1079517885
Triakin
2004-03-17 13:04
2004.05.09
Какие инструменты лучше использовать для обмена инф. в сети


1-1082883969
Артем К.
2004-04-25 13:06
2004.05.09
Как вызвать диалог выбора папки?


7-1080123240
Петро
2004-03-24 13:14
2004.05.09
Проверка подлинности пароля.


1-1082467995
Ultr
2004-04-20 17:33
2004.05.09
Функция в DLL с типизированным результатом?????


1-1082463556
Goida
2004-04-20 16:19
2004.05.09
Чистка Excel...





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский