Curso completo de DarkGdk
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 8.2
08.2 Manipulando sprites
1. Criando sprites
dbSprite (nSprite, xpos, ypos, nImagem);
void dbSprite ( int iID, int iX, int iY, int iImage );
Este comando cria uma sprite associando uma imagem e posição inicial à
sprite criada.O argumento nSprite é a referência numérica para posterior
manipulação da sprite; (xpos, ypos) é a posição inicial da sprite.
nImagem representa uma imagem na memória que foi carregada com dbLoadImage()
ou obtida através de um recorte de tela via dbGetImage();
Você pode realizar uma animação já com essa função chamando-a diversas vezes
em posições diferentes ou utilizando diferentes imagens.
Exemplo:
int xcol, ylin, nId, nImg;
xcol = 320; ylin = 240;
nId = 1; nImg = 1;
dbLoadImage ("c:\\gameprog\\gdkmedia\\bitmap\\badboy_br.png",nImg);
dbSprite (nId, xcol, ylin, nImg);
2. Movendo sprites
Basicamente para mover as sprites você só precisa repetir a chamada de
funções que reposicionam a sprite com coordenadas diferentes. Veja abaixo
outras funções que posicionam a sprite na tela.
dbPasteSprite (nSprite,xcol, ylin);
void dbPasteSprite( int iID, int iX, int iY );
Esta função cola a sprite na posição especificada.
Exemplo: dbPasteSprite (1, 320, 240);
---------------------------------------------------------------------------
dbOffsetSprite (nSprite, dx, dy );
void dbOffsetSprite ( int iID, int iXOffset, int iYOffset );
Esta função reposiciona a sprite relativamente à sua posição inicial.
(dx, dy) representa o espaçamento relativo dado nos eixos xy.
Exemplo:
if (dbDownKey()==1) dbOffsetSprite (2,
dbSpriteOffsetX(2), dbSpriteOffsetY(2)-2 );
O exemplo acima ilustra uma das melhores maneiras de usar a função
dbOffsetSprite() que é utilizá-la em conjunto com dbSpriteOffset[XY]()
que retornam o valor de dx e dy. Veja que obtemos o deslocamento atual
e movemos a sprite por somar ou reduzir um valor fixo a este valor.
---------------------------------------------------------------------------
ndx = dbSpriteOffsetX ( nSprite ); ndy = dbSpriteOffsetY ( nSprite );
int dbSpriteOffsetX( int iID ); int dbSpriteOffsetY ( int iID );
Estas duas funções dbSpriteOffsetX() e dbSpriteOffsetY() retornam o valor
do deslocamento respectivo aos eixos x e y referente ao posicionamento
inicial da sprite.
Veja o exemplo abaixo que ilustra a movimentação da sprite utilizando-se
as setas do teclado:
if (dbDownKey()==1)
dbOffsetSprite (1,dbSpriteOffsetX(2), dbSpriteOffsetY(1)-2);
if (dbUpKey()==1)
dbOffsetSprite (1,dbSpriteOffsetX(2),dbSpriteOffsetY(1)+2);
if (dbRightKey()==1)
dbOffsetSprite (1,dbSpriteOffsetX(2)-2 ,dbSpriteOffsetY(1));
if (dbLeftKey()==1)
dbOffsetSprite (2,dbSpriteOffsetX(2)+2,dbSpriteOffsetY(1));
---------------------------------------------------------------------------
xcol = dbSpriteX ( nSprite ); ylin = dbSpritetY ( nSprite );
int dbSpriteX( int iID ); int dbSpriteY ( int iID );
Estas duas funções dbSpriteX() e dbSpriteY() retornam o valor
da posição da sprite respectivo aos eixos x e y.
Exemplo:
xcol = dbSpriteX(1);
ylin = dbSpriteY(1);
---------------------------------------------------------------------------
2.1 Movimento angular
O movimento angular permite que uma sprite se mova livremente em qualquer
direção. Selecionamos o angulo e na sequência movemos a sprite. Fazemos
isso com as funções dbRotateSprite() e dbMoveSprite().
dbRotateSprite ( nSprite, nAngulo);
void dbRotateSprite ( int iID, float fRotate );
Esta função rotaciona a sprite para a direção especificada em graus.
Ex.: dbRotateSprite (1, 45.0f);
---------------------------------------------------------------------------
dbMoveSprite (nSprite, nVelocidade);
void dbMoveSprite( int iID, float velocity );
Esta função movimenta a sprite na velocidade determinada por nVelocidade.
A direção do movimento é dada pela função dbRotateSprite(). Se nVelocidade
for negativo o movimento é um retrocesso.
Ex.: dbMoveSprite (1, 2.0f);
---------------------------------------------------------------------------
Veja agora o nosso programa que ilustra claramente os efeitos das funções
estudadas neste tópico:

