{"id":31,"date":"2007-01-25T00:32:54","date_gmt":"2007-01-25T02:32:54","guid":{"rendered":"http:\/\/www.neyestrabelli.com\/blog\/2007\/01\/25\/tutorial-pspsdk-movimentacao-de-sprites\/"},"modified":"2007-01-25T00:32:54","modified_gmt":"2007-01-25T02:32:54","slug":"tutorial-pspsdk-movimentacao-de-sprites","status":"publish","type":"post","link":"https:\/\/www.neyestrabelli.com\/blog\/2007\/01\/25\/tutorial-pspsdk-movimentacao-de-sprites\/","title":{"rendered":"Tutorial PSPSDK &#8211; Movimenta\u00e7\u00e3o de Sprites"},"content":{"rendered":"<p>Hoje iremos aprender como trabalhar com SpriteSheets (folha de sprites) no PSPSDK como esta abaixo:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" id=\"image30\" src=\"http:\/\/www.neyestrabelli.com\/blog\/wp-content\/uploads\/2007\/01\/ryu1.jpg\" alt=\"SpriteSheet Ryu\" width=\"391\" height=\"167\" \/><\/p>\n<p>O PSPSDK possui um biblioteca gr\u00e1fica que trabalha com imagens png com canais alpha.<br \/>\nBaixe esta classe de graphics :<\/p>\n<p><a title=\"Classe Graphics\" href=\"http:\/\/www.neyestrabelli.com\/blog\/wp-content\/uploads\/2007\/01\/graphics.rar\" target=\"_blank\" rel=\"noopener noreferrer\"> Graphics<\/a><\/p>\n<p><strong>O que vamos utilizar da Graphics?<\/strong><\/p>\n<p>&#8211; Image*<br \/>\n&#8211; blitAlphaImageToScreen(int sx, int sy, int width, int height, Image* source, int dx, int dy);<\/p>\n<p>Apenas isto, sendo o Image* (ponteiro para o arquivo de imagem), e o blitAlphaImageToScreen (fun\u00e7\u00e3o que ir\u00e1 desenhar na tela a imagem)<\/p>\n<p><!--more--><\/p>\n<p><strong>Vamos ao que interessa:<\/strong><\/p>\n<p>Arquivo <strong>main.c<\/strong> (muito parecido com o hello World)<\/p>\n<pre lang=\"c\">\/*****************************************************\\\nExemplo de movimenta\u00e7\u00e3o PSPSDK\nAutor : Nei Estrabelli\nsite\u00a0 : http:\/\/www.neyestrabelli.com\nV.0.1 - Vers\u00e3o Beta\n\n\\*****************************************************\/\n#include\n\n#include\n\n#include\n\n#include\n\n#include\n\n#include\n\n#include \"graphics.h\"\n#include \"game.h\"\n\nPSP_MODULE_INFO(\"Exemplo de Movimenta\u00e7\u00e3o\", 0, 1, 1);\n\n\/**********Thread PSP**********\/\nint exit_callback(int arg1, int arg2, void *common) {\n\/\/THE NEXT LINE IS NEEDED FOR A CLEAN EXIT\nsceKernelExitGame();\nreturn 0;\n}\n\n\/* Callback thread *\/\nint CallbackThread(SceSize args, void *argp) {\nint cbid;\n\ncbid = sceKernelCreateCallback(\"Exit Callback\", exit_callback, NULL);\nsceKernelRegisterExitCallback(cbid);\n\nsceKernelSleepThreadCB();\n\nreturn 0;\n}\n\n\/* Sets up the callback thread and returns its thread id *\/\nint SetupCallbacks(void) {\nint thid = 0;\n\nthid = sceKernelCreateThread(\"update_thread\", CallbackThread, 0x11, 0xFA0, 0, 0);\nif(thid &gt;= 0) {\nsceKernelStartThread(thid, 0, 0);\n}\n\nreturn thid;\n}\n\/*********FIM Thread PSP**********\/\n\nint main(void)\n{\npspDebugScreenInit();\u00a0 \/\/ iniciamos o debug\nSetupCallbacks();\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ executamos a thread\ninitGraphics();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0 inciiamos gr\u00e1fico\nGame();\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/\u00a0 executamos o jogo\nreturn 0;\n}<\/pre>\n<p>Arquivo <strong>game.c<\/strong><\/p>\n<pre lang=\"c\">\/*****************************************************\\\nExemplo de movimenta\u00e7\u00e3o PSPSDK\nAutor : Nei Estrabelli\nsite\u00a0 : http:\/\/www.neyestrabelli.com\nV.0.1 - Vers\u00e3o Beta\n\n\\*****************************************************\/\n\n#include\n\n#include\n\n#include\n\n#include\n\n#include\n\n#include \"graphics.h\"\n\n#define LIMESQ 0\u00a0\u00a0\u00a0 \/\/definimos o inicio do cenario\n#define LIMDIR 416 \/\/definimos o final do cenario, sendo 480(fim da tela) - 64(largura do personagem)\n\nvoid Game()\n{\nSceCtrlData pad;\u00a0\u00a0\u00a0\u00a0 \/\/ varival necess\u00e1ria para os controles\nint mUpdateCnt = 0;\u00a0 \/\/ variavel para controlar os frames\nint PosX = 170;\u00a0\u00a0\u00a0\u00a0\u00a0 \/\/ posicao inicial do personagem\nint frameX = 64;\u00a0\u00a0\u00a0\u00a0 \/\/ tamanho em pixel da primeira imagem da spriteSheet\nint frameY = 73;\u00a0\u00a0\u00a0\u00a0 \/\/ inicio da segunda linha da spriteSheet\n\n\/\/carregamos a spriteSheet do Ryu\nImage* ryu;\nryu = loadImage(\".\/imagens\/ryu.png\");\n\n\/\/carregamos a imagem de Fundo (cenario do Akuma)\nImage* Fundo;\nFundo = loadImage(\".\/imagens\/fundo.png\");\n\n\/\/aqui \u00e9 onde o jogo ir\u00e1 ficar rodando\nwhile(1){\nmUpdateCnt++; \/\/incrementamos a vari\u00e1vel de controle de frames\nsceCtrlReadBufferPositive(&amp;pad, 1); \/\/ acionamos o buffer de leitura dos controles\n\n\/\/caso seja pressionado Direcional Esquerda\nif (pad.Buttons &amp; PSP_CTRL_LEFT) {\n\/\/indicamos que as sprites andando come\u00e7am do 0 (posi\u00e7\u00e3o inical da spriteSheet)\nframeY = 0;\n\/\/verificamos o limite esquerdo\n\/\/se a posi\u00e7\u00e3o X for menor que LIMESQ ent\u00e3o dizemos que PosX \u00e9 igual a LIMESQ\nif(PosX &lt; LIMESQ) {\nPosX = LIMESQ;\n} else {\n\/\/caso contrario o personagem anda para a esquera\nPosX -= 2;\n}\n\/\/caso seja pressionado Direcional Esquerda\n} else if (pad.Buttons &amp; PSP_CTRL_RIGHT) {\n\/\/indicamos que as sprites andando come\u00e7am do 0 (posi\u00e7\u00e3o inical da spriteSheet)\nframeY = 0;\n\/\/verificamos o limite direito\n\/\/se a posi\u00e7\u00e3o X for maior que LIMESQ ent\u00e3o dizemos que PosX \u00e9 igual a LIMESQ\nif(PosX &gt; LIMDIR) {\nPosX = LIMDIR;\n} else {\n\/\/caso contrario o personagem anda para a direita\nPosX += 2;\n}\n\/\/caso nenhum direcional seja pressionado\n} else {\n\/\/indicamos que as sprites de stand come\u00e7am da altura 73\nframeY = 73;\n}\n\/\/se mUpdateCnt \/ 10 = 0\nif (mUpdateCnt % 10 == 0) {\n\/\/somanos frameX ( 64+64) || 64 = 1\u00aa imagem, 128 = 2\u00aa imagem, etc\nframeX += frameX;\n}\n\/\/se frameX for maior que 512 (tamanho m\u00e1ximo de nossa spriteSheet)\nif(frameX == 512) {\n\/\/reiniciamos o valor para 64\nframeX = 64;\n}\n\n\/*\nblitAlphaImageToScreen(int sx, int sy, int width, int height, Image* source, int dx, int dy);\nsx\u00a0\u00a0\u00a0\u00a0 - limite do retangulo na posi\u00e7\u00e3o horizontal\nsy\u00a0\u00a0\u00a0\u00a0 - inicio do retangulo na posi\u00e7\u00e3o vertical\nwidth\u00a0 - largura da imagem\nheight - altura da imagem\nsource - imagem alocada com a variavel \"Image*\"\ndx\u00a0\u00a0\u00a0\u00a0\u00a0 - posi\u00e7\u00e3o de movimenta\u00e7\u00e3o horizontal( 0 caso n\u00e3o tenha)\ndy\u00a0\u00a0\u00a0\u00a0\u00a0 -\u00a0 posi\u00e7\u00e3o de movimenta\u00e7\u00e3o vertical ( 0 caso n\u00e3o tenha)\n*\/\nblitAlphaImageToScreen(0, 0 , 480, 272, Fundo, 0, 0); \/\/display da imagem de fundo\n\nblitAlphaImageToScreen(frameX, frameY, 64, 73, ryu, PosX, 200); \/\/display do personagem\n\n\/\/fun\u00e7\u00f5es de refresh\nsceDisplayWaitVblankStart();\nflipScreen();\n}\n}<\/pre>\n<p>O codigo est\u00e1 bem comentado, sendo assim acho que n\u00e3o \u00e9 necess\u00e1rio explica\u00e7\u00e3o.<\/p>\n<p>Pack completo com o source + arquivo PBP voc\u00ea pode pegar aqui:<\/p>\n<p><a title=\"Arquivo PBP + source\" href=\"http:\/\/www.neyestrabelli.com\/blog\/wp-content\/uploads\/2007\/01\/Movimentos_src.rar\" target=\"_blank\" rel=\"noopener noreferrer\"> Movimentos + SRC<\/a><br \/>\nPara rodar o PBP \u00e9 necess\u00e1rio Custom firmware (SE ou OE), crie uma pasta dentro da GAME150 e copie o EBOOT.PBP + a pasta de imagens, para rodar na vers\u00e3o 1.50 voc\u00ea pode utilizar o PSPBrew para que ele gere a pasta com % em seu devido lugar.<\/p>\n<p>Este exemplo de movimenta\u00e7\u00e3o ficar\u00e1 desta maneira:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" id=\"image32\" src=\"http:\/\/www.neyestrabelli.com\/blog\/wp-content\/uploads\/2007\/01\/fundo1.jpg\" alt=\"Movimenta\u00e7\u00e3o PSPSDK\" width=\"375\" height=\"212\" \/><\/p>\n<p>Bom divertimento.<\/p>\n<p>Qualquer d\u00favida sobre o exemplo comente abaixo.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoje iremos aprender como trabalhar com SpriteSheets (folha de sprites) no PSPSDK como esta abaixo: O PSPSDK possui um biblioteca gr\u00e1fica que trabalha com imagens png com canais alpha. Baixe esta classe de graphics : Graphics O que vamos utilizar da Graphics? &#8211; Image* &#8211; blitAlphaImageToScreen(int sx, int sy, int width, int height, Image* source, [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[1],"tags":[141],"class_list":["post-31","post","type-post","status-publish","format-standard","hentry","category-uncategorized","tag-pspsdk-tutorial-development-sprite"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.neyestrabelli.com\/blog\/wp-json\/wp\/v2\/posts\/31","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.neyestrabelli.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.neyestrabelli.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.neyestrabelli.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.neyestrabelli.com\/blog\/wp-json\/wp\/v2\/comments?post=31"}],"version-history":[{"count":0,"href":"https:\/\/www.neyestrabelli.com\/blog\/wp-json\/wp\/v2\/posts\/31\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.neyestrabelli.com\/blog\/wp-json\/wp\/v2\/media?parent=31"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.neyestrabelli.com\/blog\/wp-json\/wp\/v2\/categories?post=31"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.neyestrabelli.com\/blog\/wp-json\/wp\/v2\/tags?post=31"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}