Конференция "Игры" » Подскажите как правильно сделать. [Delphi, Windows]
 
  • MERLIN:) (24.05.07 00:13) [0]
    Подскажите как правильно сделать.

    Хочу сделать игру по книге. Пока есть
    идея квест с головоломками. И всё как можно ближе к сюжету.

    Я незнаю как делать игру правильно. Разрабатывать движок массового
    применения а потом писать игру, или больше заточеным под игру(пару нужных модулей) и
    потом саму игру.
  • grouzd)ev © (24.05.07 00:23) [1]
    Больше затачивать надо в сторону сюжета и геймплея. Потом в сторону графики. Потом звука. Ну а потом движок только для себя, потому что коммунизма не бывает.

    ps что за книга?)

    ---
    ... we are walking on a thin line and you better avoid the risk ...
  • Домик (24.05.07 00:27) [2]
    Первым делом нужно решить, что ты хочешь больше, написать игру или написать движок. Дело в том, что тут форум больше программистов, и все в первую очередь будут говорить, что своя игра начинается со своего движка. И как правило разработка игры на этом в большинстве случаев и заканчивается.

    Если ты не хардкорный программист, то мой тебе совет не связывайся с разработкой своего движка, посмотри уже готовые движки, выбери тот, что тебе по душе. Попробуй сделать на нем простую аркадку или стрелялку чтобы понять как он устроен и как с ним вообще работать. А потом можно уже взяться за что-то более серьезное.
  • MERLIN:) (24.05.07 11:56) [3]
    А какие движки для делфи есть.
    На котором можно написать красивый эдвенчур.
    Я просто не видел подходящих движков. Поэтому думаю писать както свой
    Может я неправ?
  • grouzd)ev © (24.05.07 12:42) [4]
    Имхо прав - писать надо свой. Только не отделять "движок" от самой игры.

    А насчет красивости - хороший художник во много раз важнее чем все высокие технологии (квест вообще имхо должен быть самым нетребовательным к железу). отличные примеры - Broken Sword, Syberia, Silent Hill

    ---
    ... we are walking on a thin line and you better avoid the risk ...
  • Домик (24.05.07 12:56) [5]
    > Имхо прав - писать надо свой.

    Имхо стоит ли писать свой движок, зависит от существующего профессионализма. Если руки прямые то можно и любой сторонний двиг заточить под свои нужды, а если кривые, то и свой движок не поможет.

    Первый проект не стоит начинать с разработки своего движка. Это я как человек, съевший на этом собаку говорю...
  • Домик (24.05.07 13:03) [6]
    Немного под итожу: если ты не можешь написать игру на чужом движке, зачем тогда писать свой? :)
  • @!!ex © (24.05.07 14:27) [7]
    А очередной раз выскажу свое мнение...
    Надо писать свой двиг. ИМХо цель любого любительского проекта - научиться делать проекты и заиметь что-то, что можно показать работодателю.
    Используя чужой двиг, ни первое, ни второе не получится.
  • MERLIN:) (24.05.07 16:35) [8]
    А можно вообще писать игру используя материалы книги и фотки из фильма
    переделанные в ФОТОШОПЕ?

    Может кто нибудь из вас писал игры по фильму или по книге. Поделитесь
    опытом.
  • grouzd)ev © (24.05.07 16:46) [9]
    Думаю нет, нельзя. По крайней мере продать не получится - надо спросить разрешение =)

    ---
    ... we are walking on a thin line and you better avoid the risk ...
  • Домик (24.05.07 17:54) [10]
    > А очередной раз выскажу свое мнение...

    Не соглашусь с этим мнением по некоторым причинам:
    Если разрабатывать свой двиг с целью поиска работы в конторе занимающейся middleware, то цель вполне оправдана. Но если хочется просто получить какой либо опыт в разработке игр, то писать свой двиг совсем не обязательно. Дело в том что сейчас, как наверное все знают, есть разработчики именно middleware, а есть разработчики игр. Первые разрабатывают для вторых инструменты для создания игр. Есть, конторы, которые имеют отдел по разработке и поддержке собственного движка, но там совершенно разные люди работают над программированием самой игры и движка. Тут важно определить для себя цель разработки и к кому вы себя больше относите.

    По моим наблюдениям, у кого получаются хорошие и качественные движки, совершенно не получаются интересные игры. И на оборот, у кого интересные игры, они не занимаются разработкой своего движка. Конечно, существуют исключения из моих наблюдений, но мне хватит нескольких пальцев, чтобы их все пересчитать. :)

    Все зависит от преследуемой цели.

    > Может кто нибудь из вас писал игры по фильму или по книге.

    Чтобы писать коммерческий проект по фильму или книге, нужно лицензию. А тебе её никто не даст и даже не продаст...
  • ElectriC © (24.05.07 19:48) [11]

    > По моим наблюдениям, у кого получаются хорошие и качественные
    > движки, совершенно не получаются интересные игры.

    Ну это вы вообще загнули чушь полнейшую!!! Плохо наблюдали!!!!
  • @!!ex © (24.05.07 20:20) [12]
    > [10] Домик   (24.05.07 17:54)

    "А ты не путай кислый с длинным!" (С) Гоблин
    Есть геймдизайнеры, а есть программисты. Все зависит от того, кем хочет стать автор.
  • XProger © (24.05.07 22:23) [13]
    Есть игровые программисты, есть игровые дизайнеры - совершенно разные люди занимающиеся совершеннос разными вещами.
  • grouzd)ev © (24.05.07 23:43) [14]
    Итого
    - пиши игру на своих разработках себе в удовольствие
    - хороший движок (если и есть для квестов на дэлфи) стоит денег. плохой движок нафиг не нужен
    - пиши себе в удовольствие
    - и если не на продажу - бери книгу и фильм =)


    > ps что за книга?)

    все же?)

    ps сам давно соблазняюсь квестами) посмотрим что будет)

    ---
    ... we are walking on a thin line and you better avoid the risk ...
  • Домик (25.05.07 00:12) [15]
    > Ну это вы вообще загнули чушь полнейшую!!! Плохо наблюдали!!!!

    Я сразу сказал, что есть исключения. Но этих исключений и 10 не будет. И в большинстве своем даже эти успешные исключения пользуются популярностью в очеень узких кругах. Зато в большинстве своем люди, которые разрабатывают очень продаваемые игры, не занимаются разбрасыванием денег на ветер и изобретением своих велосипедов. Если вы приведете мне более 10 успешных игр разработанных 1-2 человеками на своем движке, буду рад признать что я не прав.

    > XProger ©   (24.05.07 22:23) [13]
    и
    > @!!ex ©   (24.05.07 20:20) [12]

    Совершенно верно. И главное решить для себя к кому относишься сам и далее уже решать, что тебе ближе: разработка движка или разработка игры. Ведь все знают, для того чтобы разработать более менее нормальный работоспособный движок нужно вложить в него сил, почти столько же сколько в нормальную игру. А если нет опыта...?

    ЗЫ: Я лишь маленький противовес в этом форуме, хардкорным программистам, для того чтобы "сырым" новичкам решившим написать игру, было о чем подумать и что-то выбрать, а не тупо следовать советам и сразу начинать работу с разработки своего движка.
  • Rial © (25.05.07 00:21) [16]
    Добавлю свои 5 копеек.
    Думаю, сразу начинать писать движок неразумно, ибо
    в начале просто еще не знаешь, что в этот двиг выносить,
    что нужно в нем предусматривать... Это придет, само, только
    после написания, путь не сложных, но нескольких игр...
  • MERLIN:) (25.05.07 01:13) [17]
    Я сегодня начал писать игру (движок графический а потом игровой)
    Сделал так Создал консольное приложение игры! И делаю модуль  
    графического движка.
    Пока всё  нормально.
    Проблема для меня будут текстуры и вообще картинки.
    Может подскажите где можно найти. Как писать загрузку текстур(изображений).  :)
  • XProger © (25.05.07 02:26) [18]
    Движок так движок... http://www.sulaco.co.za/tut.htm
  • @!!ex © (25.05.07 08:27) [19]
    > [17] MERLIN:)   (25.05.07 01:13)

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


    > Если вы приведете мне более 10 успешных игр разработанных
    > 1-2 человеками на своем движке, буду рад признать что я
    > не прав.

    Я могу привести целый сайт с играми собственной разработки, с успешными проектами... У пендосов....
    Меня эти проекты вообще не втыкают, такая лажа... ИМХО.

    P.S.
    А от меня требуют геймплей для одного из таких проектов...
    Пипец. Хардкорного геймера и программиста, поставили на разработку геймплея для казуальной игры для дебилов...
  • XProger © (25.05.07 09:39) [20]
    [оффтоп]@!!ex, в такой же ситуации :(
  • HARIER (31.05.07 15:53) [21]
    Надо написать модуль загрeзки картинок (Спрайтовый движок).
    Не знаю как правильно делать.
    Скачал с сайта sulaco.zo.za модуль загрузки текстур.
    И попытался с помощью него написать модуль который будет рисовать разные картинки
    (кнопки, курсоры и тд.) Чего то не получилось.
    Выскочила ошибка :

              Exception EAccessViolation in module BTT.exe at 0002E409

    посмотрите на код, что я делаю не так.

    .dpr


    program game;

    uses
     Windows,
     Messages,
     OpenGL,
     ENGINE in 'ENGINE.PAS',
     UTILITS in 'UTILITS.pas',
     DRAW2D in 'DRAW2D.pas',
     INPUT in 'INPUT.pas',
     LOG in 'LOG.pas',
     SPRITE in 'SPRITE.pas';

    const
     GAME_NAME   = 'NAME here';
     GAME_WIDTH  = 1024;
     GAME_HEIGHT = 768;

    var
    x: GlFloat;
    frst: TSprite;

    procedure Init;
    begin
     frst := TSprite.Create;
     if not frst.Load( 'smiles.tga',60,60 ) then exit;
    end;

    procedure Render;
    begin

     draw2d.RENDERING_BEGIN;
     draw2d.BEGIN_2D;

     glColor3ub(100,10,100);
     glBegin(GL_LINES);
     glVertex2f(0+x,0);
     glVertex2f(500+x,600);
     glEnd;

     frst.Draw(10,10,60,60);

     draw2d.WRITE(100,100,'ENGINE');
     draw2d.WRITE(100,120,PChar('FPS' + IntToStr(engine.FPS)));

     draw2d.END_2D;
     draw2d.RENDERING_END;

    end;

    procedure Update;
    begin
     if Input.Keys[KEY_ESCAPE] then engine.Quit;
    x:= x+0.01
    end;

    begin
     InitEngine;
     engine.CreateAPP(GAME_NAME,GAME_WIDTH,GAME_HEIGHT,true);
     log.AddtoLog('[APPLICATION] Application Started');
     log.AddtoLog('[APPLICATION] Application Width = '+inttostr(GAME_WIDTH));
     log.AddtoLog('[APPLICATION] Application Height = '+inttostr(GAME_HEIGHT));
     engine.SetProc(PROC_RENDER, @RENDER);
     engine.SetProc(PROC_UPDATE, @UPDATE);

     engine.Loop(1000);
    end.



    .pas


    unit SPRITE;

    interface

    uses
     Windows, OpenGL, Graphics, Classes, JPEG, UTILITS, TEXTURES;

    type
    TSprite = class
      constructor Create;
    public
      TexID : uint;
      TexWidth: Integer;
      TexHeight: Integer;
    public
      function  Load(path: string; w,h: integer): Boolean;
      procedure Draw(x,y,w,h: integer);
    end;

    // functions
    function gluBuild2DMipmaps(Target: GLenum; Components, Width, Height: GLint; Format, atype: GLenum; Data: Pointer): GLint; stdcall; external glu32;
    procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
    procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;

    implementation

    constructor TSprite.Create;
    begin

    end;

    function TSprite.Load(path: string; w: Integer; h: Integer): Boolean;
    begin
     TexWidth := w;
     TexHeight:= h;
     Result := LoadTexture(path, TexID, false);
    end;

    procedure TSprite.Draw(x,y: Integer; w,h: integer);
    begin

     // уходим на уровень выше
     glTranslatef( 0.0, 0.0, 0.0001 );

     // Выбираем текстуру
     glBindTexture( GL_TEXTURE_2D, TexID );

     // Обнуляем цвет
     glColor3f( 1, 1, 1 );

     // Разрешаем использование текстур
     glEnable( GL_TEXTURE_2D );

     glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
     glEnable( GL_BLEND );

     // Рисуем полигон
    // Рисуем полигон
     glBegin( GL_QUADS );
       glTexCoord2f( 0, 0 );
       glVertex2f( X, Y );
       glTexCoord2f( 1, 0 );
       glVertex2f( X+W, Y );
       glTexCoord2f( 1, 1 );
       glVertex2f( X+W, Y+H );
       glTexCoord2f( 0, 1 );
       glVertex2f( X, Y+H );
     glEnd();

     glDisable( GL_BLEND );
     glDisable( GL_TEXTURE_2D );
    end;

  • grisme © (31.05.07 16:54) [22]
    думаю, что квест надо начинать с логической текстовой основы :o) т.е. текстовый гейм-движок. в конце этого этапа появится текстовый квест, динамичный, завершенный как в литературном так и просто в смысловом виде.
    а потом уже графегу прикручивать, да там и несложно будет...
  • Домик (31.05.07 21:50) [23]
    Вот я говорил, что начинающему не стоит заниматься сразу своим движком, а взять какой-то уже готовый за основу. Неет же, все сказали надо писать свой и вот полюбуйтесь :))) Человек даже понять не может где у него ошибка и что он делает не так...
  • Домик (31.05.07 21:57) [24]
    > Я могу привести целый сайт с играми собственной разработки, с успешными проектами... У пендосов....

    Приведи... Где?

    > Меня эти проекты вообще не втыкают, такая лажа... ИМХО.

    Значит успешность проекта зависит от личного предпочтения к нему?
  • homm © (31.05.07 21:59) [25]
    > [16] Rial ©   (25.05.07 00:21)
    > Добавлю свои 5 копеек.
    > Думаю, сразу начинать писать движок неразумно, ибо
    > в начале просто еще не знаешь, что в этот двиг выносить,
    > что нужно в нем предусматривать... Это придет, само, только
    > после написания, путь не сложных, но нескольких игр...

    Сам так-же хотел написать пока ветку читал с начала.
    +1
  • MERLIN:) (01.06.07 01:17) [26]
    > grisme ©   (31.05.07 16:54) [22]
    Я с тобой соглашусь :)

    Текстовая основа (сценарий готов)

    Игру Я хочу начать писать с меню и с интерфейса. Для этого мне надо картинки.
    Графическое меню хочу сделать. :)

    Может есть где материал по загрузке изображений, спрайтам и тд.

    > Домик   (31.05.07 21:50) [23]

    В Движке сделал на данный момент такие модули:
     Модуль Опроса клавиатуры и мыши.
     Модуль Рендеринга(GL)
     Модуль Инициализации окна и движка со всеми переменными.

    Я просто не понимаю темы изображения, текстуры, спрайты.
    По этому поводу прошу помощи. :)
  • Jkot © (01.06.07 05:04) [27]
    Может всё таки взять уже готовый 2D графичекий дфижок? Поробуй http://isada.mirgames.ru/ там удобный двиг, хорошие статьи, справка в которой всё подробно расписанно загрузка текстур происходит за 1 действие....

    glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA ); прикаждом выводе не нажо указывать токо при Init.
  • MERLIN:) (02.06.07 02:34) [28]
    Как сделать спрайт (картинка с прозрачными областями).

    Текстуры получилось надевать на полигон и заливать фон и тп. :)
    Сейчас нужны кнопки, курсоры спрайтовые. Как сделать спрайт ?
  • Jkot © (02.06.07 04:28) [29]
    Хм когда текстуру грузиш ставиш в gluBuild2DMipmaps ставиш формат GL_RGBA + в сам массив точек что-ли делаеш из 4 элементов RGB + A откуда грузить A решай сам. Потом ставиш  glEnable( GL_BLEND ); перед отрисовкой и собсно рисуеш =)
  • MERLIN:) (02.06.07 15:27) [30]
    Я изменял альфу. Получается прозрачный весь объект .
    А если курсор и надо что был только сам курсор без фона.
    Как это сделать.
  • MERLIN:) (03.06.07 02:09) [31]
    Спасибо за помощь всё заработало :)

    Весь день писал. Уже готова заставка, экран загрузки.

    Я понял так что картинку (например курсор нужно обводить безье в редакторе).

    К вечеру у меня возникла проблема. А как поступить с буквами.
    Что каждую букву надо обводить. подскажите пожалуйста.? :)
  • Jkot © (03.06.07 06:42) [32]
    ХМ какими ещё безье??? Ты не то сделал, первое поищи модуль для TGA он с альфой поэтому в фотопопе например где альфу сделаеш, сохраниш, загрузиш там альфа и будет... Для текста делается всё просто где чёрный цвет там при загрузкеп альфа = 0 где белый 255 и всё...
  • MERLIN:) (03.06.07 11:32) [33]
    Jkot ©   (03.06.07 06:42) [32]
    С курсором вроде всё нормально я его обвел (вырезать или  безье).
    В редакторе и сохранил. Так работет нормаль но,а если не выделю то картинка то с белым фоном получается или искажённая.

    А по поводу текста ты новориш что можно просто буквы сохранить на белом или чёрном фоне и всё будет работать? :)
  • Jkot © (03.06.07 16:09) [34]
    Нет нужно приложить капельку мозгов и всё будет оки =) Я же тебе разжовывал выше, короче давай код которым ты текстуры грузиш...
  • MERLIN:) (03.06.07 16:51) [35]
    Jkot ©   (03.06.07 06:42) [32]
    ХМ какими ещё безье??? Ты не то сделал, первое поищи модуль для TGA он с альфой поэтому в фотопопе например где альфу сделаеш, сохраниш, загрузиш там альфа и будет... Для текста делается всё просто где чёрный цвет там при загрузкеп альфа = 0 где белый 255 и всё...


    Я не работал с Фотошопом. Как эту альфу рисовать. Я смотрел исходники конкурсных игр.
    Когда загружал файл font.tga в графический редактор Unlead Photo Impact, то буквы
    выделены какимита линиями (пунктирными).
    Как эти линии сделать???
  • MERLIN:) (03.06.07 17:50) [36]
    Вот код. который рисует текстурный текст



    procedure TSprite.text(x,y,w,h: Integer; R,G,B,A: Single; TexID: Cardinal; strText: string);
    var I, intAsciiCode : integer;
       imgcharWidth : GLfloat;
       imgcharPosX : GLfloat;
    begin
     glPushMatrix;
     glColor4f(R,G,B,A);
     glTranslatef(x,y,0);

     glBindTexture(GL_TEXTURE_2D, texID);  // Bind the Texture to the object
     glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
     glEnable( GL_BLEND );

     imgcharWidth := 1.0/66;
     strText := UpperCase(strText);

     for I := 1 to length(strText) do
     begin

       if ord(strText[I]) > 31 then //only handle 66 chars
       begin
         intAsciiCode := ord(strText[I]) - 96;
         imgcharPosX := length(strText)/2*25-length(strText)*25 + (i-1) * 25; // Find the character position from the origin [0.0 , 0.0 , 0.0]  to center the text
         glBegin(GL_QUADS);

           glTexCoord2f(imgcharWidth*intAsciiCode, 0.0);
           glVertex3f(-10.4+imgcharPosX, -10.4,  0.0);

           glTexCoord2f(imgcharWidth*intAsciiCode+imgcharWidth, 0.0);
           glVertex3f( 10.4+imgcharPosX, -10.4,  0.0);

           glTexCoord2f(imgcharWidth*intAsciiCode+imgcharWidth, 1.0);
           glVertex3f( 10.4+imgcharPosX,  10.4,  0.0);

           glTexCoord2f(imgcharWidth*intAsciiCode, 1.0);
           glVertex3f(-10.4+imgcharPosX,  10.4,  0.0);
         glEnd;
       end;
     end;
     glPopmatrix;
    end;

  • Кукареку (04.06.07 03:40) [37]

    > MERLIN:)   (03.06.07 17:50) [36]
    >
    > Вот код. который рисует текстурный текст


    В GLScene горазды проще.
  • Jkot © (04.06.07 04:50) [38]
    MERLIN:)   (03.06.07 16:51) [35]
    >Когда загружал файл font.tga в графический редактор Unlead Photo Impact, >то буквы выделены какимита линиями (пунктирными).
    >Как эти линии сделать???

    Эти линии и есть альфа он этими линиями отгораживает где прозрачные участки, где нет.

    MERLIN:)   (03.06.07 17:50) [36]
    >Вот код. который рисует текстурный текст
    Jkot ©   (03.06.07 16:09) [34]
    >короче давай код которым ты текстуры грузиш...

    Я просил код где ты текстуру грузиш, любую хоть с текстом, хоть без...

    Кукареку   (04.06.07 03:40) [37]
    >В GLScene горазды проще

    Ктож спорит, но кто-то настоятельно рекомендовал сделать свой двигл, а шас молчит!
  • MERLIN:) (04.06.07 17:44) [39]

    function CreateTexture(Width, Height, Format : Word; pData : Pointer) : Integer;
    var
     Texture : GLuint;
    begin
     glGenTextures(1, Texture);
     glBindTexture(GL_TEXTURE_2D, Texture);
     glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);  {Texture blends with object background}
    //  glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);  {Texture does NOT blend with object background}

     { Select a filtering type. BiLinear filtering produces very good results with little performance impact
       GL_NEAREST               - Basic texture (grainy looking texture)
       GL_LINEAR                - BiLinear filtering
       GL_LINEAR_MIPMAP_NEAREST - Basic mipmapped texture
       GL_LINEAR_MIPMAP_LINEAR  - BiLinear Mipmapped texture
     }  

     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); { only first two can be used }
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); { all of the above can be used }

     if Format = GL_RGBA then
       gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, Width, Height, GL_RGBA, GL_UNSIGNED_BYTE, pData)
     else
       gluBuild2DMipmaps(GL_TEXTURE_2D, 3, Width, Height, GL_RGB, GL_UNSIGNED_BYTE, pData);
    //  glTexImage2D(GL_TEXTURE_2D, 0, 3, Width, Height, 0, GL_RGB, GL_UNSIGNED_BYTE, pData);  // Use when not wanting mipmaps to be built by openGL

     result :=Texture;
    end;

    function LoadTexture(Filename: String; var Texture : GLuint; LoadFromRes : Boolean) : Boolean;
    begin
     if copy(Uppercase(filename), length(filename)-3, 4) = '.BMP' then
       LoadBMPTexture(Filename, Texture, LoadFromRes);
     if copy(Uppercase(filename), length(filename)-3, 4) = '.JPG' then
       LoadJPGTexture(Filename, Texture, LoadFromRes);
     if copy(Uppercase(filename), length(filename)-3, 4) = '.TGA' then
       LoadTGATexture(Filename, Texture, LoadFromRes);
    end;

  • MERLIN:) (04.06.07 17:55) [40]

    function LoadTGATexture(Filename: String; var Texture: GLuint; LoadFromResource : Boolean): Boolean;
    var
     TGAHeader : packed record   // Header type for TGA images
       FileType     : Byte;
       ColorMapType : Byte;
       ImageType    : Byte;
       ColorMapSpec : Array[0..4] of Byte;
       OrigX  : Array [0..1] of Byte;
       OrigY  : Array [0..1] of Byte;
       Width  : Array [0..1] of Byte;
       Height : Array [0..1] of Byte;
       BPP    : Byte;
       ImageInfo : Byte;
     end;
     TGAFile   : File;
     bytesRead : Integer;
     image     : Pointer;    {or PRGBTRIPLE}
     CompImage : Pointer;
     Width, Height : Integer;
     ColorDepth    : Integer;
     ImageSize     : Integer;
     BufferIndex : Integer;
     currentByte : Integer;
     CurrentPixel : Integer;
     I : Integer;
     Front: ^Byte;
     Back: ^Byte;
     Temp: Byte;

     ResStream : TResourceStream;      // used for loading from resource

     // Copy a pixel from source to dest and Swap the RGB color values
     procedure CopySwapPixel(const Source, Destination : Pointer);
     asm
       push ebx
       mov bl,[eax+0]
       mov bh,[eax+1]
       mov [edx+2],bl
       mov [edx+1],bh
       mov bl,[eax+2]
       mov bh,[eax+3]
       mov [edx+0],bl
       mov [edx+3],bh
       pop ebx
     end;

    begin
     result :=FALSE;
     GetMem(Image, 0);
     if LoadFromResource then // Load from resource
     begin
       try
         ResStream := TResourceStream.Create(hInstance, PChar(copy(Filename, 1, Pos('.', Filename)-1)), 'TGA');
         ResStream.ReadBuffer(TGAHeader, SizeOf(TGAHeader));  // FileHeader
         result :=TRUE;
       except on
         EResNotFound do
         begin
           MessageBox(0, PChar('File not found in resource - ' + Filename), PChar('TGA Texture'), MB_OK);
           Exit;
         end
         else
         begin
           MessageBox(0, PChar('Unable to read from resource - ' + Filename), PChar('BMP Unit'), MB_OK);
           Exit;
         end;
       end;
     end
     else
     begin
         AssignFile(TGAFile, Filename);
         Reset(TGAFile, 1);
         // Read in the bitmap file header
         BlockRead(TGAFile, TGAHeader, SizeOf(TGAHeader));
         result :=TRUE;
     end;

  • MERLIN:) (04.06.07 17:57) [41]


     if Result = TRUE then
     begin
       Result :=FALSE;

       // Only support 24, 32 bit images
       if (TGAHeader.ImageType <> 2) AND    { TGA_RGB }
          (TGAHeader.ImageType <> 10) then  { Compressed RGB }
       begin
         Result := False;
         CloseFile(tgaFile);
         MessageBox(0, PChar('Couldn''t load \"'+ Filename +'\". Only 24 and 32bit TGA supported.'), PChar('TGA File Error'), MB_OK);
         Exit;
       end;

       // Don't support colormapped files
       if TGAHeader.ColorMapType <> 0 then
       begin
         Result := False;
         CloseFile(TGAFile);
         MessageBox(0, PChar('
    Couldn''t load "'+ Filename +'". Colormapped TGA files not supported.'), PChar('TGA File Error'), MB_OK);
         Exit;
       end;

       // Get the width, height, and color depth
       Width  := TGAHeader.Width[0]  + TGAHeader.Width[1]  * 256;
       Height := TGAHeader.Height[0] + TGAHeader.Height[1] * 256;
       ColorDepth := TGAHeader.BPP;
       ImageSize  := Width*Height*(ColorDepth div 8);

       if ColorDepth < 24 then
       begin
         Result := False;
         CloseFile(TGAFile);
         MessageBox(0, PChar('
    Couldn''t load "'+ Filename +'". Only 24 and 32 bit TGA files supported.'), PChar('TGA File Error'), MB_OK);
         Exit;
       end;

       GetMem(Image, ImageSize);

       if TGAHeader.ImageType = 2 then   // Standard 24, 32 bit TGA file
       begin
         if LoadFromResource then // Load from resource
         begin
           try
             ResStream.ReadBuffer(Image^, ImageSize);
             ResStream.Free;
           except
             MessageBox(0, PChar('
    Unable to read from resource - ' + Filename), PChar('BMP Unit'), MB_OK);
             Exit;
           end;
         end
         else         // Read in the image from file
         begin
           BlockRead(TGAFile, image^, ImageSize, bytesRead);
           if bytesRead <> ImageSize then
           begin
             Result := False;
             CloseFile(TGAFile);
             MessageBox(0, PChar('
    Couldn''t read file "'+ Filename +'".'), PChar('TGA File Error'), MB_OK);
             Exit;
           end
         end;

         // TGAs are stored BGR and not RGB, so swap the R and B bytes.
         // 32 bit TGA files have alpha channel and gets loaded differently
         if TGAHeader.BPP = 24 then
         begin
           for I :=0 to Width * Height - 1 do
           begin
             Front := Pointer(Integer(Image) + I*3);
             Back := Pointer(Integer(Image) + I*3 + 2);
             Temp := Front^;
             Front^ := Back^;
             Back^ := Temp;
           end;
           Texture :=CreateTexture(Width, Height, GL_RGB, Image);
         end
         else
         begin
           for I :=0 to Width * Height - 1 do
           begin
             Front := Pointer(Integer(Image) + I*4);
             Back := Pointer(Integer(Image) + I*4 + 2);
             Temp := Front^;
             Front^ := Back^;
             Back^ := Temp;
           end;
           Texture :=CreateTexture(Width, Height, GL_RGBA, Image);
         end;
       end;

       // Compressed 24, 32 bit TGA files
       if TGAHeader.ImageType = 10 then
       begin
         ColorDepth :=ColorDepth DIV 8;
         CurrentByte :=0;
         CurrentPixel :=0;
         BufferIndex :=0;

         if LoadFromResource then // Load from resource
         begin
           try
             GetMem(CompImage, ResStream.Size-sizeOf(TGAHeader));
             ResStream.ReadBuffer(CompImage^, ResStream.Size-sizeOf(TGAHeader));   // load compressed date into memory
             ResStream.Free;
           except
             MessageBox(0, PChar('
    Unable to read from resource - ' + Filename), PChar('BMP Unit'), MB_OK);
             Exit;
           end;
         end
         else
         begin
           GetMem(CompImage, FileSize(TGAFile)-sizeOf(TGAHeader));
           BlockRead(TGAFile, CompImage^, FileSize(TGAFile)-sizeOf(TGAHeader), BytesRead);   // load compressed data into memory
           if bytesRead <> FileSize(TGAFile)-sizeOf(TGAHeader) then
           begin
             Result := False;
             CloseFile(TGAFile);
             MessageBox(0, PChar('
    Couldn''t read file "'+ Filename +'".'), PChar('TGA File Error'), MB_OK);
             Exit;
           end
         end;

         // Extract pixel information from compressed data
         repeat
           Front := Pointer(Integer(CompImage) + BufferIndex);
           Inc(BufferIndex);
           if Front^ < 128 then
           begin
             For I := 0 to Front^ do
             begin
               CopySwapPixel(Pointer(Integer(CompImage)+BufferIndex+I*ColorDepth), Pointer(Integer(image)+CurrentByte));
               CurrentByte := CurrentByte + ColorDepth;
               inc(CurrentPixel);
             end;
             BufferIndex :=BufferIndex + (Front^+1)*ColorDepth
           end
           else
           begin
             For I := 0 to Front^ -128 do
             begin
               CopySwapPixel(Pointer(Integer(CompImage)+BufferIndex), Pointer(Integer(image)+CurrentByte));
               CurrentByte := CurrentByte + ColorDepth;
               inc(CurrentPixel);
             end;
             BufferIndex :=BufferIndex + ColorDepth
           end;
         until CurrentPixel >= Width*Height;

         if ColorDepth = 3 then
           Texture :=CreateTexture(Width, Height, GL_RGB, Image)
         else
           Texture :=CreateTexture(Width, Height, GL_RGBA, Image);
       end;

       Result :=TRUE;
       FreeMem(Image);
     end;
    end;

  • Jkot © (05.06.07 04:15) [42]
    ХМ TGA уже поддерживает альфу просто тебе нужен нормальный редактор для графики, ИМХО лудше всего с альфой работает GIMP... А тот способ который я предлагал в TGA не всунеш =) Дай лудше ICQ....
  • MERLIN:) (05.06.07 10:39) [43]
    Jkot ©   (05.06.07 04:15) [42]

    Где его можно скачать
  • MERLIN:) (05.06.07 16:06) [44]
    Скачал и установил GIMP 2.
    Как правильно сделать хотя бы простой шрифт для игры?
  • Jkot © (06.06.07 06:22) [45]
    Хм впринципе можно сделать так: Береш генератор для шрифтов, я те в другой теме дал, потом грузиш шрифт, потом  на слое жмёш "Добавить маску слоя" выбираеш "копия слоя в оттенках серого" , жмеш там же применить маску слоя, дальше сохраняеш в TGA, всё точно будет альфа... Дальше пробуй выводить там тот генератор ещё создаёт доп файл, если что я скажу как этим файлом пользоватся....
  • MERLIN:) (09.06.07 20:05) [46]
    Почему этот код работает неправильно


    procedure Begin_Intro;
    begin

     draw2d.RENDERING_BEGIN;
     draw2d.BEGIN_2D;

     sprite.Fill(0,0,1024,768,1,1,1,1, company);

         draw2d.WRITE(100,200,'Stroka1');
         draw2d.WRITE(100,300,'Stroka2');
         draw2d.WRITE(200,400,PChar('FPS: ' + inttostr(engine.FPS)));
         draw2d.WRITE(100,300,'Stroka3');
     
         sprite.mouse(input.X,input.Y,30,30,1,1,1,1, m);

     draw2d.END_2D;
     draw2d.RENDERING_END;
    end;



    Такой же код в модуле меню работает правильно. :((((((
    Не пойму почему  Stroka1, Stroka2 выводится цветом который установлен в процедуре


    procedure TDraw2D.WRITE(X, Y: GLUint; text : PChar);
    var
    TexID: Cardinal;
    begin
     glColor3ub(0,0,250);

     glPopMatrix;
       glBindTexture(GL_TEXTURE_2D, texID);  // Bind the Texture to the object
       glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
       glEnable( GL_BLEND );

       Y := eH-Y;
       glRasterPos2i(X, Y);
       glPushAttrib(GL_LIST_BIT);
       glListBase(baseFont);
       glCallLists(length(text), GL_UNSIGNED_BYTE, text);
       glPopAttrib();
     glPopMatrix;
    end;



    А строка PChar('FPS: ' + inttostr(engine.FPS)) выводится чёрным и на фоновой картинке не видно
    Почему чёрный цвет в этой и следующих строках?

    И почему весь текст становится чёрного цвета если убрать следующие строки.

       glBindTexture(GL_TEXTURE_2D, texID);  // Bind the Texture to the object
       glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
       glEnable( GL_BLEND );



    ps. С текстурным шрифтом покачто ничего неполучается наверно неправильный код рисование этих
    текстурных шрифтов :((((

    Что делать ? :(
  • MERLIN:) (10.06.07 01:14) [47]
    Ломал голову весь день. Потом решил удалить везде в модулях рисования
    спрайтов и шрифтов команду установки цвета.
      glColor3ub(250,250,250);
    И всё заработало . :) Теперь цвет ришил устанавливать в самой программе.

    У меня такой вопрос. Как привильно использовать команды
    glPushMatrix;
    glPopMatrix;
    Где и зачем их использовать. Я знаю только то что первія помещяет в
    матрицу а вторая типа вітаскивет чтото. Объясните пожалуйста.
    Зарание благодарю :)
  • Jkot © (10.06.07 03:58) [48]
    Дык ты  1 раз устанавливаеш цвет и он действует на все обьекты пока ты не смениш го ещё разок....

    glPushMatrix;
    glPopMatrix;

    Push сохраняет матрицу а Pop загружает.... хм например нужно расположить 2 обьекта один в [40;100]  а другой в [90;200] можно сделать так:

    move[40;100] draw1;
    move[50;100] draw2;

    т.е движение складывается между собой + есть такая особенность что когды ты обьект покрутил то следуешее движение будет происходить уже относительно угла поворота, и все последующие обьекты буду рисоватся с тем же поворотом....

    Поэтому шоб немучицца с этим всем делай так:

    glPushMatrix;
    move[40;100] draw1;
    glPopMatrix;

    glPushMatrix;
    move[90;200] draw2;
    glPopMatrix;

    И ттогды все обьекты будут в координатах относительно [0;0]
  • Merlin:) (10.06.07 13:55) [49]
    Jkot ©   (10.06.07 03:58) [48]  

    Спасибо за совет
  • имя (08.08.07 22:51) [50]
    Удалено модератором
  • Pa5ha © (09.08.07 04:27) [51]
    Кстати, в модуле загрузки текстуры выше приведенном я вижу GetMem и ни одного FreeMem. Так и задумано?

    Ну и таки для того что бы пользоваца готовыми графическими движками надо знать хоть примерно как они работают. Для этого надо хотя бы попытаца написать свой. Аффтар на верном пути. Аффтар, почитай книгу М. Краснова. Графика OpenGL  в проектах дельфи. Стоит она недорого благо. Если совсем с деньгами напряг то в инете лежит. Например можешь порыть, где та была на D3Dengine.narod.ru . И настоятельно рекомендую порыть сорсы Jan Horn. Толково написано.
  • имя (25.12.07 02:54) [52]
    Удалено модератором
  • имя (11.01.08 00:33) [53]
    Удалено модератором
  • имя (11.01.08 00:37) [54]
    Удалено модератором
  • имя (17.01.08 23:07) [55]
    Удалено модератором
  • имя (27.04.08 17:00) [56]
    Удалено модератором
 
Конференция "Игры" » Подскажите как правильно сделать. [Delphi, Windows]
Есть новые Нет новых   [134430   +4][b:0.001][p:0.009]