Radar map updates.
This commit is contained in:
parent
c47a15b88a
commit
5f150901e1
|
@ -61,6 +61,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
#define MAP_WIDTH 200
|
||||
#define MAP_HEIGHT 200
|
||||
|
||||
#define MAP_RENDER_WIDTH ((SCREEN_WIDTH / MAP_TILE_SIZE) + 1)
|
||||
#define MAP_RENDER_HEIGHT ((SCREEN_HEIGHT / MAP_TILE_SIZE) + 1)
|
||||
|
||||
#define MAP_TILE_SIZE 64
|
||||
#define MAP_TILE_AIR 0
|
||||
#define MAP_TILE_WATER 1
|
||||
|
|
|
@ -316,6 +316,8 @@ typedef struct {
|
|||
int musicVolume;
|
||||
int keyControls[CONTROL_MAX];
|
||||
int joypadControls[CONTROL_MAX];
|
||||
int hudInventory;
|
||||
int blood;
|
||||
} Config;
|
||||
|
||||
typedef struct {
|
||||
|
@ -367,8 +369,11 @@ typedef struct {
|
|||
|
||||
struct Marker {
|
||||
Sprite *sprite;
|
||||
float x, y;
|
||||
float value;
|
||||
float y;
|
||||
int angle;
|
||||
int visible;
|
||||
int type;
|
||||
Marker *next;
|
||||
};
|
||||
|
||||
|
|
|
@ -104,6 +104,21 @@ void blitRect(SDL_Texture *texture, int x, int y, SDL_Rect *srcRect, int center)
|
|||
SDL_RenderCopy(app.renderer, texture, srcRect, &dstRect);
|
||||
}
|
||||
|
||||
void blitRectRotated(SDL_Texture *texture, int x, int y, SDL_Rect *srcRect, float angle)
|
||||
{
|
||||
SDL_Rect dstRect;
|
||||
|
||||
dstRect.x = x;
|
||||
dstRect.y = y;
|
||||
dstRect.w = srcRect->w;
|
||||
dstRect.h = srcRect->h;
|
||||
|
||||
dstRect.x -= (srcRect->w / 2);
|
||||
dstRect.y -= (srcRect->h / 2);
|
||||
|
||||
SDL_RenderCopyEx(app.renderer, texture, srcRect, &dstRect, angle, NULL, SDL_FLIP_NONE);
|
||||
}
|
||||
|
||||
void blitScaled(SDL_Texture *texture, int x, int y, int w, int h, int center)
|
||||
{
|
||||
SDL_Rect dstRect;
|
||||
|
|
|
@ -24,7 +24,7 @@ void initAtlasTest(void)
|
|||
{
|
||||
dev.cheatStatic = 0;
|
||||
dev.cheatBlind = 0;
|
||||
dev.cheatNoEnemies = 0;
|
||||
dev.cheatNoEnemies = 1;
|
||||
dev.cheatKeys = 1;
|
||||
dev.cheatPower = 1;
|
||||
dev.cheatHealth = 1;
|
||||
|
@ -33,7 +33,7 @@ void initAtlasTest(void)
|
|||
|
||||
initHub();
|
||||
|
||||
loadWorld("beachApproach");
|
||||
loadWorld("beachFront1");
|
||||
|
||||
initWorld();
|
||||
|
||||
|
|
|
@ -57,11 +57,11 @@ void drawMap(void)
|
|||
|
||||
mx = camera.x / MAP_TILE_SIZE;
|
||||
x1 = (camera.x % MAP_TILE_SIZE) * -1;
|
||||
x2 = x1 + RENDER_WIDTH * MAP_TILE_SIZE + (x1 == 0 ? 0 : MAP_TILE_SIZE);
|
||||
x2 = x1 + MAP_RENDER_WIDTH * MAP_TILE_SIZE + (x1 == 0 ? 0 : MAP_TILE_SIZE);
|
||||
|
||||
my = camera.y / MAP_TILE_SIZE;
|
||||
y1 = (camera.y % MAP_TILE_SIZE) * -1;
|
||||
y2 = y1 + RENDER_HEIGHT * MAP_TILE_SIZE + (y1 == 0 ? 0 : MAP_TILE_SIZE);
|
||||
y2 = y1 + MAP_RENDER_HEIGHT * MAP_TILE_SIZE + (y1 == 0 ? 0 : MAP_TILE_SIZE);
|
||||
|
||||
tile = 0;
|
||||
decal = 0;
|
||||
|
@ -201,13 +201,13 @@ static void calculateMapBounds(void)
|
|||
}
|
||||
}
|
||||
|
||||
if (world.map.bounds.h - RENDER_HEIGHT < world.map.bounds.y)
|
||||
if (world.map.bounds.h - MAP_RENDER_HEIGHT < world.map.bounds.y)
|
||||
{
|
||||
world.map.bounds.y = 0;
|
||||
}
|
||||
|
||||
world.map.bounds.x = (int) limit(world.map.bounds.x, 0, MAP_WIDTH - RENDER_WIDTH);
|
||||
world.map.bounds.y = (int) limit(world.map.bounds.y, 0, MAP_HEIGHT - RENDER_HEIGHT);
|
||||
world.map.bounds.x = (int) limit(world.map.bounds.x, 0, MAP_WIDTH - MAP_RENDER_WIDTH);
|
||||
world.map.bounds.y = (int) limit(world.map.bounds.y, 0, MAP_HEIGHT - MAP_RENDER_HEIGHT);
|
||||
|
||||
world.map.bounds.x *= MAP_TILE_SIZE;
|
||||
world.map.bounds.y *= MAP_TILE_SIZE;
|
||||
|
|
|
@ -20,9 +20,6 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
|
||||
#include "../common.h"
|
||||
|
||||
#define RENDER_WIDTH ((SCREEN_WIDTH / MAP_TILE_SIZE) + 1)
|
||||
#define RENDER_HEIGHT ((SCREEN_HEIGHT / MAP_TILE_SIZE) + 1)
|
||||
|
||||
extern float limit(float i, float a, float b);
|
||||
extern int rrnd(int low, int high);
|
||||
extern char *readCompressedFile(const char *filename);
|
||||
|
|
|
@ -27,35 +27,92 @@ static void drawMap(void);
|
|||
static void drawEntities(void);
|
||||
static int isValidBlip(Entity *e);
|
||||
static void getBlipColor(Entity *e, SDL_Color *c);
|
||||
static void drawMarkers(void);
|
||||
static void initMarker(int i, int x, int y, int angle, int type);
|
||||
|
||||
static SDL_Rect viewRect;
|
||||
static Texture *atlasTexture;
|
||||
static Atlas *background;
|
||||
static Atlas *arrow;
|
||||
static int blinkTimer;
|
||||
static Marker marker[M_MAX * 4];
|
||||
|
||||
void initRadar(void)
|
||||
{
|
||||
SDL_Rect limits;
|
||||
|
||||
app.delegate.logic = logic;
|
||||
app.delegate.draw = draw;
|
||||
|
||||
viewRect.x = (world.bob->x / MAP_TILE_SIZE) - (VIEW_SIZE / 2);
|
||||
viewRect.y = (world.bob->y / MAP_TILE_SIZE) - (VIEW_SIZE / 2);
|
||||
viewRect.w = VIEW_SIZE;
|
||||
viewRect.h = VIEW_SIZE;
|
||||
viewRect.x = (world.bob->x / MAP_TILE_SIZE) - (VIEW_SIZE_X / 2);
|
||||
viewRect.y = (world.bob->y / MAP_TILE_SIZE) - (VIEW_SIZE_Y / 2);
|
||||
viewRect.w = VIEW_SIZE_X;
|
||||
viewRect.h = VIEW_SIZE_Y;
|
||||
|
||||
limits.x = world.map.bounds.x / MAP_TILE_SIZE;
|
||||
limits.y = world.map.bounds.y / MAP_TILE_SIZE;
|
||||
limits.w = (world.map.bounds.w / MAP_TILE_SIZE) - MAP_RENDER_WIDTH;
|
||||
limits.h = (world.map.bounds.h / MAP_TILE_SIZE) - MAP_RENDER_HEIGHT;
|
||||
|
||||
viewRect.x = limit(viewRect.x, limits.x, limits.w);
|
||||
viewRect.y = limit(viewRect.y, limits.y, limits.h);
|
||||
|
||||
blinkTimer = 0;
|
||||
|
||||
atlasTexture = getTexture("gfx/atlas/atlas.png");
|
||||
|
||||
background = getImageFromAtlas("gfx/radar/background.png");
|
||||
arrow = getImageFromAtlas("gfx/radar/arrow.png");
|
||||
|
||||
/* top */
|
||||
initMarker(0, SCREEN_WIDTH / 2 - 275, SCREEN_HEIGHT / 2 - 275, 0, M_MIA);
|
||||
initMarker(1, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 - 275, 0, M_ITEM);
|
||||
initMarker(2, SCREEN_WIDTH / 2 + 275, SCREEN_HEIGHT / 2 - 275, 0, M_ENEMY);
|
||||
|
||||
/* bottom */
|
||||
initMarker(3, SCREEN_WIDTH / 2 - 275, SCREEN_HEIGHT / 2 + 275, 180, M_MIA);
|
||||
initMarker(4, SCREEN_WIDTH / 2, SCREEN_HEIGHT / 2 + 275, 180, M_ITEM);
|
||||
initMarker(5, SCREEN_WIDTH / 2 + 275, SCREEN_HEIGHT / 2 + 275, 180, M_ENEMY);
|
||||
|
||||
/* left */
|
||||
initMarker(6, SCREEN_WIDTH / 2 - 450, SCREEN_HEIGHT / 2 - 200, 270, M_MIA);
|
||||
initMarker(7, SCREEN_WIDTH / 2 - 450, SCREEN_HEIGHT / 2, 270, M_ITEM);
|
||||
initMarker(8, SCREEN_WIDTH / 2 - 450, SCREEN_HEIGHT / 2 + 200, 270, M_ENEMY);
|
||||
|
||||
/* right */
|
||||
initMarker(9, SCREEN_WIDTH / 2 + 450, SCREEN_HEIGHT / 2 - 200, 90, M_MIA);
|
||||
initMarker(10, SCREEN_WIDTH / 2 + 450, SCREEN_HEIGHT / 2, 90, M_ITEM);
|
||||
initMarker(11, SCREEN_WIDTH / 2 + 450, SCREEN_HEIGHT / 2 + 200, 90, M_ENEMY);
|
||||
}
|
||||
|
||||
static void initMarker(int i, int x, int y, int angle, int type)
|
||||
{
|
||||
marker[i].x = x;
|
||||
marker[i].y = y;
|
||||
marker[i].angle = angle;
|
||||
marker[i].type = type;
|
||||
}
|
||||
|
||||
static void logic(void)
|
||||
{
|
||||
|
||||
blinkTimer++;
|
||||
blinkTimer %= 60;
|
||||
}
|
||||
|
||||
static void draw(void)
|
||||
{
|
||||
blitRectScaled(atlasTexture->texture, 0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, &background->rect, 0);
|
||||
|
||||
drawMap();
|
||||
|
||||
drawEntities();
|
||||
|
||||
drawMarkers();
|
||||
}
|
||||
|
||||
static void drawMap(void)
|
||||
{
|
||||
int x, y, mx, my;
|
||||
int x, y, mx, my, i;
|
||||
SDL_Color c;
|
||||
|
||||
for (x = 0 ; x < viewRect.w ; x++)
|
||||
|
@ -65,17 +122,23 @@ static void drawMap(void)
|
|||
mx = viewRect.x + x;
|
||||
my = viewRect.y + y;
|
||||
|
||||
drawRect(OFFSET_X + (x * RADAR_TILE_SIZE), OFFSET_Y + (y * RADAR_TILE_SIZE), RADAR_TILE_SIZE - 1, RADAR_TILE_SIZE - 1, 0, 0, 0, 255);
|
||||
|
||||
if (isWithinMap(mx, my))
|
||||
{
|
||||
if (world.map.data[mx][my] > MAP_TILE_AIR)
|
||||
i = world.map.data[mx][my];
|
||||
|
||||
if (i > MAP_TILE_AIR && i < MAP_TILE_NON_SOLID)
|
||||
{
|
||||
getMapTileColor(world.map.data[mx][my], &c);
|
||||
getMapTileColor(i, &c);
|
||||
|
||||
drawRect(OFFSET_X + (x * RADAR_TILE_SIZE), OFFSET_Y + (y * RADAR_TILE_SIZE), RADAR_TILE_SIZE - 1, RADAR_TILE_SIZE - 1, c.r, c.g, c.b, 255);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
drawOutlineRect(OFFSET_X, OFFSET_Y, viewRect.w * RADAR_TILE_SIZE, viewRect.h * RADAR_TILE_SIZE, 0, 128, 0, 255);
|
||||
}
|
||||
|
||||
static void getMapTileColor(int i, SDL_Color *c)
|
||||
|
@ -85,17 +148,15 @@ static void getMapTileColor(int i, SDL_Color *c)
|
|||
switch (i)
|
||||
{
|
||||
case MAP_TILE_WATER:
|
||||
c->r = c->g = c->b = 128;
|
||||
c->b = 255;
|
||||
break;
|
||||
|
||||
case MAP_TILE_SLIME:
|
||||
c->r = c->g = c->b = 128;
|
||||
c->g = 255;
|
||||
break;
|
||||
|
||||
case MAP_TILE_LAVA:
|
||||
c->r = c->g = c->b = 128;
|
||||
c->g = 128;
|
||||
c->r = 255;
|
||||
break;
|
||||
|
||||
|
@ -143,17 +204,19 @@ static int isValidBlip(Entity *e)
|
|||
switch (e->type)
|
||||
{
|
||||
case ET_BOB:
|
||||
return 1;
|
||||
case ET_MIA:
|
||||
case ET_TEEKA:
|
||||
return blinkTimer < 30;
|
||||
|
||||
case ET_ENEMY:
|
||||
case ET_TEEKA:
|
||||
case ET_BOSS:
|
||||
case ET_HEART_CELL:
|
||||
case ET_KEY:
|
||||
return e->isMissionTarget ? blinkTimer < 30 : 1;
|
||||
|
||||
case ET_ITEM:
|
||||
case ET_MIA:
|
||||
case ET_DESTRUCTABLE:
|
||||
return 1;
|
||||
return e->isMissionTarget && blinkTimer < 30;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
|
@ -169,18 +232,27 @@ static void getBlipColor(Entity *e, SDL_Color *c)
|
|||
switch (e->type)
|
||||
{
|
||||
case ET_BOB:
|
||||
c->r = c->g = c->b = 255;
|
||||
break;
|
||||
|
||||
case ET_ENEMY:
|
||||
case ET_BOSS:
|
||||
c->r = 255;
|
||||
break;
|
||||
|
||||
case ET_TEEKA:
|
||||
case ET_BOSS:
|
||||
case ET_MIA:
|
||||
c->r = c->g = 255;
|
||||
break;
|
||||
|
||||
|
||||
case ET_HEART_CELL:
|
||||
case ET_KEY:
|
||||
case ET_ITEM:
|
||||
case ET_MIA:
|
||||
c->g = 168;
|
||||
c->b = 255;
|
||||
break;
|
||||
|
||||
case ET_DESTRUCTABLE:
|
||||
c->r = c->b = 255;
|
||||
break;
|
||||
|
@ -189,3 +261,30 @@ static void getBlipColor(Entity *e, SDL_Color *c)
|
|||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void drawMarkers(void)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < M_MAX * 4 ; i++)
|
||||
{
|
||||
switch (i % M_MAX)
|
||||
{
|
||||
case M_MIA:
|
||||
SDL_SetTextureColorMod(atlasTexture->texture, 255, 255, 0);
|
||||
break;
|
||||
|
||||
case M_ITEM:
|
||||
SDL_SetTextureColorMod(atlasTexture->texture, 0, 192, 255);
|
||||
break;
|
||||
|
||||
case M_ENEMY:
|
||||
SDL_SetTextureColorMod(atlasTexture->texture, 255, 0, 0);
|
||||
break;
|
||||
}
|
||||
|
||||
blitRectRotated(atlasTexture->texture, marker[i].x, marker[i].y, &arrow->rect, marker[i].angle);
|
||||
}
|
||||
|
||||
SDL_SetTextureColorMod(atlasTexture->texture, 255, 255, 255);
|
||||
}
|
||||
|
|
|
@ -18,16 +18,32 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|||
|
||||
*/
|
||||
|
||||
#define RADAR_TILE_SIZE 16
|
||||
#define VIEW_SIZE 40
|
||||
#define OFFSET_X ((SCREEN_WIDTH - (RADAR_TILE_SIZE * VIEW_SIZE)) / 2)
|
||||
#define OFFSET_Y ((SCREEN_HEIGHT - (RADAR_TILE_SIZE * VIEW_SIZE)) / 2)
|
||||
|
||||
#include "../common.h"
|
||||
|
||||
#define RADAR_TILE_SIZE 16
|
||||
#define VIEW_SIZE_X 50
|
||||
#define VIEW_SIZE_Y 30
|
||||
#define OFFSET_X ((SCREEN_WIDTH - (RADAR_TILE_SIZE * VIEW_SIZE_X)) / 2)
|
||||
#define OFFSET_Y ((SCREEN_HEIGHT - (RADAR_TILE_SIZE * VIEW_SIZE_Y)) / 2)
|
||||
|
||||
enum
|
||||
{
|
||||
M_MIA,
|
||||
M_ITEM,
|
||||
M_ENEMY,
|
||||
M_MAX
|
||||
};
|
||||
|
||||
extern int isWithinMap(int x, int y);
|
||||
extern Entity **getAllEntsWithin(int x, int y, int w, int h, Entity *ignore);
|
||||
extern void drawRect(int x, int y, int w, int h, int r, int g, int b, int a);
|
||||
extern float limit(float i, float low, float high);
|
||||
extern Texture *getTexture(const char *filename);
|
||||
extern Atlas *getImageFromAtlas(char *filename);
|
||||
extern void blitRectScaled(SDL_Texture *texture, int x, int y, int w, int h, SDL_Rect *srcRect, int center);
|
||||
extern void drawOutlineRect(int x, int y, int w, int h, int r, int g, int b, int a);
|
||||
extern void blitRect(SDL_Texture *texture, int x, int y, SDL_Rect *srcRect, int center);
|
||||
extern void blitRectRotated(SDL_Texture *texture, int x, int y, SDL_Rect *srcRect, float angle);
|
||||
|
||||
extern App app;
|
||||
extern World world;
|
||||
|
|
Loading…
Reference in New Issue