Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.09.13;
Скачать: CL | DM;

Вниз

Нужно сделать анимацию   Найти похожие ветки 

 
MERLIN:)   (2007-06-12 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 ©   (2007-06-13 00:20) [1]

Нарисовать спрайт со следющим кадром (либо наложить другую текстуру, либо - если все кадры нарисованы на одной - сместить ее)

---
... we are walking on a thin line and you better avoid the risk ...


 
MERLIN:)   (2007-06-13 01:45) [2]

Я тоже думал что надо как то смещать но как это сделать.
Вы наверное делали что то подобно можете подробнее объяснить. ?


 
Хелпер   (2007-06-13 05:34) [3]


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


GLScene TAnimationSprite.


 
grouzd)ev ©   (2007-06-13 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 ©   (2007-06-13 10:55) [5]

можно поизвращаться с текстурными координатами по x :o) если анимацию грузить в одну текстурину, то можно отображать текстуру начиная с т.координаты(по x) = (1/ширина_кадра)*текущий_кадр :o) тада кадры нумеруются с нуля =^^=
а вторая координата x будет соответственно = (1/ширина_кадра)*текущий_кадр + (1/шинина_кадра)


 
MERLIN:)   (2007-06-13 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 ©   (2007-06-13 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 ...


 
Хелпер   (2007-06-14 02:35) [8]


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

Что ты велосипед изобретаешь? В GLScene это давно есть.
TAnimationSprite.


 
Yashin ©   (2007-06-15 19:45) [9]

Ну дык и готовые движки есть, зачем новые писать? И вообще все уже кем то сделано зачем тогда что-то придумывать?


 
Хелпер   (2007-06-16 07:15) [10]


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


Задай этот вопрос самому себе. Зачем ты пишешь свою GLScene?


 
Yashin ©   (2007-06-16 18:42) [11]

Я уже давно ничего не пишу


 
MERLIN:)   (2007-06-17 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;


 
Хелпер   (2007-06-18 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, а не велосипедоизобретательствуй.


 
Еки Батыр(Два Батыра)   (2007-06-19 14:44) [14]

мы проходим на тонкую линию и Вы лучше избегаете риска


 
grisme ©   (2007-06-19 16:52) [15]

начал не с той текстурной координаты ;) частенько приходится подгонять порядок пар текстурных координат ((



Страницы: 1 вся ветка

Текущий архив: 2009.09.13;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.013 c
1-1215107303
Zheksik
2008-07-03 21:48
2009.09.13
Как провести линию на компоненте фигура(Shape)?


15-1247500660
Kris_
2009-07-13 19:57
2009.09.13
Использование скриптов в программе


15-1248038747
Германн
2009-07-20 01:25
2009.09.13
Если кто знает что-то подобное?


1-1214553701
LonelyWolf
2008-06-27 12:01
2009.09.13
Delphi+WinAPI (threads) - синхронизация переменных


11-1205672007
Trible
2008-03-16 15:53
2009.09.13
Вопрос по KOLmdvXLGrid