Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Алгоритм выстрела [Delphi, Windows]


Страницы:   1 2

|<ent ©   (2007-07-10 19:55:00) 

Добрый день! Я начинающий, у меня возникла проблема следующего характера. Я делаю игру(стрелялку) и у меня проблема с выстрелами. Для создания выстрела я использую этот код

//по команде рисуем снаряд
     if pul.fireon then
     begin
       //pul.XRot:=ModR;
       if Pul.active then Pul.Forv;
Pul.Fast:=14;
       Map.GetY(Cam.XPos, Cam.ZPos);
       glBindTexture(GL_TEXTURE_2D, den);
       pul.Rend(0,0,plus,1,10,10);//рисуем снаряд
       EffectDraw(Pul.XPos, -Pul.YPos, Pul.ZPos);//рисуем дым от снаряда
       MAp.GetY(Pul.XPos, Pul.ZPos);
       if Map.BAN > -Pul.YPos-0.7 then // проверка условия косания земли
       begin
         VzrivBool:=True;
         pul.active:=false;
         if VzrivBool= true then
         begin
           VX:=Pul.XPos;
           VY:=Pul.YPos;
           VZ:=Pul.ZPos;
           Np.X:=VX;Тоесть рендер
           NP.Y:=VY;
           Np.Z:=VZ;
           end;
           NP.active:= true;//рисуем врыв
           end;
           NP.active:= true;
     end; // здесь заканчивается рендеринг снаряда

{Прорисовка эффекта}
procedure EffectDraw(x, y, z: glFloat);
var
 cam: TGLNrf3;
begin
 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_Decal);
 glEnable(GL_NORMALIZE);
 glPushMatrix;
   glDisable(gl_Fog);
   glDisable(GL_LIGHTING);
   glTranslatef(-x,y,-z);
   glScaleF(0.02, 0.02, 0.02);
   glrotatef(angy,1,0,0);
   glrotatef(angx,0,0,1);
   glcolor4f(0.5,0.5,0.5,0.5);
   glEnable(GL_DEPTH_TEST);
   glDisable(GL_BLEND);
   glEnable(GL_TEXTURE_2D);
   glEnable(GL_BLEND);
   glBlendFunc(GL_ONE_MINUS_DST_COLOR,GL_ONE);
   rotate_point(10,part.posis[0],part.posis[1]);
   cam[0]:=0; cam[1]:=1; cam[2]:=0;
   rotate_point( angy-270,cam[1],cam[2]);
   rotate_point(-angx-180,cam[0],cam[1]);
   part2.add_particle;
   part2.reset_pr;
   XGLEnableTexture(LTGA);
   part2.draw_par(cam, 6500);
   glEnable(GL_DEPTH_TEST);
   glDisable(GL_BLEND);
   glEnable(gl_Fog);
   glEnable(GL_LIGHTING);
 glPopMatrix;
end;
//прорисовка снаряда
procedure Tpul.Rend( x, y, z, r: GLFloat; slices, stacks: GLInt);
var
 quad: GLUQuadricObj;
begin
 glEnable(GL_CULL_FACE);
 glCullFace(GL_Back);
 glEnable(GL_BLEND);
 glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
 quad := gluNewQuadric;
 gluQuadricNormals(quad, GLU_SMOOTH); // для освещения, если надо
 gluQuadricTexture(quad, true);       // для текстуры, если надо
 glColor3f(1, 0, 0);
 glColor4f(0.0,0.0, 0, 0.1);
 glPushMatrix;
   glTranslatef( -x-Xpos, y-ypos, -z-zpos);
   gluSphere( quad, r, slices, stacks );
     glPopMatrix;
 gluDeleteQuadric( quad );
 glDisable(GL_BLEND);
 glDisable(GL_CULL_FACE);
end;

Я не могу разобраться почему если после первого выстрела пока пуля не каснулась земли выстрелить ещё раз то первая пуля исчезнет так и не долетев до земли.
То есть прорисовка первой пули заканчивается после появления второй.Вопрос как это исправить? И у меня возник ещё один вопрос. Я хочу сделать стрелялку от первого лица.И я не знаю как сделать так что бы модель оружия находилась перед экраном и двигалась вместе с камерой.
P.S.
Я очень прошу вас помочь мне так как покачто моих знаний не хватает, а игру очень хочется сделать.


@!!ex   (2007-07-24 12:28:00) [1]

> [31] antonn ©   (24.07.07 12:18)

и?
Мне интересно че вы пытаетесь доказать. :))
Словами не проще выразить?


antonn   (2007-07-24 12:18:00) [2]


> @!!ex ©   (24.07.07 11:57) [30]


[4]
> Кстати мысль...
> Вопрос в том, как програмно порезать машину...


:)


@!!ex   (2007-07-24 11:57:00) [3]

> [29] Rembo   (24.07.07 00:20)

И что?
Каким боком вызрыв машины для скроллера относится к 3D Action'у?
В данном случае разговор о построении архитектуры и базовых алгоритмов.
Кркасота взрыва ну никак не относится к базовым возмлжностям движка. Ферштейн?


Rembo   (2007-07-24 00:20:00) [4]


> При том, что я писал все свободное время не останавливаясь
> практически и не переписывал ничего, при том, что я ЗНАЛ
> что и как надо писать. Тоесть вопросов вида, как же все
> таки сделать это?? не возникало.

