git.y1.nz

gbdk-2020

GameBoy Development Kit
download: https://git.y1.nz/archives/gbdk.tar.gz
README | Files | Log | Refs | LICENSE

gbdk-lib/include/msx/metasprites.h

      1 /** @file sms/metasprites.h
      2 
      3     # Metasprite support
      4 
      5     A metasprite is a larger sprite made up from a
      6     collection of smaller individual hardware sprites.
      7     Different frames of the same metasprites can share
      8     tile data.
      9 
     10     See the main @ref metasprite_main_docs "metasprite docs"
     11     under the game Boy platform for additional details.
     12 */
     13 
     14 #ifndef _METASPRITES_H_INCLUDE
     15 #define _METASPRITES_H_INCLUDE
     16 
     17 #include <msx/hardware.h>
     18 #include <types.h>
     19 #include <stdint.h>
     20 
     21 /** Metasprite sub-item structure
     22     @param dy        (int8_t)  Y coordinate of the sprite relative to the metasprite origin (pivot)
     23     @param dx        (int8_t)  X coordinate of the sprite relative to the metasprite origin (pivot)
     24     @param dtile     (uint8_t) Start tile relative to the metasprites own set of tiles
     25     @param props     (uint8_t) Property Flags
     26 
     27     Metasprites are built from multiple metasprite_t items (one for each sub-sprite)
     28     and a pool of tiles they reference. If a metasprite has multiple frames then each
     29     frame will be built from some number of metasprite_t items (which may vary based
     30     on how many sprites are required for that particular frame).
     31 
     32     A metasprite frame is terminated with a {metasprite_end} entry.
     33 */
     34 typedef struct metasprite_t {
     35     int8_t  dy, dx;
     36     uint8_t dtile;
     37     uint8_t props;
     38 } metasprite_t;
     39 
     40 #define metasprite_end -128
     41 #define METASPR_ITEM(dy,dx,dt,a) {(dy),(dx),(dt),(a)}
     42 #define METASPR_TERM {metasprite_end}
     43 
     44 extern const void * __current_metasprite;
     45 extern uint8_t __current_base_tile;
     46 extern uint8_t __render_shadow_OAM;
     47 
     48 
     49 static uint8_t __move_metasprite(uint8_t id, uint8_t x, uint8_t y) Z88DK_CALLEE PRESERVES_REGS(iyh, iyl);
     50 static void __hide_metasprite(uint8_t id) Z88DK_FASTCALL PRESERVES_REGS(iyh, iyl);
     51 
     52 /**
     53  * Hides all hardware sprites in range from <= X < to
     54  * @param from start OAM index
     55  * @param to finish OAM index
     56  */
     57 void hide_sprites_range(uint8_t from, uint8_t to) Z88DK_CALLEE PRESERVES_REGS(iyh, iyl);
     58 
     59 /** Moves metasprite to the absolute position x and y
     60 
     61     @param metasprite   Pointer to the first struct of the metasprite (for the desired frame)
     62     @param base_tile    Number of the first tile where the metasprite's tiles start
     63     @param base_prop    Base sprite property flags (unused on this platform)
     64     @param base_sprite  Number of the first hardware sprite to be used by the metasprite
     65     @param x            Absolute x coordinate of the sprite
     66     @param y            Absolute y coordinate of the sprite
     67 
     68     Moves __metasprite__ to the absolute position __x__ and __y__
     69     (with __no flip__ on the X or Y axis). Hardware sprites are
     70     allocated starting from __base_sprite__, using tiles
     71     starting from __base_tile__.
     72 
     73     Sets:
     74     \li __current_metasprite = metasprite;
     75     \li __current_base_tile = base_tile;
     76 
     77     @return Number of hardware sprites used to draw this metasprite
     78  */
     79 inline uint8_t move_metasprite_ex(const metasprite_t * metasprite, uint8_t base_tile, uint8_t base_prop, uint8_t base_sprite, uint8_t x, uint8_t y) {
     80     base_prop;
     81     __current_metasprite = metasprite;
     82     __current_base_tile = base_tile;
     83     return __move_metasprite(base_sprite, x, y);
     84 }
     85 
     86 /** Obsolete
     87 */
     88 inline uint8_t move_metasprite(const metasprite_t * metasprite, uint8_t base_tile, uint8_t base_sprite, uint8_t x, uint8_t y) {
     89     __current_metasprite = metasprite;
     90     __current_base_tile = base_tile;
     91     return __move_metasprite(base_sprite, x, y);
     92 }
     93 
     94 
     95 /** Hides a metasprite from the screen
     96 
     97     @param metasprite    Pointer to first struct of the desired metasprite frame
     98     @param base_sprite   Number of hardware sprite to start with
     99 
    100     Sets:
    101     \li __current_metasprite = metasprite;
    102 
    103  **/
    104 inline void hide_metasprite(const metasprite_t * metasprite, uint8_t base_sprite) {
    105     __current_metasprite = metasprite;
    106     __hide_metasprite(base_sprite);
    107 }
    108 
    109 #endif

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.