![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите с физикой в 2D аркаде ! [Delphi]
ZAROLF © (2003-12-11 10:16:00)Подскажите как сделать - чтобы кругообразный объект в паденнии скатывался
по ступенькам, и продолжал катиться в определённом направлении.
-------------------------------------------------------------------------
И ещё, здесь такая проблема:
Нужно чтобы кругообразный объект отскакивал от стен в моей карте(по горизонтали).
if x >= form1.DXDraw1.SurfaceWidth -image.Width then
x := form1.DXDraw1.SurfaceWidth -image.Width;
if x <= 0 then
x := 1;
Данный пример мне не помог, подскажите как правильно сделать.
G A M E R (2003-12-13 11:35:00) [1]Не, я сам это писал. На С (или С++) + Allegro( http://alleg.sourceforge.net/wip.html) несложнее, чем на Delphi. Чем мне больше С++ нравится, так это тем, что он легче в использовании, особенно указатели.
ZAROLF (2003-12-13 11:23:00) [2]Вообще я на Delphi пишу, но и на C++ иногда,т.к сложно.
Этот эфект применялся в игре Worms2, но исходников похожих немогу найти.
G A M E R (2003-12-13 01:30:00) [3]Вот это полет
for(int i = 0;ix+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;ix,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:00) [4]Ну, если это аркада, то попробуй сделать как я, вот тут
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;isx/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;kx-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;ix+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;ix,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;
}
}
mrAld (2003-12-12 01:13:00) [5]Гляди на мир :)! Физика природы реально подскажет тебе, что надо делать. Задай вектор объекту и следи за коллизией. Если она произошла, то угол падения равен углу отражения, минус скорости при столкновении, перенаправляешь зеркально вектор, описываешь формулу движения объекта (с замедлением скорости или без, с гравитацией или в свободном полёте) и готово!
Чтобы он скатывался вниз, задай силу тяжести и направь её вертикально вниз. Дальше - школьная физика. Приложенный к объекту вектор тяги складывается с силой тяжести и даёт вектор движения. Ну и считай силу, противостоящую падению - ступеньки. Если движение объекта прекратилось, то его обработка завершается.
pavel_k (2003-12-11 20:04:00) [6]А как осуществляется движение?
По идее, у каждого объекта должны быть переменные (например incX и incY), на которые прибавляются к координатам объекта кажджый DoMove. Тогда надо просто поменять знак приращения координаты: incX:=-IncX;
Приведенный тобой код приводит к тому, что спрайт не может вылететь за границы экрана, к отскакиванию он не имеет отношения.
Первый вопрос поставлен мягко говоря некорректно :) .
Что такое "кругообразный объект" и как определить: кругообразный объект или нет?. А эллипсообразные объекты не отскакивают от стен? :)
Что такое "ступеньки"? В программировании я такого понятия не встречал. Видимо, имеется в виду спрайт, картинка которого является ступеньками :) . Тогда надо знать, как эти "ступеньки" выводятся, рассчитываются и т.д. и т.п. Универсального способа "скатывания предмета по ступенькам" не существует (имеется в виду программный, а не реальный способ скатывания, реально скатить все что хочешь очень просто :) ).
ЗЫ >кругообразный объект в паденнии скатывался
по ступенькам
Я себе это как-то слабо представляю :)