|
|
//stage class - control room list and display required content #include "cl_stage.h" void STAGE::init() { int i; scr = NULL; for(i=0;i!=ROOM_LAYERS;i++) { layer[i] = NULL; empty_layer[i] = 1; } canvas_w = canvas_h = 0; tile_w = tile_h = 0; tile_cw = tile_ch = 0; rooms = NULL; layers_exists = 0; rn = ""; // data = NULL; } void STAGE::canvas(BITMAP *b) { scr = b; canvas_w = b->w; canvas_h = b->h; } void STAGE::connect_rooms(MI_ROOM *d) { rooms = d; } void STAGE::connect_data(DATADISC *d) { disk = d; if(d) { message("Data source connected"); } } /* void STAGE::connect_data(MI_DATASRC *d) { data = d; } */ void STAGE::clear_layer(int i) { if(i == FOREGROUND_LAYER) { clear_to_color(layer[i], COL_TRANS); } else { clear_bitmap(layer[i]); } } void STAGE::create_layers() { int i; destroy_layers(); for(i=0;i!=ROOM_LAYERS;i++) { layer[i] = create_bitmap(canvas_w, canvas_h); clear_layer(i); } layers_exists = 1; } void STAGE::destroy_layers() { int i; for(i=0;i!=ROOM_LAYERS;i++) { destroy_bitmap_safe(layer[i],"Detroy layer"); layer[i] = NULL; } } int STAGE::draw() { if(!scr){ error("No screenbuffer defined!"); return 1; } if(!layer[DISPLAY_LAYER]) { error("No layer 0 defined"); return 1; } if((canvas_w) && (canvas_h)) { blit(layer[DISPLAY_LAYER], scr, 0, 0, 0, 0, canvas_w, canvas_h); // message("Blit size [%i, %i]", canvas_w, canvas_h); } else { error("Drawing map with zero size"); } return 0; } int STAGE::draw_foreground() { if(!empty_layer[FOREGROUND_LAYER]) { draw_sprite(scr,layer[FOREGROUND_LAYER], 0,0); return 1; //FIXME - small optimization would be good } return 0; } int STAGE::select(string name) { if(rooms->select(name)) { render(); return 1; } rn = name; return 0; } string STAGE::room_name() { message("RN [%s]", rn.c_str()); return rn; } int STAGE::render_internal(int l,int x, int y) { if(!disk) { error("No datasource connected to stage"); return 0; } // tile_w = rooms->tile_w(); // tile_h = rooms->tile_h(); tile_w = tile_h = 16; //FIXME - fixed size of tiles is not good if((!tile_w) || (!tile_h)) { message("Zero size of tiles! Seems strange to display so small tiles"); return 0; } int t = rooms->tile(l,x+y*tile_cw); blit(disk->gettexture(t), layer[l], 0, 0, x*tile_w, y*tile_h, tile_w, tile_h); // blit(disk->gettexture(t), screen, 0,0, 0,0, 16, 16 // message("Render info [%i, %i, %i, %i]", x*tile_w, y*tile_h, tile_w, tile_h); /* if(t) { message("Rendering [%i, %i, %i] -> %i", l, x, y, t); }*/ if(t) { return 1; } else { return 0; } } void STAGE::render_layer(int l) { int a,b; clear_layer( l ); empty_layer[l] = 1; tile_cw = rooms->tile_cw(); tile_ch = rooms->tile_ch(); for(a = 0; a != tile_ch; a++) { for(b = 0; b != tile_cw; b++) { if(render_internal(l,b,a)) { empty_layer[l] = 0; } } } } void STAGE::merge_layer(int src, int dst) { draw_sprite(layer[dst], layer[src], 0,0); } void STAGE::render() { int i; for(i=0;i!=ROOM_LAYERS;i++){ render_layer(i); /* message("Visualization of layer [%i], dimension [%i, %i]", i, layer[i]->w, layer[i]->h); blit(layer[i], screen, 0,0,0,0,640,480); sleep(3);*/ } merge_layer(1,DISPLAY_LAYER); //for faster rendering on screen we merge //middle layer with background // merge_layer(FOREGROUND_LAYER, DISPLAY_LAYER); //test if fg is ok } int STAGE::walkable(int x, int y) { int p; p = getpixel(layer[1], x, y); if(p == COL_TRANS) { return TEX_WALKABLE; } else { return TEX_SOLID; } } void STAGE::tile_list() { int z; int i,l,c,j; l = 0; z = rooms->zero(); c = tile_count(); j = 0; for(i = 0; i != c; i++) { blit(disk->gettexture(i), screen, 0, 0, l, j*16, 16, 16); textprintf(screen, font, l+16, j*16, COL_WHITE, "[%c]", i+z); rect(screen, l+16, j*16, 16, 16, COL_BLACK); j++; if(j*16>SCREEN_SIZE_Y) { j = 0; l += 32; } } } int STAGE::tile_count() { return disk->texture_count(); }
Generated by: georgik on armada on Sat Jul 24 07:07:15 2004, using kdoc 2.0a54. |