This repository has been archived on 2022-01-13. You can view files and clone it, but cannot push or open issues or pull requests.
jtmm2-old/src/level.c

55 lines
1.7 KiB
C

#include <gint/display.h>
#include "conf.h"
#include "level.h"
#include "camera.h"
#include "tiles.h"
#define VEC_PRECISE_HALF_DISP (Vec){DWIDTH * VEC_PRECISION / (2 * SCALE), DHEIGHT * VEC_PRECISION / (2 * SCALE)}
void level_step(const Level *level) {
}
void level_draw(const Level *level, Camera *camera) {
for (int i = 0; i < level->layers_count; ++i) {
layer_draw(level, camera, i);
}
}
void layer_draw(const Level *level, Camera *camera, uint layer_id) {
/* Include tileset. */
extern bopti_image_t img_tileset;
const Tile *layer = level->layers[layer_id];
#ifdef FX9860G
const int color = C_LIGHT;
#endif /* FX9860G */
#ifdef FXCG50
const int color = C_GREEN;
#endif /* FXCG50 */
Vec display_tl, display_br;
vec_cpy(&display_tl, camera->pos);
vec_cpy(&display_br, display_tl);
vec_sub(&display_tl, VEC_PRECISE_HALF_DISP);
vec_add(&display_br, VEC_PRECISE_HALF_DISP);
vec_div(&display_tl, TILE_SIZE);
vec_div(&display_br, TILE_SIZE);
int start_x = (display_tl.x > 0) ? (display_tl.x) : (0);
int start_y = (display_tl.y > 0) ? (display_tl.y) : (0);
int end_x = (display_br.x < level->width) ? (display_br.x + 1) : (level->width);
int end_y = (display_br.y < level->height) ? (display_br.y + 1) : (level->height);
for (int y = start_y; y < end_y; ++y) {
for (int x = start_x; x < end_x; ++x) {
const Tile tile = layer[x + y * level->width];
if (tile) {
const Vec tl = {
(x * TILE_SIZE / VEC_PRECISION - camera->offset.x) * SCALE,
(y * TILE_SIZE / VEC_PRECISION - camera->offset.y) * SCALE };
dsubimage(tl.x, tl.y, &img_tileset,
tile % TILESET_WIDTH * TILE_PX_SIZE,
tile / TILESET_WIDTH * TILE_PX_SIZE,
TILE_PX_SIZE, TILE_PX_SIZE, 0);
}
}
}
}