libMicrofx/microfx_src/src/ext/gametools/map.c

65 lines
2.0 KiB
C

#include "../../../include/microfx/ext/gametools.h"
#include "../../../include/microfx/ext/img.h"
#include "../../../include/microfx/microfx.h"
void vmap(int sx, int sy, MMap *map) {
/* Dessine la map à l'écran. */
/* x et y contiendront la position à laquelle je suis dans la boucle. */
int x, y;
/* Le nombre de tuiles sur x avant le bout de carte qu'on voit est dans tx,
pareil pour y. */
int tx = sx/map->tw, ty = sy/map->th;
/* mx contient le nombre de pixels qui seront cachés sur x, pareil pour
y. */
int mx = sx-tx*map->tw, my = sy-ty*map->th;
/* tile contient la tuile à dessiner */
unsigned char tile;
/* J'ajuste sx. */
if(sx-SWIDTH/2<0){
/* Si je ne peux pas centrer le joueur car je suis trop proche du bord
gauche de la map. */
map->px = sx;
sx = 0;
}else if(sx+SWIDTH/2>map->w*map->tw){
/* Si je ne peux pas centrer le joueur car je suis trop proche du bord
droit de la map. */
map->px = sx-(map->w*map->tw-SWIDTH/2);
sx = map->w*map->tw-SWIDTH/2;
}else{
/* Sinon je peux centrer le joueur. */
sx = sx-SWIDTH/2;
map->px = SWIDTH/2;
}
/* J'ajuste sy. */
if(sy-SHEIGHT/2<0){
/* Si je ne peux pas centrer le joueur car je suis trop proche du haut
de la map. */
map->py = sy;
sy = 0;
}else if(sy+SHEIGHT/2>map->h*map->th){
/* Si je ne peux pas centrer le joueur car je suis trop proche du bas de
la map. */
map->py = sy-(map->h*map->th-SHEIGHT/2);
sy = map->h*map->th-SHEIGHT/2;
}else{
/* Sinon je peux centrer le joueur. */
sy = sy-SHEIGHT/2;
map->py = SHEIGHT/2;
}
tx = sx/map->tw;
ty = sy/map->th;
for(y=0;y<map->h;y++){
for(x=0;x<map->w;x++){
/* Je récupère la tuile dans map et je la dessine si tx+x est plus
petit que la largeur de la map. */
if(tx+x < map->w){
tile = map->map[(ty+y)*map->w+tx+x];
if(tile > 0){
simage(x*map->tw-mx, y*map->th-my, map->tw, map->th,
map->tileset[(int)tile-1], SNORMAL);
}
}
}
}
}