Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Игры";
Текущий архив: 2009.09.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.005 c
2-1247149247
Varkan
2009-07-09 18:20
2009.09.13
Поменять местами узлы в TreeView


15-1247513346
Тима
2009-07-13 23:29
2009.09.13
Требуется помощь в написании программы


2-1246981519
sdc-alex
2009-07-07 19:45
2009.09.13
Обработка БД Access 2000


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


4-1217576481
kyn66
2008-08-01 11:41
2009.09.13
Какой установлен принтер ?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский