![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Нужно сделать анимацию [Delphi, Windows]
MERLIN:) © (2007-06-12 19:11:00)Как сделать анимимированый спрайт.
Нарисовал спрайт так.
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;
А как рисовать анимированый спрайт.
Что для этого надо сделать ? :)
grisme (2007-06-19 16:52:00) [1]начал не с той текстурной координаты ;) частенько приходится подгонять порядок пар текстурных координат ((
Еки Батыр(Два Батыра) (2007-06-19 14:44:00) [2]мы проходим на тонкую линию и Вы лучше избегаете риска
Хелпер (2007-06-18 01:32:00) [3]
> 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, а не велосипедоизобретательствуй.
MERLIN:) (2007-06-17 16:34:00) [4]Почему рисуется спрайт задом на перёд.
Наприммер спрайт: Игра
В программе выглядит: аргИ
Почему так? Я как то неправильно налаживаю текструру
Посмотрите код пожалуйста.
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;
Yashin (2007-06-16 18:42:00) [5]Я уже давно ничего не пишу
Хелпер (2007-06-16 07:15:00) [6]
> Yashin © (15.06.07 19:45) [9]
> Ну дык и готовые движки есть, зачем новые писать?
Задай этот вопрос самому себе. Зачем ты пишешь свою GLScene?
Yashin (2007-06-15 19:45:00) [7]Ну дык и готовые движки есть, зачем новые писать? И вообще все уже кем то сделано зачем тогда что-то придумывать?
Хелпер (2007-06-14 02:35:00) [8]
> MERLIN:) (13.06.07 19:11) [6]
Что ты велосипед изобретаешь? В GLScene это давно есть.
TAnimationSprite.
grouzd)ev (2007-06-13 23:29:00) [9]
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 ...
MERLIN:) (2007-06-13 19:11:00) [10]Посмотри код чегото неработает.
Сделал картинку из трёх кадров
Вся картинка 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;
...
grisme (2007-06-13 10:55:00) [11]можно поизвращаться с текстурными координатами по x :o) если анимацию грузить в одну текстурину, то можно отображать текстуру начиная с т.координаты(по x) = (1/ширина_кадра)*текущий_кадр :o) тада кадры нумеруются с нуля =^^=
а вторая координата x будет соответственно = (1/ширина_кадра)*текущий_кадр + (1/шинина_кадра)
grouzd)ev (2007-06-13 09:37:00) [12]ну допустим если 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 ...
Хелпер (2007-06-13 05:34:00) [13]
> MERLIN:) (12.06.07 19:11)
>
> Как сделать анимимированый спрайт.
GLScene TAnimationSprite.
MERLIN:) (2007-06-13 01:45:00) [14]Я тоже думал что надо как то смещать но как это сделать.
Вы наверное делали что то подобно можете подробнее объяснить. ?
grouzd)ev (2007-06-13 00:20:00) [15]Нарисовать спрайт со следющим кадром (либо наложить другую текстуру, либо - если все кадры нарисованы на одной - сместить ее)
---
... we are walking on a thin line and you better avoid the risk ...