static void allegro_render_element(T3F_GUI * pp, int i, bool hover) { int sx, sy; if(hover) { sx = -pp->element[i].sx * 2; sy = -pp->element[i].sy * 2; } else { sx = -pp->element[i].sx; sy = -pp->element[i].sy; } switch(pp->element[i].type) { case T3F_GUI_ELEMENT_TEXT: { if(pp->element[i].flags & T3F_GUI_ELEMENT_SHADOW) { if(!(pp->element[i].flags & T3F_GUI_ELEMENT_AUTOHIDE) || t3f_gui_check_hover_y(pp, i, t3f_gui_hover_y)) { if(pp->element[i].flags & T3F_GUI_ELEMENT_CENTRE) { al_draw_text((ALLEGRO_FONT *)pp->element[i].aux_data, al_map_rgba_f(0.0, 0.0, 0.0, 0.5), pp->ox + pp->element[i].ox, pp->oy + pp->element[i].oy, ALLEGRO_ALIGN_CENTRE, (char *)pp->element[i].data); al_draw_text((ALLEGRO_FONT *)pp->element[i].aux_data, pp->element[i].color, pp->ox + pp->element[i].ox + sx, pp->oy + pp->element[i].oy + sy, ALLEGRO_ALIGN_CENTRE, (char *)pp->element[i].data); } else { al_draw_text((ALLEGRO_FONT *)pp->element[i].aux_data, al_map_rgba_f(0.0, 0.0, 0.0, 0.5), pp->ox + pp->element[i].ox, pp->oy + pp->element[i].oy, 0, (char *)pp->element[i].data); al_draw_text((ALLEGRO_FONT *)pp->element[i].aux_data, pp->element[i].color, pp->ox + pp->element[i].ox + sx, pp->oy + pp->element[i].oy + sy, 0, (char *)pp->element[i].data); } } } else { if(!(pp->element[i].flags & T3F_GUI_ELEMENT_AUTOHIDE) || t3f_gui_check_hover_y(pp, i, t3f_gui_hover_y)) { if(pp->element[i].flags & T3F_GUI_ELEMENT_CENTRE) { al_draw_text((ALLEGRO_FONT *)pp->element[i].aux_data, pp->element[i].color, pp->ox + pp->element[i].ox + sx, pp->oy + pp->element[i].oy + sy, ALLEGRO_ALIGN_CENTRE, (char *)pp->element[i].data); } else { al_draw_text((ALLEGRO_FONT *)pp->element[i].aux_data, pp->element[i].color, pp->ox + pp->element[i].ox + sx, pp->oy + pp->element[i].oy + sy, 0, (char *)pp->element[i].data); } } } break; } case T3F_GUI_ELEMENT_IMAGE: { if(pp->element[i].flags & T3F_GUI_ELEMENT_SHADOW) { if(pp->element[i].flags & T3F_GUI_ELEMENT_CENTRE) { if(pp->element[i].data) { al_draw_tinted_bitmap((ALLEGRO_BITMAP *)(pp->element[i].data), al_map_rgba_f(0.0, 0.0, 0.0, 0.5), pp->ox + pp->element[i].ox - al_get_bitmap_width(((ALLEGRO_BITMAP *)(pp->element[i].data))) / 2, pp->oy + pp->element[i].oy - al_get_bitmap_width(((ALLEGRO_BITMAP *)(pp->element[i].data))) / 2, 0); al_draw_bitmap((ALLEGRO_BITMAP *)(pp->element[i].data), pp->ox + pp->element[i].ox - al_get_bitmap_width(((ALLEGRO_BITMAP *)(pp->element[i].data))) / 2 + sx, pp->oy + pp->element[i].oy - al_get_bitmap_width(((ALLEGRO_BITMAP *)(pp->element[i].data))) / 2 + sy, 0); } } else { if(pp->element[i].data) { al_draw_tinted_bitmap((ALLEGRO_BITMAP *)(pp->element[i].data), al_map_rgba_f(0.0, 0.0, 0.0, 0.5), pp->ox + pp->element[i].ox, pp->oy + pp->element[i].oy, 0); al_draw_bitmap((ALLEGRO_BITMAP *)(pp->element[i].data), pp->ox + pp->element[i].ox + sx, pp->oy + pp->element[i].oy + sy, 0); } } } else { if(pp->element[i].flags & T3F_GUI_ELEMENT_CENTRE) { if(pp->element[i].data) { al_draw_bitmap((ALLEGRO_BITMAP *)(pp->element[i].data), pp->ox + pp->element[i].ox - al_get_bitmap_width(((ALLEGRO_BITMAP *)(pp->element[i].data))) / 2 + sx, pp->oy + pp->element[i].oy - al_get_bitmap_width(((ALLEGRO_BITMAP *)(pp->element[i].data))) / 2 + sy, 0); } } else { if(pp->element[i].data) { al_draw_bitmap((ALLEGRO_BITMAP *)(pp->element[i].data), pp->ox + pp->element[i].ox + sx, pp->oy + pp->element[i].oy + sy, 0); } } } break; } default: { break; } } }
void Render::theme() { al_clear_to_color(al_map_rgb(0, 65, 34)); mapbg(); if((int)gamedata->player.aim_x > 0) al_draw_scaled_rotated_bitmap(bitmaps[PLAYER], 23, 2, GAME_WIDTH/2, GAME_HEIGHT/2, -1, 1, 0, 0); if((int)gamedata->player.aim_x <= 0) al_draw_scaled_rotated_bitmap(bitmaps[PLAYER], 13, 2, GAME_WIDTH/2, GAME_HEIGHT/2, 1, 1, 0, 0); double angle = atan2(-gamedata->player.aim_y, gamedata->player.aim_x); if((int)gamedata->player.aim_x > 0) al_draw_scaled_rotated_bitmap(bitmaps[GUN], 21, 19, GAME_WIDTH/2 + 2, GAME_HEIGHT/2 + 17, -1, 1, -angle, 0); if((int)gamedata->player.aim_x <= 0) al_draw_scaled_rotated_bitmap(bitmaps[GUN], 21, 19, GAME_WIDTH/2 + 8, GAME_HEIGHT/2 + 17, 1, 1, -angle + 3.14159, 0); // draw bullets for(unsigned int i = 0; i < gamedata->player.bullets.size(); i++) { al_draw_scaled_rotated_bitmap(bitmaps[BULLET], 0, 0, - gamedata->player.x+GAME_WIDTH/2+gamedata->player.bullets[i].x, floor(-gamedata->player.y)+GAME_HEIGHT/2+gamedata->player.bullets[i].y, 1, 1, gamedata->player.bullets[i].angle + 3.14159, 0); } // for i // draw bunnies for(unsigned int i = 0; i < gamedata->bunnies.size(); i++) if(gamedata->bunnies[i].is_alive != false) { if(gamedata->bunnies[i].direction >= 0) al_draw_scaled_rotated_bitmap(bitmaps[BUNNY], 0, 0, - gamedata->player.x+GAME_WIDTH/2+gamedata->bunnies[i].x-1, floor(-gamedata->player.y)+GAME_HEIGHT/2+gamedata->bunnies[i].y-1, 1, 1, 0, 0); else al_draw_scaled_rotated_bitmap(bitmaps[BUNNY], 10, 0, - gamedata->player.x+GAME_WIDTH/2+gamedata->bunnies[i].x-1, floor(-gamedata->player.y)+GAME_HEIGHT/2+gamedata->bunnies[i].y-1, -1, 1, 0, 0); } // if bunny alive if(gamedata->player.grenade->is_alive) al_draw_scaled_rotated_bitmap(bitmaps[GRENADE], 4, 6, - gamedata->player.x+GAME_WIDTH/2+gamedata->player.grenade->x+4, floor(-gamedata->player.y)+GAME_HEIGHT/2+gamedata->player.grenade->y+4, 1, 1, 0, 0); //font sprintf(string1, "%d", gamedata->player.health); al_draw_text(font24, al_map_rgb(10, 10, 0), 50, 525, 0, string1); unsigned int tempy = gamedata->bunnies.size(); unsigned int tempy2 = gamedata->numBunnies; sprintf(string1, "%d yet to feel thy wrath. %d shall commeth.", tempy, tempy2); al_draw_text(font16, al_map_rgb(10, 10, 0), 50, 25, 0, string1); tempy = gamedata->player.killed; sprintf(string1, "%d snuffed.", tempy); al_draw_text(font24, al_map_rgb(10, 10, 0), 75, 50, 0, string1); if(gamedata->player.has_grenade) al_draw_text(font24, al_map_rgb(10, 10, 0), 325, 525, 0, "You have only 1 Holy Hand Grenades."); else al_draw_text(font24, al_map_rgb(10, 10, 0), 325, 525, 0, "You have 0 Holy Hand Grenades."); // whiteout if(gamedata->player.grenade->is_alive) { double temp = 1.0 - gamedata->player.grenade->death_timer/300.0; al_draw_tinted_bitmap(bitmaps[WHITE], al_map_rgba_f(temp, temp, temp, 0), 0, 0, 0); } al_flip_display(); } // theme()
static void redraw(void) { int w = al_get_display_width(example.display); int h = al_get_display_height(example.display); int i; int f1, f2; int fh = al_get_font_line_height(example.font); char const *info[] = {"textures", "memory buffers"}; char const *binfo[] = {"alpha", "additive", "tinted", "solid", "alpha test"}; ALLEGRO_COLOR tint = example.white; if (example.blending == 0) { al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA); tint = example.half_white; } else if (example.blending == 1) { al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_ONE); tint = example.dark; } else if (example.blending == 2) { al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_ZERO); tint = example.red; } else if (example.blending == 3) { al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_ZERO); } if (example.blending == 4) { al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA); al_set_render_state(ALLEGRO_ALPHA_TEST, true); al_set_render_state(ALLEGRO_ALPHA_FUNCTION, ALLEGRO_RENDER_GREATER); al_set_render_state(ALLEGRO_ALPHA_TEST_VALUE, 128); } else { al_set_render_state(ALLEGRO_ALPHA_TEST, false); } if (example.hold_bitmap_drawing) { al_hold_bitmap_drawing(true); } for (i = 0; i < example.sprite_count; i++) { Sprite *s = example.sprites + i; al_draw_tinted_bitmap(example.bitmap, tint, s->x, s->y, 0); } if (example.hold_bitmap_drawing) { al_hold_bitmap_drawing(false); } al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA); if (example.show_help) { int dh = fh * 3.5; for (i = 5; i >= 0; i--) { al_draw_text(example.font, example.white, 0, h - dh, 0, text[i]); dh += fh * 6; } } al_draw_textf(example.font, example.white, 0, 0, 0, "count: %d", example.sprite_count); al_draw_textf(example.font, example.white, 0, fh, 0, "size: %d", example.bitmap_size); al_draw_textf(example.font, example.white, 0, fh * 2, 0, "%s", info[example.use_memory_bitmaps]); al_draw_textf(example.font, example.white, 0, fh * 3, 0, "%s", binfo[example.blending]); get_fps(&f1, &f2); al_draw_textf(example.font, example.white, w, 0, ALLEGRO_ALIGN_RIGHT, "FPS: %4d +- %-4d", f1, f2); al_draw_textf(example.font, example.white, w, fh, ALLEGRO_ALIGN_RIGHT, "%4d / sec", (int)(1.0 / example.direct_speed_measure)); }
int main(void) { ALLEGRO_DISPLAY *display; ALLEGRO_TIMER *timer; ALLEGRO_EVENT_QUEUE *queue; ALLEGRO_BITMAP *bmp; ALLEGRO_BITMAP *mem_bmp; ALLEGRO_BITMAP *disp_bmp; ALLEGRO_FONT *font; char *text; bool done = false; bool redraw = true; if (!al_init()) { abort_example("Failed to init Allegro.\n"); return 1; } if (!al_init_image_addon()) { abort_example("Failed to init IIO addon.\n"); return 1; } al_init_font_addon(); display = al_create_display(640, 480); if (!display) { abort_example("Error creating display.\n"); return 1; } if (!al_install_keyboard()) { abort_example("Error installing keyboard.\n"); return 1; } font = al_load_font("data/fixed_font.tga", 0, 0); if (!font) { abort_example("Error loading data/fixed_font.tga\n"); return 1; } bmp = disp_bmp = al_load_bitmap("data/mysha.pcx"); if (!bmp) { abort_example("Error loading data/mysha.pcx\n"); return 1; } text = "Display bitmap (space to change)"; al_set_new_bitmap_flags(ALLEGRO_MEMORY_BITMAP); mem_bmp = al_load_bitmap("data/mysha.pcx"); if (!bmp) { abort_example("Error loading data/mysha.pcx\n"); return 1; } timer = al_create_timer(INTERVAL); queue = al_create_event_queue(); al_register_event_source(queue, al_get_keyboard_event_source()); al_register_event_source(queue, al_get_timer_event_source(timer)); al_register_event_source(queue, al_get_display_event_source(display)); al_start_timer(timer); al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA); while (!done) { ALLEGRO_EVENT event; if (redraw && al_is_event_queue_empty(queue)) { update(bmp); al_clear_to_color(al_map_rgb_f(0, 0, 0)); al_draw_tinted_bitmap(bmp, al_map_rgba_f(1, 1, 1, 0.5), bmp_x, bmp_y, bmp_flag); al_draw_text(font, al_map_rgba_f(1, 1, 1, 0.5), 0, 0, 0, text); al_flip_display(); redraw = false; } al_wait_for_event(queue, &event); switch (event.type) { case ALLEGRO_EVENT_KEY_DOWN: if (event.keyboard.keycode == ALLEGRO_KEY_ESCAPE) done = true; else if (event.keyboard.keycode == ALLEGRO_KEY_SPACE) { if (bmp == mem_bmp) { bmp = disp_bmp; text = "Display bitmap (space to change)"; } else { bmp = mem_bmp; text = "Memory bitmap (space to change)"; } } break; case ALLEGRO_EVENT_DISPLAY_CLOSE: done = true; break; case ALLEGRO_EVENT_TIMER: redraw = true; break; } } al_destroy_bitmap(bmp); return 0; }
/** Draws this bitmap onto the target bitmap tinted by the given color. @param color color. @param dx target horizontal position. @param dy target vertical position. @param flags flags. */ void drawTinted(const ALLEGRO_COLOR &color, float dx, float dy, int flags = 0) const { al_draw_tinted_bitmap(get(), color, dx, dy, flags); }
static void allegro_render_element(HYPERLINK_PAGE * pp, int i, bool hover) { int sx, sy; if(hover) { sx = -4; sy = -4; } else { sx = -2; sy = -2; } switch(pp->element[i].type) { case HYPERLINK_ELEMENT_TYPE_TEXT: { if(pp->element[i].flags & HYPERLINK_ELEMENT_FLAG_SHADOW) { if(!(pp->element[i].flags & HYPERLINK_ELEMENT_FLAG_AUTOHIDE) || hyperlink_check_hover_y(pp, i)) { if(pp->element[i].flags & HYPERLINK_ELEMENT_FLAG_CENTER) { al_draw_text((ALLEGRO_FONT *)pp->element[i].aux_data, al_map_rgba_f(0.0, 0.0, 0.0, 0.5), pp->ox + pp->element[i].ox, pp->oy + pp->element[i].oy, ALLEGRO_ALIGN_CENTRE, (char *)pp->element[i].data); al_draw_text((ALLEGRO_FONT *)pp->element[i].aux_data, pp->element[i].color, pp->ox + pp->element[i].ox + sx, pp->oy + pp->element[i].oy + sy, ALLEGRO_ALIGN_CENTRE, (char *)pp->element[i].data); } else { al_draw_text((ALLEGRO_FONT *)pp->element[i].aux_data, al_map_rgba_f(0.0, 0.0, 0.0, 0.5), pp->ox + pp->element[i].ox, pp->oy + pp->element[i].oy, 0, (char *)pp->element[i].data); al_draw_text((ALLEGRO_FONT *)pp->element[i].aux_data, pp->element[i].color, pp->ox + pp->element[i].ox + sx, pp->oy + pp->element[i].oy + sy, 0, (char *)pp->element[i].data); } } } else { } break; } case HYPERLINK_ELEMENT_TYPE_IMAGE: { if(pp->element[i].flags & HYPERLINK_ELEMENT_FLAG_SHADOW) { if(pp->element[i].flags & HYPERLINK_ELEMENT_FLAG_CENTER) { if(pp->element[i].data) { al_draw_tinted_bitmap((ALLEGRO_BITMAP *)(pp->element[i].data), al_map_rgba_f(0.0, 0.0, 0.0, 0.5), pp->ox + pp->element[i].ox - al_get_bitmap_width(((ALLEGRO_BITMAP *)(pp->element[i].data))) / 2, pp->oy + pp->element[i].oy - al_get_bitmap_width(((ALLEGRO_BITMAP *)(pp->element[i].data))) / 2, 0); al_draw_bitmap((ALLEGRO_BITMAP *)(pp->element[i].data), pp->ox + pp->element[i].ox - al_get_bitmap_width(((ALLEGRO_BITMAP *)(pp->element[i].data))) / 2 - sx, pp->oy + pp->element[i].oy - al_get_bitmap_width(((ALLEGRO_BITMAP *)(pp->element[i].data))) / 2 - sy, 0); } } else { if(pp->element[i].data) { al_draw_tinted_bitmap((ALLEGRO_BITMAP *)(pp->element[i].data), al_map_rgba_f(0.0, 0.0, 0.0, 0.5), pp->ox + pp->element[i].ox, pp->oy + pp->element[i].oy, 0); al_draw_bitmap((ALLEGRO_BITMAP *)(pp->element[i].data), pp->ox + pp->element[i].ox - sx, pp->oy + pp->element[i].oy - sy, 0); } } } break; } default: { break; } } }
void drawTintedPicture(ALLEGRO_BITMAP *img, ALLEGRO_COLOR color, float x, float y, int flags) { al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_ONE); // Nice tint al_draw_tinted_bitmap(img, color, x, y, flags); al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA); // No tint for other drawing.. }
/* {{{ Bitmap: */ void al_draw_tinted_bitmap_w(ALLEGRO_BITMAP *bitmap, ALLEGRO_COLOR *tint, float dx, float dy, int flags) { return al_draw_tinted_bitmap(bitmap, *tint, dx, dy, flags); }