示例#1
0
文件: gfx.c 项目: CalcMan/model-t
void
gfx_draw_str(const char *str, int n, int x, int y)
{
  int xoff = 0;

  if (n == -1)
    n = INT_MAX;

  while ((*str != 0) &&
         (n-- > 0)) {
    char c = *str++;
    const glyph_t* g = font_find_glyph(ctx->cfont, c);
    gfx_draw_glyph(g, x + xoff + g->xoffset, y + g->yoffset);
    xoff += g->advance;
  }
}
示例#2
0
static void draw_map_non_opengl(struct map * map, int topleft_x, int topleft_y, int width, int height, enum MOVE_DIRECTION ameba_state)
{
    bool stop_diamond_blink; /* If true, then stop the diamond blinking for diamonds that are currently blinking. */

    if(gfx_get_frame(MAP_DIAMOND) == gfx_get_maxframe(MAP_DIAMOND) - 1)
        stop_diamond_blink = true;
    else
        stop_diamond_blink = false;

    gfx_set_current_glyph_set(map->glyph_set);

    for(int y = 0 - 1; y < height; y++)
        for(int x = 0 - 1; x < width; x++)
        {
            int dx, dy;
            char m;

            dx = topleft_x + x * 24 + map->map_fine_x;
            dy = topleft_y + y * 24 + map->map_fine_y;

            if(map->map_x + x >= 0 && map->map_x + x < map->width &&
                    map->map_y + y >= 0 && map->map_y + y < map->height)
            {
                m = map->data[map->map_x + x + (map->map_y + y) * map->width];
            }
            else
                m = MAP_ILLEGAL;

            switch((enum MAP_GLYPH) m)
            {
            case MAP_SMOKE2:
                gfx_draw_glyph_frame(dx, dy, MAP_SMOKE, MOVE_NONE, 0);
                break;
            case MAP_SMOKE1:
                gfx_draw_glyph_frame(dx, dy, MAP_SMOKE, MOVE_NONE, 1);
                break;
            case MAP_EXTRA_LIFE_ANIM:
            case MAP_SMOKE:
            case MAP_PLAYER_ARMOUR0:
            case MAP_PLAYER_ARMOUR1:
            case MAP_PLAYER_ARMOUR2:
                break;
            case MAP_BORDER:
            case MAP_BRICK:
                gfx_draw_glyph(dx, dy, MAP_BRICK, MOVE_NONE);
                break;
            case MAP_BRICK_MORPHER:
                if(map->in_editor == true || map->morpher_is_on)
                    gfx_draw_glyph(dx, dy, MAP_BRICK_MORPHER, MOVE_NONE);
                else
                    gfx_draw_glyph(dx, dy, MAP_BRICK, MOVE_NONE);
                break;
            case MAP_BRICK_EXPANDING:
                if(map->in_editor == true)
                    gfx_draw_glyph(dx, dy, MAP_BRICK_EXPANDING, MOVE_NONE);
                else
                    gfx_draw_glyph(dx, dy, MAP_BRICK, MOVE_NONE);
                break;
            case MAP_BRICK_UNBREAKABLE:
                gfx_draw_glyph(dx, dy, MAP_BRICK_UNBREAKABLE, MOVE_NONE);
                break;
            case MAP_EMPTY:
                if(map->extra_life_anim > 0)
                    gfx_draw_glyph(dx, dy, MAP_EXTRA_LIFE_ANIM, MOVE_NONE);
                else
                    gfx_draw_glyph(dx, dy, MAP_EMPTY, MOVE_NONE);
                break;
            case MAP_ILLEGAL:
                if(map->background_type == 0)
                    gfx_draw_glyph(dx, dy, MAP_ILLEGAL, MOVE_NONE);
                else
                    gfx_draw_glyph(dx, dy, MAP_EMPTY, MOVE_NONE);
                break;
            case MAP_SAND:
                gfx_draw_glyph(dx, dy, MAP_SAND, MOVE_NONE);
                break;
            case MAP_BOULDER:
            case MAP_BOULDER_FALLING:
                gfx_draw_glyph(dx, dy, MAP_BOULDER, MOVE_NONE);
                break;
            case MAP_DIAMOND:
            case MAP_DIAMOND_FALLING:
            {
                enum MOVE_DIRECTION d;

                d = map->move_directions[map->map_x + x + (map->map_y + y) * map->width];
                gfx_draw_glyph(dx, dy, MAP_DIAMOND, d);
                if(stop_diamond_blink)
                    map->move_directions[map->map_x + x + (map->map_y + y) * map->width] = MOVE_NONE;
            }
            break;
            case MAP_PLAYER:
            {
                enum MAP_GLYPH g;
                int mdir;

                if(map->in_editor == false)
                {
                    if(map->girl->mob->armour == 0)
                        g = MAP_PLAYER_ARMOUR0;
                    else if(map->girl->mob->armour == 1)
                        g = MAP_PLAYER_ARMOUR1;
                    else /* if(map->girl->mob->armour == 2)*/
                        g = MAP_PLAYER_ARMOUR2;

                    if(map->girl->mob->direction != MOVE_NONE || map->girl->mob->animation == 0)
                        mdir = map->girl->mob->direction;
                    else
                    {
                        switch(map->girl->mob->animation)
                        {
                        default:
                        case 1:
                            mdir = MOVE_NONE + 1;
                            break;
                        case 2:
                            mdir = MOVE_DOWN;
                            break;
                        }
                    }
                }
                else
                {
                    g = MAP_PLAYER_ARMOUR2;
                    mdir = MOVE_NONE;
                }
                gfx_draw_glyph(dx, dy, g, mdir);
            }
            break;
            case MAP_AMEBA:
                gfx_draw_glyph(dx, dy, MAP_AMEBA, ameba_state);
                break;
            case MAP_SLIME:
                gfx_draw_glyph(dx, dy, MAP_SLIME, MOVE_UP);
                break;
            case MAP_ENEMY1:
                gfx_draw_glyph(dx, dy, MAP_ENEMY1, MOVE_NONE);
                break;
            case MAP_ENEMY2:
                gfx_draw_glyph(dx, dy, MAP_ENEMY2, MOVE_NONE);
                break;
            case MAP_EXIT_LEVEL:
                gfx_draw_glyph(dx, dy, MAP_EXIT_LEVEL, MOVE_NONE);
                break;
            case MAP_TREASURE:
                gfx_draw_glyph(dx, dy, MAP_TREASURE, MOVE_NONE);
                break;
            case MAP_SIZEOF_:
                break;
            }
        }
}