Конференция "Игры" » Подскажите как правильно сделать. [Delphi, Windows]
 
  • 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][p:0.012]