void MapRenderer::renderOrtho(std::vector<Renderable> &r, std::vector<Renderable> &r_dead) { unsigned index = 0; while (index < index_objectlayer) renderOrthoLayer(layers[index++]); renderOrthoBackObjects(r_dead); renderOrthoFrontObjects(r); index++; while (index < layers.size()) renderOrthoLayer(layers[index++]); checkTooltip(); }
/** * Sets and releases the "pressed" visual state of the button * If press and release, activate (return true) */ bool WidgetButton::checkClick(int x, int y) { Point mouse(x,y); // Change the hover state hover = isWithinRect(pos, mouse); // Check the tooltip tip_new = checkTooltip(mouse); // disabled buttons can't be clicked; if (!enabled) return false; // main button already in use, new click not allowed if (inpt->lock[MAIN1]) return false; if (inpt->lock[ACCEPT]) return false; // main click released, so the button state goes back to unpressed if (pressed && !inpt->lock[MAIN1] && !inpt->lock[ACCEPT]) { pressed = false; return true; } pressed = false; // detect new click if (inpt->pressing[MAIN1]) { if (isWithinRect(pos, mouse)) { inpt->lock[MAIN1] = true; pressed = true; } } return false; }
void MapIso::render(Renderable r[], int rnum) { // r will become a list of renderables. Everything not on the map already: // - hero // - npcs // - monsters // - loot // - special effects // we want to sort these by map draw order. Then, we use a cursor to move through the // renderables while we're also moving through the map tiles. After we draw each map tile we // check to see if it's time to draw the next renderable yet. short unsigned int i; short unsigned int j; //SDL_Rect src; SDL_Rect dest; int current_tile; Point xcam; Point ycam; if (shaky_cam_ticks == 0) { xcam.x = cam.x/UNITS_PER_PIXEL_X; xcam.y = cam.y/UNITS_PER_PIXEL_X; ycam.x = cam.x/UNITS_PER_PIXEL_Y; ycam.y = cam.y/UNITS_PER_PIXEL_Y; } else { xcam.x = (cam.x + rand() % 16 - 8) /UNITS_PER_PIXEL_X; xcam.y = (cam.y + rand() % 16 - 8) /UNITS_PER_PIXEL_X; ycam.x = (cam.x + rand() % 16 - 8) /UNITS_PER_PIXEL_Y; ycam.y = (cam.y + rand() % 16 - 8) /UNITS_PER_PIXEL_Y; } // todo: trim by screen rect // background for (j=0; j<h; j++) { for (i=0; i<w; i++) { current_tile = background[i][j]; if (current_tile > 0) { dest.x = VIEW_W_HALF + (i * TILE_W_HALF - xcam.x) - (j * TILE_W_HALF - xcam.y); dest.y = VIEW_H_HALF + (i * TILE_H_HALF - ycam.x) + (j * TILE_H_HALF - ycam.y) + TILE_H_HALF; // adding TILE_H_HALF gets us to the tile center instead of top corner dest.x -= tset.tiles[current_tile].offset.x; dest.y -= tset.tiles[current_tile].offset.y; dest.w = tset.tiles[current_tile].src.w; dest.h = tset.tiles[current_tile].src.h; SDL_BlitSurface(tset.sprites, &(tset.tiles[current_tile].src), screen, &dest); } } } // some renderables are drawn above the background and below the objects for (int ri = 0; ri < rnum; ri++) { if (!r[ri].object_layer) { // draw renderable dest.w = r[ri].src.w; dest.h = r[ri].src.h; dest.x = VIEW_W_HALF + (r[ri].map_pos.x/UNITS_PER_PIXEL_X - xcam.x) - (r[ri].map_pos.y/UNITS_PER_PIXEL_X - xcam.y) - r[ri].offset.x; dest.y = VIEW_H_HALF + (r[ri].map_pos.x/UNITS_PER_PIXEL_Y - ycam.x) + (r[ri].map_pos.y/UNITS_PER_PIXEL_Y - ycam.y) - r[ri].offset.y; SDL_BlitSurface(r[ri].sprite, &r[ri].src, screen, &dest); } } int r_cursor = 0; // todo: trim by screen rect // object layer for (j=0; j<h; j++) { for (i=0; i<w; i++) { current_tile = object[i][j]; if (current_tile > 0) { dest.x = VIEW_W_HALF + (i * TILE_W_HALF - xcam.x) - (j * TILE_W_HALF - xcam.y); dest.y = VIEW_H_HALF + (i * TILE_H_HALF - ycam.x) + (j * TILE_H_HALF - ycam.y) + TILE_H_HALF; // adding TILE_H_HALF gets us to the tile center instead of top corner dest.x -= tset.tiles[current_tile].offset.x; dest.y -= tset.tiles[current_tile].offset.y; dest.w = tset.tiles[current_tile].src.w; dest.h = tset.tiles[current_tile].src.h; SDL_BlitSurface(tset.sprites, &(tset.tiles[current_tile].src), screen, &dest); } // some renderable entities go in this layer while (r_cursor < rnum && r[r_cursor].tile.x == i && r[r_cursor].tile.y == j) { if (r[r_cursor].object_layer) { // draw renderable dest.w = r[r_cursor].src.w; dest.h = r[r_cursor].src.h; dest.x = VIEW_W_HALF + (r[r_cursor].map_pos.x/UNITS_PER_PIXEL_X - xcam.x) - (r[r_cursor].map_pos.y/UNITS_PER_PIXEL_X - xcam.y) - r[r_cursor].offset.x; dest.y = VIEW_H_HALF + (r[r_cursor].map_pos.x/UNITS_PER_PIXEL_Y - ycam.x) + (r[r_cursor].map_pos.y/UNITS_PER_PIXEL_Y - ycam.y) - r[r_cursor].offset.y; SDL_BlitSurface(r[r_cursor].sprite, &r[r_cursor].src, screen, &dest); } r_cursor++; } } } //render event tooltips checkTooltip(); }