Curso completo de DarkGdk
Gameprog - Escola de programação de jogos digitais
Contato: gameprog.br@gmail.com
Fase 8.2

index << >>



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()

index << >>


Produzido por Gameprog: Jair Pereira - Setembro/2013 © gameprog.br@gmail.com http://www.gameprog.com.br http://www.nucleoararat.com.br