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

 
Конференция "Игры" » Подскажите как правильно сделать. [Delphi, Windows]
Есть новые Нет новых   [134430   +4][b:0][p:0.007]