Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.11;
Скачать: CL | DM;

Вниз

Помогите с физикой в 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;

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


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

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

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

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

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


 
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: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, но исходников похожих немогу найти.


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

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



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

Текущий архив: 2004.04.11;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.053 c
1-1080210217
SergP
2004-03-25 13:23
2004.04.11
Как запретить запуск нового процесса?


1-1080308930
Dysan
2004-03-26 16:48
2004.04.11
avi из ресурса


6-1079540581
Kondryuk
2004-03-17 19:23
2004.04.11
Сокеты...


3-1079281541
Slider88
2004-03-14 19:25
2004.04.11
Проблема русских букв в SQL-сервере


4-1075460477
comwad
2004-01-30 14:01
2004.04.11
Как найти HWND у TSpeedButton в чужом приложении?