Взрыв машины.
@!!ex ©   (07.07.07 13:23)  
Как красиво реализовать?
)))))))))))))))


Jeer   (2007-07-13 13:47:00) [5]


> по окончании игры былоб
> разумно обнулять масив, а после начала - динамично выделять
> память


Ну вот в начале она и перераспределится, зачем освобождать-то :)


@!!ex   (2007-07-13 09:14:00) [6]

> [26] Cash ©   (13.07.07 07:28)

Самый правильный подход. ИМХО.


Cash   (2007-07-13 07:28:00) [7]

Ну Jeer, тыж понимаешь, для чего я указал методы освобождения памяти!
Я как то постебался над двумя товарищами :)) именно из за этого.

Тут скажу как есть, по делу:
можно же указать глобальную переменную, масив такого типа.
тогда автоматически память будет освобождаться только после завершения
программы. Но ведь именно в данном случае по окончании игры былоб
разумно обнулять масив, а после начала - динамично выделять память.

В делфе с масивами и указателями проще, С++ небрежностей не прощает :)
поэтому даже в делфе я всегда поступал так, как поступал бы в С++.


Jeer   (2007-07-12 16:43:00) [8]


> Sapersky   (12.07.07 15:00) [24]


Верно, с учетом [21]


Sapersky   (2007-07-12 15:00:00) [9]

Смотрел в Delphi5 - и Finalize, и присвоение nil, и SetLength(ar,0) сводятся к одному и тому же System._DynArrayClear. Т.е. в общем без разницы; но для ясности ИМХО лучше Finalize или SetLength - чтобы потом ненароком не "освободить" присвоением nil обычный указатель.


Jeer   (2007-07-12 12:59:00) [10]


> Или я чего то не понимаю??


Так точно.
Для управления памятью в дин. массивах, как и в длин.строках используется механизм подсчета ссылок.
Поскольку одна из ссылок принудительно уст в nil, то уменьшается число ссылок и компилятор здесь автоматически подставит освобождение памяти.


@!!ex   (2007-07-12 10:41:00) [11]

> освобождение памяти масива - Finalize(Missiles) или просто
>
> выставить указатель на масив в nil.

Если указатель в nil выставишь, память же не осободится...
Или я чего то не понимаю??


Jeer   (2007-07-12 10:11:00) [12]


> освобождение памяти масива - Finalize(Missiles) или просто
> выставить указатель на масив в nil.


В Delphi освобождение памяти, выделенной под длинные строки и динамические массивы - автоматическое, при выходе из зоны видимости.
В пределах зоны видимости целесообразнее делать переопределение длины через SetLength(ar,0), если того требует функциональность


Cash   (2007-07-12 09:48:00) [13]

(ех... странник зашел на огонек к знакомым, а они все такие же, радует ^^)
Код 0-го поста написан своими руками? Если да, то не верю! :)

В сторону объектов и классов даж плевать не буду, наверное еще рано...
Масив, причем именно того типа, который ANTPro в [18] указал.

* выделение масива в N записей - SetLength(Missiles, N)
* освобождение памяти масива - Finalize(Missiles)или просто
выставить указатель на масив в nil.
* обращение к N-ому элементу масива - Missiles[N]
да... вощем вроде все ^^

(т.к. давно вернулся в обитель C++, точно не помню параметров,
а справки делфевой на работе нету :))) )


@!!ex   (2007-07-11 23:54:00) [14]

> [17] |<ent   (11.07.07 21:50)

Народ, и после таких вопросов вы все еще считаете, что в своем первом опсте я был не прав??


> [18] ANTPro ©   (11.07.07 22:36)

Уровня знаний не хватит, чтобы понять динамические массивы....


> |<ent
, мой тебе совет, забей пока на игру и возьми какую нить простоую книжку для начинающих. Учебник. Где просто тупо будут объяснятся основы. Я понимаю, тебе влом... Но дело в том, что без основ все равно ничерта не получится. Я могу тебе дать готовый код работы с пулей. Но легче тебе от этого не станет. Ты должен ПОНЯТЬ как оно работает. Аозьми книдку и просто тупо прочитай и сделай все примеры. Я в свое время так и сделал, когда с паскаля на дельфи переходил. Просто весь день читал книжку и клепал примеры. Очень помогло.


ANTPro   (2007-07-11 22:36:00) [15]

> [17] |<ent   (11.07.07 21:50)
Приблизительно так:
type
 TCoord=record
   X,Y,Z:Integer;
 end;
var
 Missiles:array of TCoord;


|&lt;ent   (2007-07-11 21:50:00) [16]

А как именно?


@!!ex   (2007-07-11 21:06:00) [17]

Чем помочь то? Сказали те: юзай массив.


|&lt;ent   (2007-07-11 20:00:00) [18]

Помогите мне


@!!ex   (2007-07-11 19:59:00) [19]

> [13] Домик   (11.07.07 19:03)

Зачем убиваться? делать что нить попроще...
А потом уже и убийцу HL можно сваять.


Домик   (2007-07-11 19:03:00) [20]


> @!!ex ©   (10.07.07 21:24) [2]
> Парень... Забей делать стрелялку...

Это ты автору сразу предлагаешь убить себя об стену? :)
Если всего боятся и ни за что не браться, то ничему не научишься... так что все нормально, проблемы они как раз, для того чтобы их преодолевать и находить решения...


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо