예제 #1
0
static void dot_create_grab_spot_effect(void * data)
{
	APP_INSTANCE * app = (APP_INSTANCE *)data;
	ALLEGRO_STATE old_state;
	ALLEGRO_TRANSFORM identity;
	float s;
	float sx = 512.0 / (float)t3f_virtual_display_width;
	bool held = al_is_bitmap_drawing_held();

	if(held)
	{
		al_hold_bitmap_drawing(false);
	}

	al_store_state(&old_state, ALLEGRO_STATE_TARGET_BITMAP | ALLEGRO_STATE_TRANSFORM | ALLEGRO_STATE_BLENDER);
	al_set_target_bitmap(app->bitmap[DOT_BITMAP_SCRATCH]);
	al_identity_transform(&identity);
	al_use_transform(&identity);
	al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA);
	al_set_clipping_rectangle(0, 0, 512, 512);
	al_clear_to_color(al_map_rgba_f(0.0, 0.0, 0.0, 1.0));
	al_set_blender(ALLEGRO_ADD, ALLEGRO_ZERO, ALLEGRO_INVERSE_ALPHA);
	s = DOT_GAME_GRAB_SPOT_SIZE;
	t3f_draw_scaled_bitmap(app->bitmap[DOT_BITMAP_COMBO], al_map_rgba_f(0.0, 0.0, 0.0, 1.0), (float)(app->game.player.ball.x - DOT_GAME_GRAB_SPOT_SIZE) * sx, app->game.player.ball.y - DOT_GAME_GRAB_SPOT_SIZE, 0.0, (s * 2.0) * sx, s * 2, 0);
	al_restore_state(&old_state);
	al_hold_bitmap_drawing(held);
	t3f_set_clipping_rectangle(0, 0, 0, 0);
}
예제 #2
0
static void dot_create_touch_dots_effect(void * data)
{
	APP_INSTANCE * app = (APP_INSTANCE *)data;
	ALLEGRO_STATE old_state;
	ALLEGRO_TRANSFORM identity;
	float sx = 512.0 / (float)t3f_virtual_display_width;
	int i;
	bool held = al_is_bitmap_drawing_held();

	if(held)
	{
		al_hold_bitmap_drawing(false);
	}
	al_store_state(&old_state, ALLEGRO_STATE_TARGET_BITMAP | ALLEGRO_STATE_TRANSFORM);
	al_set_target_bitmap(app->bitmap[DOT_BITMAP_SCRATCH]);
	al_identity_transform(&identity);
	al_use_transform(&identity);
	al_set_clipping_rectangle(0, 0, 512, 512);
	al_clear_to_color(al_map_rgba_f(0.0, 0.0, 0.0, 0.0));
	al_hold_bitmap_drawing(true);
	for(i = 0; i < DOT_GAME_MAX_BALLS; i++)
	{
		if(app->game.ball[i].active)
		{
			t3f_draw_scaled_bitmap(app->bitmap[DOT_BITMAP_BALL_RED + app->game.ball[i].type], al_map_rgba_f(1.0, 1.0, 1.0, 1.0), (app->game.ball[i].x - app->game.ball[i].r) * sx, app->game.ball[i].y - app->game.ball[i].r, app->game.ball[i].z, (app->game.ball[i].r * 2.0) * sx, app->game.ball[i].r * 2.0, 0);
		}
	}
	al_hold_bitmap_drawing(false);
	al_restore_state(&old_state);
	al_hold_bitmap_drawing(held);
	t3f_set_clipping_rectangle(0.0, 0.0, 0.0, 0.0);
}
예제 #3
0
void render(void)
{
	al_hold_bitmap_drawing(true);
	switch(state)
	{
		case STATE_LOGO:
		{
			logo_render();
			break;
		}
		case STATE_INTRO:
		{
			cinema_render(cinema);
			break;
		}
		case STATE_TITLE:
		{
			title_render();
			break;
		}
		case STATE_GAME:
		{
			game_render();
			break;
		}
		case STATE_ENDING:
		{
			cinema_render(ending_cinema);
			break;
		}
	}
	al_hold_bitmap_drawing(false);
}
예제 #4
0
static void t3f_render_static_tilemap(T3F_TILEMAP * tmp, T3F_TILESET * tsp, int layer, int tick, float ox, float oy, float oz, ALLEGRO_COLOR color)
{
	ALLEGRO_STATE old_blender;
	int i, j;
	bool held;

	held = al_is_bitmap_drawing_held();
	al_store_state(&old_blender, ALLEGRO_STATE_BLENDER);
	if(tmp->layer[layer]->flags & T3F_TILEMAP_LAYER_SOLID)
	{
		if(held)
		{
			al_hold_bitmap_drawing(false);
		}
		al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_ZERO);
	}
	al_hold_bitmap_drawing(true);
	for(i = 0; i < (t3f_virtual_display_height / tsp->height) + 1; i++)
	{
		for(j = 0; j < (t3f_virtual_display_width / tsp->width) + 1; j++)
		{
			t3f_draw_scaled_animation(tsp->tile[t3f_get_tile(tsp, tmp->layer[layer]->data[i][j], tick)]->ap, color, tick, (float)(j * tsp->width) * tmp->layer[layer]->scale, (float)(i * tsp->height) * tmp->layer[layer]->scale, 0, tmp->layer[layer]->scale, 0);
		}
	}
	if(tmp->layer[layer]->flags & T3F_TILEMAP_LAYER_SOLID)
	{
		al_hold_bitmap_drawing(false);
	}
	al_hold_bitmap_drawing(held);
	al_restore_state(&old_blender);
}
예제 #5
0
void dot_intro_render(void * data)
{
	APP_INSTANCE * app = (APP_INSTANCE *)data;

	al_clear_to_color(app->level_color[0]);
	al_hold_bitmap_drawing(true);
	dot_bg_objects_render(data);
	al_draw_bitmap(app->bitmap[DOT_BITMAP_BG], 0, 0, 0);
	if(!app->desktop_mode || !app->menu_showing)
	{
		al_draw_bitmap(app->bitmap[DOT_BITMAP_LOGO], DOT_GAME_PLAYFIELD_WIDTH / 2 - al_get_bitmap_width(app->bitmap[DOT_BITMAP_LOGO]) / 2 + app->logo_ox, DOT_GAME_PLAYFIELD_HEIGHT / 2 - al_get_bitmap_height(app->bitmap[DOT_BITMAP_LOGO]) / 2, 0);
		dot_credits_render(data, app->credits_ox);
		dot_shadow_text(app->font[DOT_FONT_16], t3f_color_white, al_map_rgba_f(0.0, 0.0, 0.0, 0.5), t3f_virtual_display_width / 2 + app->logo_ox, DOT_GAME_PLAYFIELD_HEIGHT - al_get_font_line_height(app->font[DOT_FONT_16]) * 2, DOT_SHADOW_OX, DOT_SHADOW_OY, ALLEGRO_ALIGN_CENTRE, "Copyright (c) 2016 T^3 Software.");
	}
	al_hold_bitmap_drawing(false);
	dot_intro_render_split(data);
	if(app->menu_showing)
	{
		al_hold_bitmap_drawing(true);
		t3f_render_gui(app->menu[app->current_menu]);
		if(app->entering_name)
		{
			if((app->tick / 15) % 2)
			{
				dot_shadow_text(app->font[DOT_FONT_32], t3f_color_white, al_map_rgba_f(0.0, 0.0, 0.0, 0.5), app->menu[DOT_MENU_PROFILE]->ox + app->menu[DOT_MENU_PROFILE]->element[1].ox + al_get_text_width(app->menu[DOT_MENU_PROFILE]->element[1].aux_data, app->menu[DOT_MENU_PROFILE]->element[1].data) / 2, app->menu[DOT_MENU_PROFILE]->oy + app->menu[DOT_MENU_PROFILE]->element[1].oy, DOT_SHADOW_OX, DOT_SHADOW_OY, 0, "_");
			}
		}
		al_hold_bitmap_drawing(false);
	}
}
예제 #6
0
void mapper_help_render(void)
{
	al_hold_bitmap_drawing(false);
	al_draw_filled_rectangle(0, 0, t3f_virtual_display_width, t3f_virtual_display_height, al_map_rgba_f(0.0, 0.0, 0.0, 0.75));
	al_hold_bitmap_drawing(true);
	al_draw_textf(mapper_font, t3f_color_white, 0, 0, 0, "Global Keys");
	al_draw_textf(mapper_font, t3f_color_white, 0, 16, 0, "-------------");
	al_draw_textf(mapper_font, t3f_color_white, 0, 32, 0, "F1: Help");
	al_draw_textf(mapper_font, t3f_color_white, 0, 48, 0, "Tab: Change View");

	al_draw_textf(mapper_font, t3f_color_white, 0, 80, 0, "Tileset Keys");
	al_draw_textf(mapper_font, t3f_color_white, 0, 96, 0, "-------------");
	al_draw_textf(mapper_font, t3f_color_white, 0, 112, 0, "F2: Save tileset");
	al_draw_textf(mapper_font, t3f_color_white, 0, 128, 0, "F3: Load tileset");
	al_draw_textf(mapper_font, t3f_color_white, 0, 144, 0, "F4: Create new tileset");
	al_draw_textf(mapper_font, t3f_color_white, 0, 160, 0, "Insert: Add tile");
	al_draw_textf(mapper_font, t3f_color_white, 0, 176, 0, "Delete: Delete tile");

	al_draw_textf(mapper_font, t3f_color_white, 0, 208, 0, "Tilemap Keys");
	al_draw_textf(mapper_font, t3f_color_white, 0, 224, 0, "-------------");
	al_draw_textf(mapper_font, t3f_color_white, 0, 240, 0, "F2: Save tilemap");
	al_draw_textf(mapper_font, t3f_color_white, 0, 256, 0, "F3: Load tilemap");
	al_draw_textf(mapper_font, t3f_color_white, 0, 272, 0, "F4: Create new tilemap");
	al_draw_textf(mapper_font, t3f_color_white, 0, 288, 0, "-/=: Select tile");
	al_draw_textf(mapper_font, t3f_color_white, 0, 304, 0, "PGUP/PGDN: Select layer");
	al_draw_textf(mapper_font, t3f_color_white, 0, 320, 0, "Pad +/-: Change Z-position of current layer");
	al_draw_textf(mapper_font, t3f_color_white, 0, 336, 0, "Ctrl+*: Scale current layer so tiles appear 1:1");
	al_draw_textf(mapper_font, t3f_color_white, 0, 352, 0, "Ctrl+Shift+*: Reset layer scale");
	al_draw_textf(mapper_font, t3f_color_white, 0, 368, 0, "*: Reset layer Z-position");
	al_draw_textf(mapper_font, t3f_color_white, 0, 384, 0, "S: Toggle layer solid flag");
	al_draw_textf(mapper_font, t3f_color_white, 0, 400, 0, "Ctrl+S: Toggle layer static flag");
	al_draw_textf(mapper_font, t3f_color_white, 0, 416, 0, "Insert: Insert layer");
	al_draw_textf(mapper_font, t3f_color_white, 0, 432, 0, "Delete: Delete layer");
}
예제 #7
0
void dot_credits_render(void * data, float ox)
{
    APP_INSTANCE * app = (APP_INSTANCE *)data;
    int i;
    float pos_y;
    float pos_ox;

	al_hold_bitmap_drawing(true);
	dot_bg_objects_render(data);
	for(i = 0; i < 540 / 32; i++)
	{
		al_draw_bitmap(app->bitmap[DOT_BITMAP_BALL_RED + i % 6], i * 32 + 18 + ox, sin((float)(i * 4 + app->tick) / 10.0) * 32 + 32 + 12, 0);
		al_draw_bitmap(app->bitmap[DOT_BITMAP_BALL_RED + (i + 3) % 6], i * 32 + 18 + ox, cos((float)(i * 4 + app->tick) / 10.0) * 32 + DOT_GAME_PLAYFIELD_HEIGHT - 32 - 32 - 12 - 1, 0);
    }
    al_hold_bitmap_drawing(false);

    if(app->credits.state != DOT_CREDITS_STATE_WAIT)
    {
        if(app->credits.current_credit < app->credits.credits)
        {
            pos_y = DOT_GAME_PLAYFIELD_HEIGHT / 2.0 - ((app->credits.credit[app->credits.current_credit].names + 1) * al_get_font_line_height(app->font[DOT_FONT_32])) / 2.0;
            dot_shadow_text(app->font[DOT_FONT_32], al_map_rgba_f(1.0, 1.0, 0.0, 1.0), al_map_rgba_f(0.0, 0.0, 0.0, 0.5), t3f_virtual_display_width / 2 + app->credits.ox + ox, pos_y, DOT_SHADOW_OX * 2, DOT_SHADOW_OY * 2, ALLEGRO_ALIGN_CENTRE, app->credits.credit[app->credits.current_credit].header);
            for(i = 0; i < app->credits.credit[app->credits.current_credit].names; i++)
            {
                pos_y += al_get_font_line_height(app->font[DOT_FONT_32]);
                pos_ox = i % 2 ? app->credits.ox : -app->credits.ox;
                dot_shadow_text(app->font[DOT_FONT_32], t3f_color_white, al_map_rgba_f(0.0, 0.0, 0.0, 0.5), t3f_virtual_display_width / 2 + pos_ox + ox, pos_y, DOT_SHADOW_OX * 2, DOT_SHADOW_OY * 2, ALLEGRO_ALIGN_CENTRE, app->credits.credit[app->credits.current_credit].name[i]);
            }
        }
    }
}
예제 #8
0
void mapper_render(void * data)
{
	if(mapper_bg_color == 0)
	{
		al_clear_to_color(al_map_rgb_f(0.0, 0.0, 0.1));
	}
	else
	{
		al_clear_to_color(al_map_rgb_f(0.25, 0.25, 1.0));
	}
	al_hold_bitmap_drawing(true);
	switch(mapper_view)
	{
		case MAPPER_VIEW_TILESET:
		{
			mapper_tileset_render();
			break;
		}
		case MAPPER_VIEW_TILEMAP:
		{
			mapper_tilemap_render();
			break;
		}
		case MAPPER_VIEW_TILE_ANI:
		{
			mapper_tile_ani_render();
			break;
		}
	}
	if(t3f_key[ALLEGRO_KEY_F1])
	{
		mapper_help_render();
	}
	al_hold_bitmap_drawing(false);
}
예제 #9
0
void mapper_tile_ani_render(void)
{
	int i;
	float x, y;
	bool held = al_is_bitmap_drawing_held();

	if(mapper_tileset->tile[mapper_current_tile]->flags & T3F_TILE_FLAG_ANIMATED)
	{
		for(i = 0; i < mapper_tileset->tile[mapper_current_tile]->frame_list_total; i++)
		{
			x = (i % 20) * 32;
			y = (i / 20) * 32;
			t3f_draw_animation(mapper_tileset->tile[mapper_tileset->tile[mapper_current_tile]->frame_list[i]]->ap, t3f_color_white, mapper_tick, x, y, 0, 0);
			if(i == mapper_current_frame)
			{
				al_hold_bitmap_drawing(true);
				al_draw_rectangle(x + 0.5, y + 0.5, x + 31 + 0.5, y + 31 + 0.5, al_map_rgba_f(0.0, 1.0, 0.0, 1.0), 1.0);
				al_hold_bitmap_drawing(held);
			}
		}
	}
	else
	{
		t3f_draw_animation(mapper_tileset->tile[mapper_current_tile]->ap, t3f_color_white, mapper_tick, 0, 0, 0, 0);
	}
}
예제 #10
0
void dot_privacy_render(void * data)
{
	APP_INSTANCE * app = (APP_INSTANCE *)data;
	int i;

	al_clear_to_color(app->level_color[0]);
	al_hold_bitmap_drawing(true);
	dot_bg_objects_render(data);
	al_draw_bitmap(app->bitmap[DOT_BITMAP_BG], 0, 0, 0);
	for(i = 0; i < 128; i++)
	{
		if(privacy_text[i])
		{
			dot_shadow_text(app->font[DOT_FONT_16], t3f_color_white, al_map_rgba_f(0.0, 0.0, 0.0, 0.5), 8, i * 16, DOT_SHADOW_OX, DOT_SHADOW_OY, 0, privacy_text[i]);
		}
		else
		{
			break;
		}
	}
	if(!app->desktop_mode)
	{
		t3f_render_gui(app->menu[app->current_menu]);
	}
	al_hold_bitmap_drawing(false);
	dot_intro_render_split(data);
}
예제 #11
0
static void dot_create_bg_object_effect(void * data)
{
	APP_INSTANCE * app = (APP_INSTANCE *)data;
	ALLEGRO_STATE old_state;
	ALLEGRO_TRANSFORM identity;
	float sx = 512.0 / (float)t3f_virtual_display_width;
	int i;
	bool held = al_is_bitmap_drawing_held();

	if(held)
	{
		al_hold_bitmap_drawing(false);
	}
	al_store_state(&old_state, ALLEGRO_STATE_TARGET_BITMAP | ALLEGRO_STATE_TRANSFORM);
	al_set_target_bitmap(app->bitmap[DOT_BITMAP_SCRATCH]);
	al_identity_transform(&identity);
	al_use_transform(&identity);
	al_set_clipping_rectangle(0, 0, 512, 512);
    al_clear_to_color(al_map_rgba_f(0.0, 0.0, 0.0, 0.0));
    al_set_clipping_rectangle(0, 0, 512, DOT_GAME_PLAYFIELD_HEIGHT);
    al_hold_bitmap_drawing(true);
	for(i = 0; i < DOT_MAX_BG_OBJECTS; i++)
	{
		t3f_draw_scaled_bitmap(app->bitmap[DOT_BITMAP_BALL_RED], al_map_rgba_f(1.0, 1.0, 1.0, 1.0), app->bg_object[i].x * sx, app->bg_object[i].y, app->bg_object[i].z, DOT_GAME_BALL_SIZE * 2.0 * sx, DOT_GAME_BALL_SIZE * 2.0, 0);
	}
	al_hold_bitmap_drawing(false);
	t3f_set_clipping_rectangle(0, 0, 0, 0);
	al_restore_state(&old_state);
	al_hold_bitmap_drawing(held);
}
예제 #12
0
static void dot_create_touch_start_effect(void * data)
{
	APP_INSTANCE * app = (APP_INSTANCE *)data;
	ALLEGRO_STATE old_state;
	ALLEGRO_TRANSFORM identity;
	float sx = 512.0 / (float)t3f_virtual_display_width;
	bool held = al_is_bitmap_drawing_held();

	if(held)
	{
		al_hold_bitmap_drawing(false);
	}
	al_store_state(&old_state, ALLEGRO_STATE_TARGET_BITMAP | ALLEGRO_STATE_TRANSFORM | ALLEGRO_STATE_BLENDER);
	al_set_target_bitmap(app->bitmap[DOT_BITMAP_SCRATCH]);
	al_identity_transform(&identity);
	al_use_transform(&identity);
	al_set_blender(ALLEGRO_ADD, ALLEGRO_ONE, ALLEGRO_INVERSE_ALPHA);
	al_set_clipping_rectangle(0, 0, 512, 512);
	al_clear_to_color(al_map_rgba_f(0.0, 0.0, 0.0, 1.0));
	al_set_blender(ALLEGRO_ADD, ALLEGRO_ZERO, ALLEGRO_INVERSE_ALPHA);
	al_draw_filled_rectangle(DOT_GAME_TOUCH_START_X * sx, DOT_GAME_TOUCH_START_Y, DOT_GAME_TOUCH_END_X * sx, DOT_GAME_TOUCH_END_Y, al_map_rgba_f(1.0, 1.0, 1.0, 1.0));
	al_restore_state(&old_state);
	al_hold_bitmap_drawing(held);
	t3f_set_clipping_rectangle(0, 0, 0, 0);
}
예제 #13
0
파일: menu.cpp 프로젝트: pmprog/TugOfWar
void Menu::GenerateBackground()
{
	backgroundindex = rand() % 3;

	if( background == nullptr )
    {
        background = al_create_bitmap( 1024, 512 );
    }
	DISPLAY->SetTarget( background );

	int iw = al_get_bitmap_width( GameResources::BackgroundTiles.at(backgroundindex) );
	int ih = al_get_bitmap_height( GameResources::BackgroundTiles.at(backgroundindex) );
	int bx = 0;
	int by = 0;

	al_hold_bitmap_drawing( true );
	while( by < 512 )
	{
		while( bx < 1024 )
		{
			al_draw_bitmap( GameResources::BackgroundTiles.at(backgroundindex), bx, by, 0 );
			bx += iw;
		}
		by += ih;
		bx = 0;
	}
	al_hold_bitmap_drawing( false );

	DISPLAY->ClearTarget();
}
예제 #14
0
파일: tilemap.cpp 프로젝트: pmprog/0Wave
void TileMap::Render( int OffsetX, int OffsetY, float ScaleX, float ScaleY )
{
	// Prevent non-graphical tilemaps from drawing
	if( tileGraphics == 0 )
	{
		return;
	}

	float scaledTileW = tileWidth * ScaleX;
	float scaledTileH = tileHeight * ScaleY;
	int startX = OffsetX / scaledTileW;
	int startY = OffsetY / scaledTileH;
	int endX = startX + (DISPLAY->GetWidth() / scaledTileW) + 1;
	int endY = startY + (DISPLAY->GetHeight() / scaledTileH) + 1;

	al_hold_bitmap_drawing( true );

	for( int ty = startY; ty <= endY; ty++ )
	{
		if( ty >= height )
		{
			break;
		}
		int actualy = (ty * scaledTileH) - OffsetY;

		for( int tx = startX; tx <= endX; tx++ )
		{
			if( tx >= width )
			{
				break;
			}
			int actualx = (tx * scaledTileW) - OffsetX;
			int tileIdx = tileData[ (ty * width) + tx ];

			if( tileIdx < 0 )
			{
				// Draw Animated Tile
				int animidx = (tileIdx * -1) - 1;
				if( animidx < (int)tileAnimations.size() )
				{
					Animation* a = tileAnimations.at( animidx );
					a->SetScale( ScaleX, ScaleY );
					a->DrawFrame( actualx, actualy );
				}
			} else {
				// Draw Normal Tile
				tileGraphics->DrawSprite( tileIdx, actualx, actualy, ScaleX, ScaleY, 0 );
			}

		}
	}

	al_hold_bitmap_drawing( false );
}
예제 #15
0
void draw_nine_patch_bitmap(NINE_PATCH_BITMAP *p9, ALLEGRO_COLOR tint, int dx, int dy, int dw, int dh)
{
	int i, j;
	bool release_drawing = false;

	/* don't draw bitmaps that are smaller than the fixed area */
	if (dw < p9->h.fix || dh < p9->v.fix) return;

	/* if the bitmap is the same size as the origin, then draw it as-is */
	if (dw == p9->width && dh == p9->height)
	{
		al_draw_tinted_bitmap_region(p9->bmp, tint, 1, 1, dw, dh, dx, dy, 0);
		return;
	}

	/* due to the caching mechanism, multiple threads cannot draw this image at the same time */
	al_lock_mutex(p9->mutex);

	/* only recalculate the offsets if they have changed since the last draw */
	if (p9->cached_dw != dw || p9->cached_dh != dh)
	{
		calc_nine_patch_offsets(&p9->h, dw);
		calc_nine_patch_offsets(&p9->v, dh);

		p9->cached_dw = dw;
		p9->cached_dh = dh;
	}

	if (!al_is_bitmap_drawing_held())
	{
		release_drawing = true;
		al_hold_bitmap_drawing(true);
	}

	/* draw each region */
	for (i = 0; i < p9->v.count; ++i)
	{
		for (j = 0; j < p9->h.count; ++j)
		{
			al_draw_tinted_scaled_bitmap(p9->bmp, tint,
				p9->h.m[j].offset, p9->v.m[i].offset,
				p9->h.m[j].length, p9->v.m[i].length,
				dx + p9->h.m[j].dest_offset, dy + p9->v.m[i].dest_offset,
				p9->h.m[j].dest_length, p9->v.m[i].dest_length,
				0
			);
		}
	}

	al_unlock_mutex(p9->mutex);

	if (release_drawing)
		al_hold_bitmap_drawing(false);
}
예제 #16
0
void render(void * data)
{
	int i;

	al_clear_to_color(al_map_rgba_f(0.0, 0.0, 0.0, 0.0));
	al_hold_bitmap_drawing(true);
	for(i = 0; i < 1024; i++)
	{
		al_draw_bitmap(bitmap[object[i].bitmap], object[i].x, object[i].y, 0);
	}
	al_hold_bitmap_drawing(false);
}
예제 #17
0
static void ogl_lock_region_nonbb_readwrite(
   ALLEGRO_BITMAP *bitmap, ALLEGRO_BITMAP_EXTRA_OPENGL *ogl_bitmap,
   int x, int gl_y, int w, int h, int format)
{
   ALLEGRO_BITMAP *old_target = NULL;

   /* Create an FBO if there isn't one. */
   if (!ogl_bitmap->fbo_info) {
      old_target = al_get_target_bitmap();
      bitmap->locked = false; // FIXME: hack :(
      if (al_is_bitmap_drawing_held())
         al_hold_bitmap_drawing(false);

      al_set_target_bitmap(bitmap); // This creates the fbo
      bitmap->locked = true;
   }

   if (ogl_bitmap->fbo_info) {
      ogl_lock_region_nonbb_readwrite_fbo(bitmap, ogl_bitmap,
         x, gl_y, w, h, format);
   }
   else {
      ogl_lock_region_nonbb_readwrite_nonfbo(bitmap, ogl_bitmap,
         x, gl_y, w, h, format);
   }

   if (old_target) {
      al_set_target_bitmap(old_target);
   }
}
예제 #18
0
void mapper_tilemap_render(void)
{
	int i;
	float lx, ty, scale;

	if(mapper_tilemap)
	{
		for(i = 0; i < mapper_tilemap->layers; i++)
		{
			if(!t3f_key[ALLEGRO_KEY_L] || i == mapper_current_layer)
			{
				t3f_render_tilemap(mapper_tilemap, mapper_tileset, i, mapper_tick, mapper_camera.x, mapper_camera.y, mapper_camera.z, t3f_color_white);
			}
		}
		al_hold_bitmap_drawing(false);
		if(!mapper_tilemap_hover_fail)
		{
			scale = mapper_tilemap->layer[mapper_current_layer]->scale;
			lx = mapper_tilemap_hover_x * mapper_tileset->width * scale + mapper_tilemap->layer[mapper_current_layer]->x - mapper_camera.x + 0.5;
			ty = mapper_tilemap_hover_y * mapper_tileset->height * scale + mapper_tilemap->layer[mapper_current_layer]->y - mapper_camera.y + 0.5;
			al_draw_rectangle(lx, ty, lx + (float)mapper_tileset->width * scale - 1.0 + 0.5, ty + (float)mapper_tileset->height * scale - 1.0 + 0.5, al_map_rgba_f(0.0, 1.0, 0.0, 0.5), 1.0);
		}
		t3f_draw_animation(mapper_tileset->tile[mapper_current_tile]->ap, al_map_rgba_f(1.0, 1.0, 1.0, 0.5), mapper_tick, t3f_mouse_x + 16, t3f_mouse_y + 16, 0, 0);
		al_draw_textf(mapper_font, t3f_color_white, 0, 416, 0, "Layer Position = (%4.2f, %4.2f, %4.2f)", mapper_tilemap->layer[mapper_current_layer]->x, mapper_tilemap->layer[mapper_current_layer]->y, mapper_tilemap->layer[mapper_current_layer]->z);
		al_draw_textf(mapper_font, t3f_color_white, 0, 432, 0, "Camera Position = (%4.2f, %4.2f, %4.2f)", mapper_camera.x, mapper_camera.y, mapper_camera.z);
		al_draw_textf(mapper_font, t3f_color_white, 0, 448, 0, "Current Layer = %d", mapper_current_layer);
		al_draw_textf(mapper_font, t3f_color_white, 0, 464, 0, "Current Tile = %d", mapper_current_tile);
	}
	else
	{
		al_draw_textf(mapper_font, t3f_color_white, 0, 0, 0, "Please create or load a tilemap.");
	}
}
예제 #19
0
			void entityGUIChat::render(float oX,float oY){
			ALLEGRO_MOUSE_STATE mState; //Mouse state
			al_get_mouse_state(&mState); //Get the state of the mouse

			al_hold_bitmap_drawing(true);
			al_draw_bitmap(chatBoxCache,x,y-31-al_get_bitmap_height(chatBoxCache),0);

			if (resizingChatVertical || gameEngine::globalFunctions::pointInRegion(mState.x,mState.y,x,y-31-(drawLines*lineHeight)-7,x+chatWidth,y-31-(drawLines*lineHeight)+2)) {
				al_draw_line(x,y-31-al_get_bitmap_height(chatBoxCache),x+chatWidth,y-31-al_get_bitmap_height(chatBoxCache),al_map_rgb(255,255,255),1);
				al_draw_line(x,y-31-al_get_bitmap_height(chatBoxCache)+2,x+chatWidth,y-31-al_get_bitmap_height(chatBoxCache)+2,al_map_rgb(255,255,255),1);
			}

			al_draw_bitmap(chatTypeBG,x,y-26,0);
			textEntryBox->render(x+99,y-26,1);
			al_hold_bitmap_drawing(false);
				
			}
예제 #20
0
static mrb_value
hold_drawing(mrb_state *mrb, mrb_value self)
{
  int b;
  mrb_get_args(mrb, "b", &b);
  al_hold_bitmap_drawing(b);
  return mrb_nil_value();
}
예제 #21
0
void draw_particles() {
  list_node *node = particle_list->head;
  al_hold_bitmap_drawing(true);  // better performance for repeated draws
  while (node != NULL) {
    particle *p = (particle*)(node->value);
    al_draw_tinted_scaled_bitmap(
        particle_bitmap,              // bitmap
        p->color,                     // tint
        0, 0, BMP_SIZE, BMP_SIZE,     // source coordinates
        p->position.x, p->position.y, // destination coordinates
        p->radius, p->radius,         // scale
        0                             // flags
        );
    node = node->next;
  }
  al_hold_bitmap_drawing(false);
}
예제 #22
0
static void _al_draw_orthogonal_tile_layer(ALLEGRO_MAP_LAYER *layer, ALLEGRO_MAP *map, ALLEGRO_COLOR tint, float sx, float sy, float sw, float sh, float dx, float dy, int flags)
{
	if (!layer->visible) {
		return;
	}

	float r, g, b, a;
	al_unmap_rgba_f(tint, &r, &g, &b, &a);
	ALLEGRO_COLOR color = al_map_rgba_f(r, g, b, a * layer->opacity);

	int mx, my;
	int ystart = sy / map->tile_height, yend = (sy + sh) / map->tile_height;
	int xstart = sx / map->tile_width, xend = (sx + sw) / map->tile_width;

	// defer rendering until everything is drawn
	al_hold_bitmap_drawing(true);
	
	for (my = ystart; my <= yend; my++) {
		for (mx = xstart; mx <= xend; mx++) {
			ALLEGRO_MAP_TILE *tile = al_get_single_tile(map, layer, mx, my);
			flags = 0;
			
			if (!tile) {
				continue;
			}
			
			float x = mx*(map->tile_width) - sx + dx;
			float y = my*(map->tile_height) - sy + dy;
			
			if (flipped_vertically(layer, mx, my)) flags ^= ALLEGRO_FLIP_VERTICAL;
			if (flipped_horizontally(layer, mx, my)) flags ^= ALLEGRO_FLIP_HORIZONTAL;
			
			if (flipped_diagonally(layer, mx, my)) {
				int tile_center_h = map->tile_width		/ 2;
				int tile_center_w = map->tile_height	/ 2;
				flags ^= ALLEGRO_FLIP_VERTICAL;
				al_draw_tinted_rotated_bitmap(tile->bitmap, color, tile_center_w, tile_center_h, x + tile_center_h, y + tile_center_w, -ALLEGRO_PI/2, flags);
			} else {
				al_draw_tinted_bitmap(tile->bitmap, color, x, y, flags);
			}
		}
	}
	
	al_hold_bitmap_drawing(false);
}
예제 #23
0
void
draw_text(const font_t* font, color_t color, int x, int y, text_align_t alignment, const char* text)
{
	bool is_draw_held;
	int  cp;
	
	if (alignment == TEXT_ALIGN_CENTER)
		x -= get_text_width(font, text) / 2;
	else if (alignment == TEXT_ALIGN_RIGHT)
		x -= get_text_width(font, text);
	is_draw_held = al_is_bitmap_drawing_held();
	al_hold_bitmap_drawing(true);
	while ((cp = *text++) != '\0') {
		draw_image_masked(font->glyphs[cp].image, color, x, y);
		x += font->glyphs[cp].width;
	}
	al_hold_bitmap_drawing(is_draw_held);
}
예제 #24
0
파일: tiled.cpp 프로젝트: pmprog/0Wave
void TransitionTiled::Render()
{
	// Draw original source
	al_draw_bitmap( SourceScreen, 0, 0, 0 );

	al_hold_bitmap_drawing( true );

	// Draw tilemap
	for( int y = 0; y < tileHigh; y++ )
	{
		for( int x = 0; x < tileWide; x++ )
		{
			if( tileMap[(y * tileWide) + x] != 0 )
			{
				al_draw_bitmap_region( TargetScreen, x * tileWidth, y * tileHeight, tileWidth, tileHeight, x * tileWidth, y * tileHeight, 0 );
			}
		}
	}
	
	al_hold_bitmap_drawing( false );
}
예제 #25
0
void dot_intro_render_split(void * data)
{
	APP_INSTANCE * app = (APP_INSTANCE *)data;

	char buffer[256] = {0};
	ALLEGRO_COLOR shadow = al_map_rgba_f(0.0, 0.0, 0.0, 0.25);
	bool held = al_is_bitmap_drawing_held();

	if(held)
	{
		al_hold_bitmap_drawing(false);
	}

	al_draw_filled_rectangle(0, DOT_GAME_PLAYFIELD_HEIGHT, 540, DOT_GAME_PLAYFIELD_HEIGHT + 80, al_map_rgba_f(0.0, 0.0, 0.0, 0.5));
	al_hold_bitmap_drawing(true);
	sprintf(buffer, "High Score");
	dot_shadow_text(app->font[DOT_FONT_32], t3f_color_white, shadow, t3f_virtual_display_width / 2, 440 + 40 - al_get_font_line_height(app->font[DOT_FONT_32]), DOT_SHADOW_OX * 2, DOT_SHADOW_OY * 2, ALLEGRO_ALIGN_CENTRE, buffer);
	sprintf(buffer, "%d", app->game.high_score);
	dot_shadow_text(app->font[DOT_FONT_32], t3f_color_white, shadow, t3f_virtual_display_width / 2, 440 + 40, DOT_SHADOW_OX * 2, DOT_SHADOW_OY * 2, ALLEGRO_ALIGN_CENTRE, buffer);
	al_hold_bitmap_drawing(false);
	al_hold_bitmap_drawing(held);
}
예제 #26
0
/* render the HUD */
void dot_game_render_hud(void * data)
{
	APP_INSTANCE * app = (APP_INSTANCE *)data;

	char buffer[256] = {0};
	ALLEGRO_COLOR shadow = al_map_rgba_f(0.0, 0.0, 0.0, 0.25);
	bool held = al_is_bitmap_drawing_held();

	if(held)
	{
		al_hold_bitmap_drawing(false);
	}

	al_draw_filled_rectangle(0, DOT_GAME_PLAYFIELD_HEIGHT, 540, DOT_GAME_PLAYFIELD_HEIGHT + 80, al_map_rgba_f(0.0, 0.0, 0.0, 0.5));
	if(app->desktop_mode)
	{
		if(app->state == DOT_STATE_GAME && (app->game.state == DOT_GAME_STATE_PAUSE || app->game.state == DOT_GAME_STATE_START))
		{
			al_draw_filled_rectangle(0, DOT_GAME_PLAYFIELD_HEIGHT, 540, DOT_GAME_PLAYFIELD_HEIGHT + 80, al_map_rgba_f(0.0, 0.0, 0.0, 0.5));
		}
	}
	al_hold_bitmap_drawing(true);
	sprintf(buffer, "Score");
	dot_shadow_text(app->font[DOT_FONT_32], t3f_color_white, shadow, t3f_virtual_display_width - 8, 440 + 40 - al_get_font_line_height(app->font[DOT_FONT_32]), DOT_SHADOW_OX * 2, DOT_SHADOW_OY * 2, ALLEGRO_ALIGN_RIGHT, buffer);
	sprintf(buffer, "%d", app->game.score);
	dot_shadow_text(app->font[DOT_FONT_32], t3f_color_white, shadow, t3f_virtual_display_width - 8, 440 + 40, DOT_SHADOW_OX * 2, DOT_SHADOW_OY * 2, ALLEGRO_ALIGN_RIGHT, buffer);
	sprintf(buffer, "Lives");
	dot_shadow_text(app->font[DOT_FONT_32], t3f_color_white, shadow, 8, 440 + 40 - al_get_font_line_height(app->font[DOT_FONT_32]), DOT_SHADOW_OX * 2, DOT_SHADOW_OY * 2, 0, buffer);
	sprintf(buffer, "%d", app->game.lives);
	dot_shadow_text(app->font[DOT_FONT_32], t3f_color_white, shadow, 8, 440 + 40, DOT_SHADOW_OX * 2, DOT_SHADOW_OY * 2, 0, buffer);

	t3f_draw_scaled_bitmap(app->bitmap[DOT_BITMAP_BALL_RED + app->game.player.ball.type], shadow, t3f_virtual_display_width / 2 - 32 + DOT_SHADOW_OX * 2, DOT_GAME_PLAYFIELD_HEIGHT + 40 - 32 + DOT_SHADOW_OY * 2, 0, 64, 64, 0);
	t3f_draw_scaled_bitmap(app->bitmap[DOT_BITMAP_BALL_RED + app->game.player.ball.type], t3f_color_white, t3f_virtual_display_width / 2 - 32, DOT_GAME_PLAYFIELD_HEIGHT + 40 - 32, 0, 64, 64, 0);
	t3f_draw_scaled_bitmap(app->bitmap[DOT_BITMAP_EMO_NORMAL + app->game.emo_state], t3f_color_white, t3f_virtual_display_width / 2 - 32, DOT_GAME_PLAYFIELD_HEIGHT + 40 - 32, 0.0, 64, 64, 0);
	al_hold_bitmap_drawing(false);
	al_hold_bitmap_drawing(held);
}
예제 #27
0
static void _al_draw_orthogonal_object_layer(ALLEGRO_MAP_LAYER *layer, ALLEGRO_MAP *map, ALLEGRO_COLOR tint, float sx, float sy, float sw, float sh, float dx, float dy, int flags)
{
	if (!layer->visible) {
		return;
	}

	float r, g, b, a;
	al_unmap_rgba_f(tint, &r, &g, &b, &a);
	ALLEGRO_COLOR color = al_map_rgba_f(r, g, b, a * layer->opacity);
	
	// defer rendering until everything is drawn
	al_hold_bitmap_drawing(true);
	
	GSList *objects = layer->objects;
	while (objects) {
		ALLEGRO_MAP_OBJECT *object = (ALLEGRO_MAP_OBJECT*)objects->data;
		objects = g_slist_next(objects);

		// no need to draw invisible objects
		if (!object->bitmap) {
			continue;
		}

		int x = object->x - sx;
		int y = object->y - sy;

		// make sure it's on-screen; if it's not, don't draw it
		if ((x + object->width) < 0 || x > sw || y < 0 || (y - object->height) > sh) {
			continue;
		}

		al_draw_tinted_bitmap(object->bitmap, color, x, y-object->height, flags);
	}
	
	al_hold_bitmap_drawing(false);
}
예제 #28
0
파일: ttf.c 프로젝트: dradtke/battlechess
// FIXME: Add a special case for when a single glyph rendering won't fit
// into 256x256 pixels.
static ALLEGRO_BITMAP *push_new_page(ALLEGRO_TTF_FONT_DATA *data)
{
    ALLEGRO_BITMAP **back;
    ALLEGRO_BITMAP *page;
    ALLEGRO_STATE state;

    unlock_current_page(data);

    /* The bitmap will be destroyed when the parent font is destroyed so
     * it is not safe to register a destructor for it.
     */
    _al_push_destructor_owner();
    al_store_state(&state, ALLEGRO_STATE_NEW_BITMAP_PARAMETERS);
    al_set_new_bitmap_format(data->bitmap_format);
    al_set_new_bitmap_flags(data->bitmap_flags);
    page = al_create_bitmap(256, 256);
    al_restore_state(&state);
    _al_pop_destructor_owner();

    back = _al_vector_alloc_back(&data->page_bitmaps);
    *back = page;

    /* Sometimes OpenGL will partly sample texels from the border of
     * glyphs. So we better clear the texture to transparency.
     * XXX This is very slow and avoidable with some effort.
     */
    al_store_state(&state, ALLEGRO_STATE_TARGET_BITMAP);
    al_hold_bitmap_drawing(false);
    al_set_target_bitmap(*back);
    al_clear_to_color(al_map_rgba_f(0, 0, 0, 0));
    al_restore_state(&state);

    data->page_pos_x = 0;
    data->page_pos_y = 0;
    data->page_line_height = 0;

    return page;
}
예제 #29
0
void pp2_intro_render(void)
{
	int i;
	ALLEGRO_COLOR tint_color;
	float alpha;

	t3f_select_view(t3f_default_view);
	al_hold_bitmap_drawing(false);
	al_clear_to_color(al_map_rgb(255, 255, 255));
	if(pp2_tick < 210)
	{
		for(i = 0; i < pp2_intro_pixels; i++)
		{
			al_draw_filled_rectangle(t3f_project_x(pp2_intro_pixel[i].x, pp2_intro_pixel[i].z), t3f_project_y(pp2_intro_pixel[i].y, pp2_intro_pixel[i].z), t3f_project_x(pp2_intro_pixel[i].x + 10, pp2_intro_pixel[i].z), t3f_project_y(pp2_intro_pixel[i].y + 10, pp2_intro_pixel[i].z), alpha_color(pp2_intro_pixel[i].color, 1.0 - fabs(pp2_intro_pixel[i].z / 640.0)));
		}
	}
	if(pp2_tick < 180)
	{
		tint_color = al_map_rgba_f(0.0, 0.0, 0.0, 0.0);
	}
	else if(pp2_tick >= 180 && pp2_tick < 210)
	{
		alpha = (float)(pp2_tick - 180) / 30.0;
		tint_color = al_map_rgba_f(alpha, alpha, alpha, alpha);
	}
	else
	{
		tint_color = al_map_rgba_f(1.0, 1.0, 1.0, 1.0);
	}
	t3f_draw_bitmap(pp2_bitmap[PP2_BITMAP_T3_LOGO], tint_color, 120.0, 40.0, 0.0, 0);
	if(pp2_tick > 270)
	{
		alpha = (float)(pp2_tick - 270) / 60.0;
		al_draw_filled_rectangle(0, 0, PP2_SCREEN_WIDTH, PP2_SCREEN_HEIGHT, al_map_rgba_f(0.0, 0.0, 0.0, alpha));
	}
}
예제 #30
0
void mapper_tileset_render(void)
{
	int i;
	int prow;
	int row, col;

	if(mapper_tileset)
	{
		prow = (t3f_virtual_display_width / mapper_tileset->width);
		for(i = 0; i < mapper_tileset->tiles; i++)
		{
			row = i % prow;
			col = i / prow;
			t3f_draw_animation(mapper_tileset->tile[i]->ap, t3f_color_white, mapper_tick, row * mapper_tileset->width, col * mapper_tileset->height, 0, 0);
			if(i == mapper_hover_tile)
			{
				al_hold_bitmap_drawing(false);
				al_draw_rectangle(row * mapper_tileset->width + 0.5, col * mapper_tileset->height + 0.5, row * mapper_tileset->width + mapper_tileset->width - 1 + 0.5, col * mapper_tileset->height + mapper_tileset->height - 1 + 0.5, al_map_rgba_f(0.0, 1.0, 0.0, 0.5), 1.0);
				al_hold_bitmap_drawing(true);
			}
			if(i == mapper_tileset->tiles - 1)
			{
				al_hold_bitmap_drawing(false);
				al_draw_rectangle(row * mapper_tileset->width + 0.5, col * mapper_tileset->height + 0.5, row * mapper_tileset->width + mapper_tileset->width - 1 + 0.5, col * mapper_tileset->height + mapper_tileset->height - 1 + 0.5, al_map_rgba_f(1.0, 0.0, 0.0, 0.5), 1.0);
				al_hold_bitmap_drawing(true);
			}
			if(i == mapper_current_tile)
			{
				al_hold_bitmap_drawing(false);
				al_draw_rectangle(row * mapper_tileset->width + 0.5, col * mapper_tileset->height + 0.5, row * mapper_tileset->width + mapper_tileset->width - 1 + 0.5, col * mapper_tileset->height + mapper_tileset->height - 1 + 0.5, al_map_rgba_f(1.0, 1.0, 1.0, 0.5), 1.0);
				al_hold_bitmap_drawing(true);
			}
		}
	}
	else
	{
		al_draw_textf(mapper_font, t3f_color_white, 0, 0, 0, "Please create or load a tileset.");
	}
}