fix background rendering

This commit is contained in:
Hunter 2023-05-28 12:35:48 -04:00
parent ae1e3e5aa3
commit f04bdc6e31
11 changed files with 335 additions and 18 deletions

View file

@ -4,17 +4,17 @@ Size=400,400
Collapsed=0 Collapsed=0
[Window][Phoenix Map Editor] [Window][Phoenix Map Editor]
Pos=60,60 Pos=1582,392
Size=521,94 Size=521,94
Collapsed=0 Collapsed=0
[Window][Map Information Editor] [Window][Map Information Editor]
Pos=504,255 Pos=1433,675
Size=549,264 Size=549,264
Collapsed=0 Collapsed=0
[Window][Map Editor Tools] [Window][Map Editor Tools]
Pos=405,187 Pos=995,701
Size=276,197 Size=326,231
Collapsed=0 Collapsed=0

View file

@ -1,8 +1,8 @@
#pragma once #pragma once
// GFX constants // GFX constants
#define SCREEN_WIDTH 1000 //#define SCREEN_WIDTH 1000
#define SCREEN_HEIGHT 1000 //#define SCREEN_HEIGHT 1000
// 32x32 textures // 32x32 textures
#define TEXTURE_WIDTH 32 #define TEXTURE_WIDTH 32

View file

@ -1,4 +1,5 @@
#pragma once #pragma once
#include <SDL.h>
#include <string> #include <string>
#include <vector> #include <vector>
@ -27,3 +28,5 @@ Map PLoadMapFromFile(std::string filepath);
Map PCreateNewMap(std::string filepath); Map PCreateNewMap(std::string filepath);
void PSaveMapToFile(Map *map, std::string filepath); void PSaveMapToFile(Map *map, std::string filepath);
void PRenderMap(Map *map, bool debug = false); void PRenderMap(Map *map, bool debug = false);
void PRenderMapBackground(Map *map);
SDL_Rect PGetMapRect(Map *map);

View file

@ -15,6 +15,9 @@ struct GlobalState {
std::vector<PCollisionRect> collisions; std::vector<PCollisionRect> collisions;
PhoenixAssets assets; PhoenixAssets assets;
int scale = 20; int scale = 20;
int screenWidth = 1000;
int screenHeight = 1000;
}; };
extern GlobalState state; extern GlobalState state;

248
maps/example.map Normal file
View file

@ -0,0 +1,248 @@
MAPNAME ph_exampleMap
MAPVERS b1
MAPAUTH John
MAPSIZE 20x20
MAPSCAL 1x1
MAPSPWN 484,274
MAP
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE FLOOR
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
TILE WALL
ENDMAP

View file

@ -1,9 +1,9 @@
MAPNAME ph_exampleMap MAPNAME ph_exampleMap
MAPVERS b1 MAPVERS b1
MAPAUTH JohnDoe MAPAUTH Interfiber
MAPSIZE 20x20 MAPSIZE 20x40
MAPSCAL 6x6 MAPSCAL 5x5
MAPSPWN 499,666 MAPSPWN 297,619
MAP MAP
TILE WALL TILE WALL
TILE WALL TILE WALL

View file

