Форум: "Игры";
Текущий архив: 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.49 MB
Время: 0.038 c