====== Importing and Drawing Sprites ====== The SDK makes it easy to bring images into your game after you've [[development:aseprite|exported them]], particularly from Aseprite. This page will go into a bit more detail on how to incorporate the image files into your project and then how to load and draw them in your code. **Warning**: when exporting BMP images from GIMP, make sure to check "Do not write color space information" in the Compatibility options. =====Import===== The 2MB Cartridges have 128 banks of 16KB each, and the SDK scripts are designed to assign image assets to these banks based on the contents of the //assets// folder. Each subfolder of //assets// comprises one of the cartridge banks. Files dropped directly into the //assets// folder are ignored by the import scripts. After adding files to folders inside //assets//, run make import For example, in the games/tanks branch of the SDK there are three assets folders: "font", "gfx", and "music". For these folders the import script outputs [ 'bios8.bmp' ] [ 'countdown.bmp', 'countdown.json', 'exlposion.bmp', 'exlposion.json', 'green_tank.bmp', 'green_tank.json', 'ground.bmp', 'title.bmp' ] [ 'tank_intro.mid' ] In addition these files will be created in src/gen/assets with names based on the subfolders. * font.h * gfx.h * music.h =====Drawing===== Drawing sprites on the GameTank is a two-step process. Before a sprite can be drawn it must be loaded into Sprite RAM. Once it is loaded into one of the sprite banks, it can be drawn either by specifying a rectangular portion of a sprite bank, or by an index into frame data exported by Aseprite. The function //load_spritesheet// takes a pointer to compressed sprite data, the ROM bank number where that data resides, and a sprite bank number to extract the image to. However, you don't actually need to specify the pointer or ROM bank directly. The generated header files, eg. src/gen/gfx if you created a "gfx" folder, provide convenience macros that contain the location of each image file. //Near top of file #include "../gen/assets/gfx.h" ... //During your init process load_spritesheet(&ASSET__gfx__ship_bmp, 0); //Stores the ship graphics in sprite bank 0 load_spritesheet(&ASSET__gfx__bug_bmp, 1); //Stores the bug graphics in sprite bank 1 =====Drawing by rectangle===== Once your graphics are loaded into a sprite bank, you can draw them with //draw_sprite// draw_sprite(X,Y,W,H,GX,GY,RAMBANK); X and Y indicate coordinates on the screen. W and H are the width and height. GX and GY are the coordinates in the source image which you'd use to pick a tile or frame of animation from a sheet. RAMBANK is the bank number that you earlier specified to load_spritesheet. //draw_sprite// is part of the queued drawing API, so you can consecutively call other queued drawing functions and they'll be proeccessed one at a time, in order. When there's no more drawing or computation to do for the current frame, use //await_draw_queue()//, //sleep(1)//, and //flip_pages()// to present your frame to the TV! =====Drawing by frame number===== If you've exported a packed sprite sheet alongside JSON frame data, you can use //draw_sprite_frame//. This function can not only select the rectangle in your sprite sheet from a frame number, it also centers your sprite on the canvas center used in Aseprite and had a parameter for flipping horizontally and/or vertically. void draw_sprite_frame( const Frame *sprite_table, char sprite_table_bank, char x, char y, char frame, char flip, char bank); Referring to the JSON data is similar to referring to the sprite data in //load_spritesheet// and combines the first two arguments into one macro. draw_sprite_frame(&ASSET__gfx__ship_json, ship_x, ship_y, anim_frame, SPRITE_FLIP_NONE, 0);