@ -2,6 +2,7 @@
#include "config.hpp" #include "config.hpp"
#include "player.hpp" #include "player.hpp"
#include "state.hpp" #include "state.hpp"
#include <iostream>
void PBuildCollisionFromMap(Map *map) { void PBuildCollisionFromMap(Map *map) {
SDL_Log("Building collision data from map"); SDL_Log("Building collision data from map");
@ -44,6 +45,7 @@ bool PCanMoveTo(int x, int y) {
SDL_Rect playerRect = PGetPlayerRect(&state.player); SDL_Rect playerRect = PGetPlayerRect(&state.player);
playerRect.x = x; playerRect.x = x;
playerRect.y = y; playerRect.y = y;
for (PCollisionRect rect : state.collisions) { for (PCollisionRect rect : state.collisions) {
if (SDL_HasIntersection(&playerRect, &rect.rect)) { if (SDL_HasIntersection(&playerRect, &rect.rect)) {
return false; return false;

View file

@ -95,7 +95,6 @@ void PRenderMap(Map *map, bool debug) {
row++; row++;
i = 0; i = 0;
} }
int x = i * TEXTURE_WIDTH; int x = i * TEXTURE_WIDTH;
int y = row * TEXTURE_HEIGHT; int y = row * TEXTURE_HEIGHT;
@ -175,3 +174,40 @@ Map PCreateNewMap(std::string filepath) {
return map; return map;
} }
SDL_Rect PGetMapRect(Map *map) {
SDL_Rect mapRect{};
mapRect.x = 0;
mapRect.y = 0;
mapRect.w = map->mapWidth;
mapRect.h = map->mapHeight;
return mapRect;
}
void PRenderMapBackground(Map *map) {
PhoenixTexture *wallTexture = PGetTextureById(BRICK_WALL_TEXTURE_ID);
for (int x = 0; x < state.screenWidth; x += 32) {
for (int y = 0; y < state.screenHeight; y += 32) {
PRenderTexture(wallTexture, x, y);
}
}
for (int x = 0; x < state.screenWidth; x += 32) {
for (int y = 0; y < state.screenHeight; y += 32) {
}
}
for (int y = 0; y < state.screenHeight; y += 32) {
for (int x = 0; x < state.screenWidth; x += 32) {
PRenderTexture(wallTexture, -x, y);
}
}
for (int y = 0; y < state.screenHeight; y += 32) {
for (int x = -state.screenWidth; x < state.screenWidth; x += 32) {
PRenderTexture(wallTexture, x, -y);
}
}
}

View file

@ -1,5 +1,6 @@
#include "assets.hpp" #include "assets.hpp"
#include "collision.hpp" #include "collision.hpp"
#include "map.hpp"
#include "texture.hpp" #include "texture.hpp"
#include <SDL_image.h> #include <SDL_image.h>
#include <SDL_pixels.h> #include <SDL_pixels.h>
@ -28,10 +29,11 @@ PhoenixGame::PhoenixGame() {
IMG_Init(IMG_INIT_PNG); IMG_Init(IMG_INIT_PNG);
state.window = SDL_CreateWindow("Phoenix", SDL_WINDOWPOS_CENTERED, state.window = SDL_CreateWindow("Phoenix", SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, 1000, 1000, 0); SDL_WINDOWPOS_CENTERED, 1000, 1000,
SDL_WINDOW_RESIZABLE);
state.renderer = SDL_CreateRenderer( state.renderer = SDL_CreateRenderer(
state.window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_SOFTWARE); state.window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED);
// Load textures // Load textures
PRunBoostrap(); PRunBoostrap();
@ -41,8 +43,8 @@ PhoenixGame::PhoenixGame() {
state.camera.x = 0; state.camera.x = 0;
state.camera.y = 0; state.camera.y = 0;
state.camera.w = SCREEN_WIDTH; state.camera.w = state.screenWidth;
state.camera.h = SCREEN_HEIGHT; state.camera.h = state.screenHeight;
state.player.x = m_currentMap.mapPlayerSpawnX; state.player.x = m_currentMap.mapPlayerSpawnX;
state.player.y = m_currentMap.mapPlayerSpawnY; state.player.y = m_currentMap.mapPlayerSpawnY;
@ -57,6 +59,7 @@ void PhoenixGame::render() {
SDL_SetRenderDrawColor(state.renderer, 0, 0, 0, 255); SDL_SetRenderDrawColor(state.renderer, 0, 0, 0, 255);
SDL_RenderClear(state.renderer); SDL_RenderClear(state.renderer);
PRenderMapBackground(&m_currentMap);
PRenderMap(&m_currentMap); PRenderMap(&m_currentMap);
PRenderPlayer(&state.player); PRenderPlayer(&state.player);
@ -74,6 +77,20 @@ void PhoenixGame::run() {
mb_isOpen = false; mb_isOpen = false;
break; break;
} }
if (event.type == SDL_WINDOWEVENT) {
if (event.window.event == SDL_WINDOWEVENT_RESIZED) {
state.screenWidth = event.window.data1;
state.screenHeight = event.window.data2;
// Ajust camera position
state.camera.x = state.player.x -
((state.screenWidth / m_currentMap.mapScaleX) / 2);
state.camera.y = state.player.y -
((state.screenHeight / m_currentMap.mapScaleY) / 2);
break;
}
}
} }
unsigned char const *keys = SDL_GetKeyboardState(nullptr); unsigned char const *keys = SDL_GetKeyboardState(nullptr);
@ -103,9 +120,9 @@ void PhoenixGame::run() {
} }
state.camera.x = state.camera.x =
state.player.x - ((SCREEN_WIDTH / m_currentMap.mapScaleX) / 2); state.player.x - ((state.screenWidth / m_currentMap.mapScaleX) / 2);
state.camera.y = state.camera.y =
state.player.y - ((SCREEN_HEIGHT / m_currentMap.mapScaleY) / 2); state.player.y - ((state.screenHeight / m_currentMap.mapScaleY) / 2);
// Rendering code // Rendering code

View file

@ -30,5 +30,13 @@ void PRenderTexture(PhoenixTexture *texture, int x, int y) {
dstRect.w = TEXTURE_WIDTH; dstRect.w = TEXTURE_WIDTH;
dstRect.h = TEXTURE_HEIGHT; dstRect.h = TEXTURE_HEIGHT;
SDL_Rect screenRect{};
screenRect.x = 0;
screenRect.y = 0;
screenRect.w = state.screenWidth;
screenRect.h = state.screenHeight;
if (SDL_HasIntersection(&dstRect, &screenRect)) {
SDL_RenderCopy(state.renderer, texture->texture, NULL, &dstRect); SDL_RenderCopy(state.renderer, texture->texture, NULL, &dstRect);
} }
}