Конференция "Игры" » Нужно сделать анимацию [Delphi, Windows]
 
  • MERLIN:) (12.06.07 19:11) [0]
    Как сделать анимимированый спрайт.
    Нарисовал спрайт так.

    procedure TSprite.Draw(x, y, w, h: Integer; TexID: Cardinal);
    begin
     glPushMatrix;  
     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 );
     glBegin(GL_QUADS);
       glTexCoord2f(0.0, 0.0); glVertex2f( 0, 0);
       glTexCoord2f(1.0, 0.0); glVertex2f( w, 0);
       glTexCoord2f(1.0, 1.0); glVertex2f( w, h);
       glTexCoord2f(0.0, 1.0); glVertex2f( 0, h);
     glEnd();
     glPopMatrix;
    end;


    А как рисовать анимированый спрайт.
    Что для этого надо сделать  ? :)
  • grouzd)ev © (13.06.07 00:20) [1]
    Нарисовать спрайт со следющим кадром (либо наложить другую текстуру, либо - если все кадры нарисованы на одной - сместить ее)

    ---
    ... we are walking on a thin line and you better avoid the risk ...
  • MERLIN:) (13.06.07 01:45) [2]
    Я тоже думал что надо как то смещать но как это сделать.
    Вы наверное делали что то подобно можете подробнее объяснить. ?
  • Хелпер (13.06.07 05:34) [3]

    > MERLIN:)   (12.06.07 19:11)
    >
    > Как сделать анимимированый спрайт.


    GLScene TAnimationSprite.
  • grouzd)ev © (13.06.07 09:37) [4]
    ну допустим если frame_width - ширина кадра, а frame_number - номер и все кадры расположены "по горизонтали", то

    glMatrixMode(GL_TEXTURE);
    glTranslatef(frame_width * frame_number, 0, 0);
    glMatrixMode(GL_MODELVIEW);

    //рисуем спрайт

    glMatrixMode(GL_TEXTURE);
    glTranslatef(- frame_width * frame_number, 0, 0);
    glMatrixMode(GL_MODELVIEW);



    только не забудь что тогда надо в glTexCoord2f вместо единичек ставить 1 / frame_width. Плохо это тем что не получится сделать список, но ты его и не делаешь (а надо бы =). Думается можно сделать glScalef(1 / frame_width, 1, 1), а может и не можно, надо проверить =)

    ps никаких "Вы"!

    ---
    ... we are walking on a thin line and you better avoid the risk ...
  • grisme © (13.06.07 10:55) [5]
    можно поизвращаться с текстурными координатами по x :o) если анимацию грузить в одну текстурину, то можно отображать текстуру начиная с т.координаты(по x) = (1/ширина_кадра)*текущий_кадр :o) тада кадры нумеруются с нуля =^^=
    а вторая координата x будет соответственно = (1/ширина_кадра)*текущий_кадр + (1/шинина_кадра)
  • MERLIN:) (13.06.07 19:11) [6]
    Посмотри код чегото неработает.
    Сделал картинку из трёх кадров
    Вся картинка 150 х 50
    каждый кадр  50 х 50
    1 - красный квадрат
    2 - зелёный квадрат
    3 - синий квадрат
    На экране вижу квадратик со смешиными в одну три текстуры.
    Чучуть красного, зелёного, синего. Почему так?



    программа
    ...
     sprite.frame_width:= 50;
     sprite.frame_number:= 2;
     sprite.DrawAnim(200,200,50,50,anim);
    ...

    модуль спрайтов

    ...

     TSpriteManager = class
      constructor Create;
     public
      Items : array of TSprite;
      Count : GLuint;
      TexID : uint;
      TexWidth: Integer;
      TexHeight: Integer;
      frame_width, frame_number: integer;

    ...

     end;

    ...

    procedure TSpriteManager.DrawAnim(x, y, w, h: Integer; TexID: Cardinal);
    begin
    glPushMatrix;   // Поместить все дальнейшие действия в матрицу
    glTranslatef(x,y,0);
    glMatrixMode(GL_TEXTURE);
    glTranslatef(frame_width * frame_number, 0, 0);
    glMatrixMode(GL_MODELVIEW);
     glBindTexture(GL_TEXTURE_2D, texID);  // Bind the Texture to the object
     glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
     glEnable( GL_BLEND );
     glBegin(GL_QUADS);
       glTexCoord2f(0.0, 0.0);                         glVertex2f( 0, 0);
       glTexCoord2f(1 / frame_width, 0.0);             glVertex2f( w, 0);
       glTexCoord2f(1 / frame_width, 1 / frame_width); glVertex2f( w, h);
       glTexCoord2f(0.0, 1 / frame_width);             glVertex2f( 0, h);
     glEnd();
    glMatrixMode(GL_TEXTURE);
    glTranslatef(- frame_width * frame_number, 0, 0);
    glMatrixMode(GL_MODELVIEW);
    glPopMatrix;
    end;
    ...

  • grouzd)ev © (13.06.07 23:29) [7]
      glTexCoord2f(0.0, 0.0);                         glVertex2f( 0, 0);
      glTexCoord2f(1 / frame_width, 0.0);             glVertex2f( w, 0);
      glTexCoord2f(1 / frame_width, 1); glVertex2f( w, h);
      glTexCoord2f(0.0, 1);             glVertex2f( 0, h);



    Кроме того может быть проблема с текстурой размерами не-2^n. попробуй 64х256

    ---
    ... we are walking on a thin line and you better avoid the risk ...
  • Хелпер (14.06.07 02:35) [8]

    > MERLIN:)   (13.06.07 19:11) [6]

    Что ты велосипед изобретаешь? В GLScene это давно есть.
    TAnimationSprite.
  • Yashin © (15.06.07 19:45) [9]
    Ну дык и готовые движки есть, зачем новые писать? И вообще все уже кем то сделано зачем тогда что-то придумывать?
  • Хелпер (16.06.07 07:15) [10]

    > Yashin ©   (15.06.07 19:45) [9]
    > Ну дык и готовые движки есть, зачем новые писать?


    Задай этот вопрос самому себе. Зачем ты пишешь свою GLScene?
  • Yashin © (16.06.07 18:42) [11]
    Я уже давно ничего не пишу
  • MERLIN:) (17.06.07 16:34) [12]
    Почему рисуется спрайт задом на перёд.
    Наприммер спрайт:  Игра  
    В программе выглядит: аргИ

    Почему так? Я как то неправильно налаживаю текструру
    Посмотрите код пожалуйста.

     
    procedure TSpriteManager.DrawAnimStatic(x, y, w, h: Integer; AnimCount, Frame:integer; TexID: Cardinal);
    var u:single;
    begin
    glPushMatrix;
    DASCurAnimPos:= Frame mod AnimCount;

     glBindTexture(GL_TEXTURE_2D,TexID);
     glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
     glEnable( GL_BLEND );

    u:=DASCurAnimPos;

    glTranslatef(x,y,0);
    glRotatef(90,0,1,0);
    glBegin(GL_QUADS);
    glNormal3f(0,1,0);
      glTexCoord2f(1/AnimCount*u,0);              glVertex2f(0,0);
      glTexCoord2f(1/AnimCount*u-1/AnimCount,0);  glVertex2f(w-0.5,0);
      glTexCoord2f(1/AnimCount*u-1/AnimCount,1);  glVertex2f(w-0.5,h-0.5);
      glTexCoord2f(1/AnimCount*u,1);              glVertex2f(0,h-0.5);
    glEnd;
    glPopMatrix;
    end;

  • Хелпер (18.06.07 01:32) [13]

    > MERLIN:)   (17.06.07 16:34) [12]


    >   glTexCoord2f(1/AnimCount*u,0);              glVertex2f(0,
    > 0);
    >   glTexCoord2f(1/AnimCount*u-1/AnimCount,0);  glVertex2f(w-
    > 0.5,0);
    >   glTexCoord2f(1/AnimCount*u-1/AnimCount,1);  glVertex2f(w-
    > 0.5,h-0.5);
    >   glTexCoord2f(1/AnimCount*u,1);              glVertex2f(0,
    > h-0.5);


    Местами поменяй glTexCoord2f.

    А лучше возьми GLScene, а не велосипедоизобретательствуй.
  • Еки Батыр(Два Батыра) (19.06.07 14:44) [14]
    мы проходим на тонкую линию и Вы лучше избегаете риска
  • grisme © (19.06.07 16:52) [15]
    начал не с той текстурной координаты ;) частенько приходится подгонять порядок пар текстурных координат ((
 
Конференция "Игры" » Нужно сделать анимацию [Delphi, Windows]
Есть новые Нет новых   [134430   +4][b:0][p:0.002]