// movesprite.cpp
// Esse programa mostra como movimentar as sprites
#include "DarkGDK.h"
// Protótipo das funções
void initsys(); // inicializa o sistema
void tst_sprite(); // Movimenta a sprite
// termina a aplicação se igual a 1
int terminar_app = 0;
// Memória para exibição de texto
char sinfo[255];
// Coordenadas (xcol,ylin)= posição (dx,dy)= deslocamento
int xcol = 320; int ylin = 240;
int dx = 0; int dy = 0;
// Direção do movimento
float angulo = 0.0f;
// Flags de movimentação
bool modo_linear = false;
bool modo_angular = true;
bool modo_mover = modo_angular;
// ----------------------------------------------------------------------------
void DarkGDK ( void ) {
// Começo da aplicação DarkGdk
initsys();
// Cria uma sprite #1 com a imagem #1 e coloca-a em (xcol,ylin)
dbLoadImage ("c:\\gameprog\\gdkmedia\\bitmap\\badboy_br.png",1);
dbSprite (1, xcol, ylin, 1);
while ( LoopGDK ( ) ) {
tst_sprite();
if (terminar_app == 1) return;
dbSync ( );
} // fim do while
return;
} // fim da função: DarkGDK
// ----------------------------------------------------------------------------
void initsys() {
// Esta função inicializa o sistema
dbSyncOn( );
dbInk (0x0000FF, 0xFFFFFF);
dbBackdropColor(0xFFFFFF);
dbSetWindowTitle("movesprite.cpp");
dbSetTextOpaque();
} // fim da função: initsys()
// ----------------------------------------------------------------------------
void tst_sprite() {
// Tecla espaço inverte movimentação
if (dbSpaceKey() == 1) modo_mover = !modo_mover;
// Movimentação linear
if (modo_mover == modo_linear)
{
dbSetWindowTitle("movesprite.cpp - modo linear");
dbCircle(xcol, ylin, 10);
if (dbDownKey()==1)
dbOffsetSprite (1,dbSpriteOffsetX(1), dbSpriteOffsetY(1)-2);
if (dbUpKey()==1)
dbOffsetSprite (1,dbSpriteOffsetX(1),dbSpriteOffsetY(1)+2);
if (dbRightKey()==1)
dbOffsetSprite (1,dbSpriteOffsetX(1)-2 ,dbSpriteOffsetY(1));
if (dbLeftKey()==1)
dbOffsetSprite (1,dbSpriteOffsetX(1)+2,dbSpriteOffsetY(1));
} // endif - fim do movimento linear
// Movimentação movimentação angular
if (modo_mover == modo_angular)
{
dbSetWindowTitle("movesprite.cpp - modo angular");
dbCircle(xcol, ylin, 10);
if (dbUpKey() == 1) dbMoveSprite (1,2.0f);
if (dbDownKey() == 1) dbMoveSprite (1,-2.0f);
if (dbRightKey() == 1)
{
angulo = angulo + 5;
dbRotateSprite(1, angulo);
} // endif - rightkey
if (dbLeftKey() == 1)
{
angulo = angulo - 5;
dbRotateSprite(1, angulo);
} // endif: leftkey
}// endif - movimento angular
if (dbMouseClick() == 2) terminar_app = 1;
// Mostra coordenadas na tela
dx = dbSpriteOffsetX(1);
dy = dbSpriteOffsetY(1);
xcol = dbSpriteX(1);
ylin = dbSpriteY(1);
sprintf (sinfo, "(dx:%d, dy:%d) (xcol:%d, ylin: %d) Angulo: %dº",
dx, dy, xcol, ylin, (int) angulo);
dbText (10,10, sinfo);
} // endfunction tst_sprite()