Конференция "Игры" » Алгоритм выстрела [Delphi, Windows]
 
  • |<ent (10.07.07 19:55) [0]
    Добрый день! Я начинающий, у меня возникла проблема следующего характера. Я делаю игру(стрелялку) и у меня проблема с выстрелами. Для создания выстрела я использую этот код

    //по команде рисуем снаряд
         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.
    Я очень прошу вас помочь мне так как покачто моих знаний не хватает, а игру очень хочется сделать.
  • Efir © (10.07.07 20:07) [1]
    Ну так создай массив, в который будешь добавлять вновь созданную пулю, а если она долетела до земли, то удалять из массива. А ещё лучше использовать список.
  • @!!ex © (10.07.07 21:24) [2]
    Парень... Забей делать стрелялку...
    Я конечно никого не смею мерить с собой, но мой опыт:
    10 лет программирования на дельфи, пол года работы в одной из старейших геймдев контор России.
    2 года ОпенГЛ и DX и всякой другой ерунды...
    Пол года для 3Д стрелялки только внешнюю оболочку писал.
    Тоесть сейчас(после полугода разработки) есть частично готовый(колиззия, загрузка уровней, скелетная анимация, сло-мо, попадания по частям тела, скриптовый двиг для уровней, полтора десятка видов оружия, включая гранатометы и ракетницы, поддержка рукопашного боя) двиг без ИИ и физики.
    При том, что я писал все свободное время не останавливаясь практически и не переписывал ничего, при том, что я ЗНАЛ что и как надо писать. Тоесть вопросов вида, как же все таки сделать это?? не возникало.
    Простая архитектура на базе ООП. И самое главное... Сейчас я скорее всгео НЕ БУДУ доделывать эту игру, поскольку тупо надо все переделывать.
    А теперь прикинь, сколько времени ты будешь писать проект, если ты с этим всем ВООБЩЕ не знаком.
    А ты не знаком, это видно по коду и по вопросу.
    Для того, чтобы написать крупный проект, нужно две вещи:
    1) понимать, как работает компьютер(читай понимать ассемблер), как память распределяется и все такое.
    2) Знать ООП.
    Без этого написать что-то серьещное не реально.
    1) Будешь делать много ошибок тупейших. Типа описанной тобой.
    2) Будет ужасный код, в котором запутаешься.(Опять же, у меня есть проект, детский на штуку строк... Без ООП. Все в одном модуле... Там черт ногу сломит...)

    P.S.
    Я не презываю делать тетрис(Хотя если вспомнить тетрис от Creative - более чем достойное начало). Я призываю тебя ЗДРАВО оценить свои знания на НАСТОЯЩИЙ момент и сделать тот проект, который ты сейчас МОЖЕШЬ сделать. Тоесть возьми проект и банально в голове разложи ео на составляющие. И подумаю как каждую составляющую можно решаить(не конкретику, общее решение), если за 10 минут смог это сделать, берись за проект.

    P.P.S.
    Все выше сказанное - сугубо ИМХО.
  • antonn © (10.07.07 22:21) [3]

    > Пол года для 3Д стрелялки только внешнюю оболочку писал.

    дааа??? :)))
    а тут http://code.darthman.com/news.php подобное примерно в месяц пишут, полностью))))
  • @!!ex © (10.07.07 22:44) [4]
    > [3] antonn ©   (10.07.07 22:21)

    Ну во первых ты не знаешь что я писал. ;)
    А во вторых,я про себя говорю, а не про Дартмана. Он круче меня по кодингу, тут я и спорить не буду.
  • @!!ex © (10.07.07 22:46) [5]
    Кстати, если дашь ссылочку на конкретнйы пример 3д двигла качественного написанного за месяц, буду благодарен...

    P.S.
    Alien Shooter писали 2 месяца. ;)
  • RzCoDer © (10.07.07 22:49) [6]

    > @!!ex ©

    ну ты даёшь) человек конкретный вопрос задаёт, а ты тут такое... наболело чтоли?)
  • antonn © (11.07.07 00:00) [7]

    >
    > Ну во первых ты не знаешь что я писал. ;)

    не знаю, но вижу код, который выше:)) Если ты с этим кодом проводишь параллель - значит не просто так? :)
  • @!!ex © (11.07.07 00:44) [8]

    > RzCoDer ©   (10.07.07 22:49) [6]

    Ну и наболело тоже...
    Поскольку своими проектами не занимаюсь уже с января... Времени нету.. и желания кодить после работы...
    Да и на вопрос уже ответили в [1]


    > antonn ©   (11.07.07 00:00) [7]

    Я вижу код и могу судить о не высоком уровне программирования.
    Кстати, ссылочку то дай, на проект который за месяц написали.(Можно даже не с 0, хотя я говорил именно об этом)
  • antonn © (11.07.07 01:39) [9]

    > @!!ex ©   (11.07.07 00:44) [8]

    http://code.darthman.com/viewpage.php?page_id=19
  • @!!ex © (11.07.07 11:42) [10]
    И чего общего в этом конкурсе с тем, что я описал?
    (
    колиззия - максимум что есть в конкурсных работах - пересечение прямоугольников.
    загрузка уровней - уровни элементарные.
    скелетная анимация -  есть, тут не поспоришь.
    сло-мо -  не увидел.
    попадания по частям тела -  не увидел.
    скриптовый двиг для уровней - не увидел.
    полтора десятка видов оружия,включая гранатометы и ракетницы -  не увидел.
    поддержка рукопашного боя -  не увидел.
    )
    И вообще из этих демок только одна - 3д экшн.
    половина из них вообще в 2Д.
    Д аи написаны не с 0.
    Вот и месяц.
    Странный пример. Чесс слово.
  • antonn © (11.07.07 12:58) [11]

    > Странный пример. Чесс слово.

    странный ты, чесс слово:)
    "Пол года для 3Д стрелялки только внешнюю оболочку писал." - вот в этой фразе ниче такого никак по умолчанию не входит, не надо пальцы гнуть, все равно никто не ахнет:)
  • @!!ex © (11.07.07 15:08) [12]

    > antonn ©   (11.07.07 12:58) [11]

    Бррр. Да ни гну я пальцы. Привожу пример просто. А ты читаешь ИМХО как то через строчку...

    По умолчанию не входит. Поэтому я и написал дальше:

    > Тоесть сейчас(после полугода разработки) есть частично готовый(колиззия,
    >  загрузка уровней, скелетная анимация, сло-мо, попадания
    > по частям тела, скриптовый двиг для уровней, полтора десятка
    > видов оружия, включая гранатометы и ракетницы, поддержка
    > рукопашного боя) двиг без ИИ и физики.
  • Домик (11.07.07 19:03) [13]

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

    Это ты автору сразу предлагаешь убить себя об стену? :)
    Если всего боятся и ни за что не браться, то ничему не научишься... так что все нормально, проблемы они как раз, для того чтобы их преодолевать и находить решения...
  • @!!ex © (11.07.07 19:59) [14]
    > [13] Домик   (11.07.07 19:03)

    Зачем убиваться? делать что нить попроще...
    А потом уже и убийцу HL можно сваять.
  • |<ent (11.07.07 20:00) [15]
    Помогите мне
  • @!!ex © (11.07.07 21:06) [16]
    Чем помочь то? Сказали те: юзай массив.
  • |<ent (11.07.07 21:50) [17]
    А как именно?
  • ANTPro © (11.07.07 22:36) [18]
    > [17] |<ent   (11.07.07 21:50)
    Приблизительно так:
    type
     TCoord=record
       X,Y,Z:Integer;
     end;
    var
     Missiles:array of TCoord;

  • @!!ex © (11.07.07 23:54) [19]
    > [17] |<ent   (11.07.07 21:50)

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


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

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


    > |<ent
    , мой тебе совет, забей пока на игру и возьми какую нить простоую книжку для начинающих. Учебник. Где просто тупо будут объяснятся основы. Я понимаю, тебе влом... Но дело в том, что без основ все равно ничерта не получится. Я могу тебе дать готовый код работы с пулей. Но легче тебе от этого не станет. Ты должен ПОНЯТЬ как оно работает. Аозьми книдку и просто тупо прочитай и сделай все примеры. Я в свое время так и сделал, когда с паскаля на дельфи переходил. Просто весь день читал книжку и клепал примеры. Очень помогло.
  • Cash © (12.07.07 09:48) [20]
    (ех... странник зашел на огонек к знакомым, а они все такие же, радует ^^)
    Код 0-го поста написан своими руками? Если да, то не верю! :)

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

    * выделение масива в N записей -
    SetLength(Missiles, N)


    * освобождение памяти масива -
    Finalize(Missiles)

    или просто
    выставить указатель на масив в nil.
    * обращение к N-ому элементу масива -
    Missiles[N]


    да... вощем вроде все ^^

    (т.к. давно вернулся в обитель C++, точно не помню параметров,
    а справки делфевой на работе нету :))) )
  • Jeer © (12.07.07 10:11) [21]

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


    В Delphi освобождение памяти, выделенной под длинные строки и динамические массивы - автоматическое, при выходе из зоны видимости.
    В пределах зоны видимости целесообразнее делать переопределение длины через SetLength(ar,0), если того требует функциональность
  • @!!ex © (12.07.07 10:41) [22]
    > освобождение памяти масива - Finalize(Missiles) или просто
    >
    > выставить указатель на масив в nil.

    Если указатель в nil выставишь, память же не осободится...
    Или я чего то не понимаю??
  • Jeer © (12.07.07 12:59) [23]

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


    Так точно.
    Для управления памятью в дин. массивах, как и в длин.строках используется механизм подсчета ссылок.
    Поскольку одна из ссылок принудительно уст в nil, то уменьшается число ссылок и компилятор здесь автоматически подставит освобождение памяти.
  • Sapersky (12.07.07 15:00) [24]
    Смотрел в Delphi5 - и Finalize, и присвоение nil, и SetLength(ar,0) сводятся к одному и тому же System._DynArrayClear. Т.е. в общем без разницы; но для ясности ИМХО лучше Finalize или SetLength - чтобы потом ненароком не "освободить" присвоением nil обычный указатель.
  • Jeer © (12.07.07 16:43) [25]

    > Sapersky   (12.07.07 15:00) [24]


    Верно, с учетом [21]
  • Cash © (13.07.07 07:28) [26]
    Ну Jeer, тыж понимаешь, для чего я указал методы освобождения памяти!
    Я как то постебался над двумя товарищами :)) именно из за этого.

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

    В делфе с масивами и указателями проще, С++ небрежностей не прощает :)
    поэтому даже в делфе я всегда поступал так, как поступал бы в С++.
  • @!!ex © (13.07.07 09:14) [27]
    > [26] Cash ©   (13.07.07 07:28)

    Самый правильный подход. ИМХО.
  • Jeer © (13.07.07 13:47) [28]

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


    Ну вот в начале она и перераспределится, зачем освобождать-то :)
  • Rembo (24.07.07 00:20) [29]

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

    Взрыв машины.
    @!!ex ©   (07.07.07 13:23)  
    Как красиво реализовать?
    )))))))))))))))
  • @!!ex © (24.07.07 11:57) [30]
    > [29] Rembo   (24.07.07 00:20)

    И что?
    Каким боком вызрыв машины для скроллера относится к 3D Action'у?
    В данном случае разговор о построении архитектуры и базовых алгоритмов.
    Кркасота взрыва ну никак не относится к базовым возмлжностям движка. Ферштейн?
  • antonn © (24.07.07 12:18) [31]

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


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


    :)
  • @!!ex © (24.07.07 12:28) [32]
    > [31] antonn ©   (24.07.07 12:18)

    и?
    Мне интересно че вы пытаетесь доказать. :))
    Словами не проще выразить?
 
Конференция "Игры" » Алгоритм выстрела [Delphi, Windows]
Есть новые Нет новых   [134431   +10][b:0][p:0.001]