-
Как сделать анимимированый спрайт. Нарисовал спрайт так.
procedure TSprite.Draw(x, y, w, h: Integer; TexID: Cardinal);
begin
glPushMatrix;
glTranslatef(x,y,0);
glBindTexture(GL_TEXTURE_2D, texID); 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;
А как рисовать анимированый спрайт. Что для этого надо сделать ? :)
-
Нарисовать спрайт со следющим кадром (либо наложить другую текстуру, либо - если все кадры нарисованы на одной - сместить ее)
--- ... we are walking on a thin line and you better avoid the risk ...
-
Я тоже думал что надо как то смещать но как это сделать. Вы наверное делали что то подобно можете подробнее объяснить. ?
-
> MERLIN:) (12.06.07 19:11) > > Как сделать анимимированый спрайт.
GLScene TAnimationSprite.
-
ну допустим если 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 ...
-
можно поизвращаться с текстурными координатами по x :o) если анимацию грузить в одну текстурину, то можно отображать текстуру начиная с т.координаты(по x) = (1/ширина_кадра)*текущий_кадр :o) тада кадры нумеруются с нуля =^^= а вторая координата x будет соответственно = (1/ширина_кадра)*текущий_кадр + (1/шинина_кадра)
-
Посмотри код чегото неработает. Сделал картинку из трёх кадров Вся картинка 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; ...
-
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:) (13.06.07 19:11) [6]
Что ты велосипед изобретаешь? В GLScene это давно есть. TAnimationSprite.
-
Ну дык и готовые движки есть, зачем новые писать? И вообще все уже кем то сделано зачем тогда что-то придумывать?
-
> Yashin © (15.06.07 19:45) [9] > Ну дык и готовые движки есть, зачем новые писать?
Задай этот вопрос самому себе. Зачем ты пишешь свою GLScene?
-
Я уже давно ничего не пишу
-
Почему рисуется спрайт задом на перёд. Наприммер спрайт: Игра В программе выглядит: аргИ Почему так? Я как то неправильно налаживаю текструру Посмотрите код пожалуйста.
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;
-
> 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, а не велосипедоизобретательствуй.
-
мы проходим на тонкую линию и Вы лучше избегаете риска
-
начал не с той текстурной координаты ;) частенько приходится подгонять порядок пар текстурных координат ((
|