From f04bdc6e3147c4a6f1063fa24dd62bb804a8ad6d Mon Sep 17 00:00:00 2001 From: Interfiber Date: Sun, 28 May 2023 12:35:48 -0400 Subject: [PATCH] fix background rendering --- .../index/mapEditor.cpp.D1B6F4A71599CCB9.idx | Bin 4410 -> 4356 bytes imgui.ini | 8 +- include/config.hpp | 4 +- include/map.hpp | 3 + include/state.hpp | 3 + maps/example.map | 248 ++++++++++++++++++ maps/ph_example.map | 8 +- src/collision.cpp | 2 + src/map.cpp | 38 ++- src/phoenix.cpp | 29 +- src/texture.cpp | 10 +- 11 files changed, 335 insertions(+), 18 deletions(-) create mode 100644 maps/example.map diff --git a/.cache/clangd/index/mapEditor.cpp.D1B6F4A71599CCB9.idx b/.cache/clangd/index/mapEditor.cpp.D1B6F4A71599CCB9.idx index 6190a3917bfcc31e7ea345b442c13b02edc56cf8..c19862e325aceb70be3db0a63528a984a66cb62c 100644 GIT binary patch delta 2391 zcmX9=d0bOh7WRuFrQ|&f5RwQFG$0reV?=z&5(M>!q7z26sEi;kBb8PKHwsjZj4SE@ z_K6D?+;FQ)$6c(7qt$U?ccTa@A%JMd<%f7y7Q z8x!+EbxctvAL*g&)~(yEef7^zJe>|sJP)_?@bCWP>4TZuv=a%)aLsUcz@>=#AWI^d zkDz!2mBY{^zfYRyzRq}ZPS`pML zjaI5*u0~AY#p>@h7qT`H5GjlNPT^^Nh0k9>D{i?iTppj`M0lnyvvDZ!xyk8Un*nz0#9qQ*hv5~jLba%$T*A1TB`?%@=^FmZ(-nv`S~qE{gT z!^;$X6V{FCM}Sps^@%7q9ewln$x+=oF(1l&xN+iM@OyP|=foet{{VOMYsV+Ey^eHI zKw954>4rit&qJ>~>AAvSH3ymp5oNDPA5Lt9x)D7&u?gBH2%Knx*2c6Qo_6$R2cmff zPfqNDrVF0qk`A`c93>a1lnqd9V2%WsD#*Eif&3_JjxDPnVr>p=zfar<*x(wsAJe;}~=t zQE6&h7)sCIhr|W_Ny5-=bnNS1Lc8APMqL0 z!G#kiJ546Jz-a-=-EiEE9-Md<+*!EIUAfPzHK=9}r7VK72+o{%1^gAZ(RaY#foh)H zGV}kYjAM7>5_(*McHUPn-zTMvoKHZ8SBBMZ-iMC`RW+xrWb1n9ywa0f7T#_dY<1v7 zOOQq6#3a`wBA2d8r&GyPWs=NNWvLeoHty}~cQl!zYB8)9qZd5P`rzdK3?duGP+JU5g%TS<4onM*-6%a4CV7 z6L-R8C)4}kvY+Wga5)6+x3A=j=iMJWlRlKA&FQtIBKVl$wsjVncF67Uu%7ZbyS{y? zjDU1qy6e$n&#N$F%}YqNz_QyeNw*7JL4-VXF*(VoZkjO#`B*fT}XiK#xR2I=iD z(E-`ZW_Fj0!Lnf5t0-BNBS~$P*Cyj%p3Gi4?mCNdjnh$-I>m#cJX7_XuAZ9bUbpmD zIVY}z>pFJLHo|oyJYzU<3)EZS#fcB0eh9B3?HWz=GWD`QDe8;H#?&lZeKC~+PayOJ zVma{?`kg{3C!T@s3=FJIhMbiQN0>VBIliHL4emBA2 zgyukSwavYxkq!5D3~Yz#Uz+&L@$UnU5in6dQ3~b)1UmxlppnxCp$&TGD6})(0ii?6 z;RNe(@W)vL)PS#Hx)yvb({>l znUF5Xy5RnEQQg{d!?^DVNYE!p19-jFEHnGwiak8xo%hr*f@9^ee67#D?SnisfAj0eKW#{w`OcJl?~VSC z+1(qX9HYDI7CwSUKvnHrcHao<*PZ%p8O8Fi{9%wnN#O7ch=&~Q-ypP9c|){)al z*+{8{h*>liI_X4BBFSA)?}Gos9hEJM_zX9TR3;ZppJ05L)zPTbIhFlw+NE3)a(cKaE~*QWo&R?Xs_FIwfcl z=vA4hnMg8CNb_fTUGvyOvH<}b5X|zs7XJCL1W3#-MW0d_*)%a#f*yw|46Xu=*J=b+ zBZBpesfOXT2(D!X*1=TA?0O8Uw<4VV$?$#z!`mgBU9{(ffyC|vTu#9AZQGGb7sFoz z|JVZM8dgUo_)0bxs=!w4X6ZEmV z_QPkbzZ*W|#8ptPVnezZd@*Qf`)>!oo&6{SU&iz?@W+_G2L2k;*TG+hi}bNailfhg PvZ{ZaD<3G$Qr-POWdrND delta 2395 zcmXX|c~nzp7WWq)5y^X+KuC~0RQ5F=8R)mGC}c{Ab9!99nu$MhoxTl3-H3CQc4 zH>k&&n3PD!g=8iw5@oB4A+iHu9Wd*bj#zdg@}3WUaAK$vv0jUsldlZZiv-leQjY|$ zJC=5%dg^%s+7aF^7rTg_jj%LgSnrRg+Okf(a-}b4AfAz{T*SaPP`p8}pdF(p7C9Tb z(3d*I)FCPKV)b_2g+(O<#4F-ADh>9x=>8UZY0Gu-a@u$|!k2h0=^J@8y4iNdKFS(z)m~(dx@PPL}@d1BG~V-fq#?%>%FbBwHwCu*+aI zFGagVt1a`>my42FMLs3yQ-V;-9%bc8QT5pz_Js8!zfR1Sa2dQ8TH2gae*sudHans zl1~x(6v?-h#?-jbxB=9qPrM&5wLsf~UcA%_eJey>azO83+6jXbec2i6Uc$gjozQi{ zFm_7CqpabaNGaAsxt=+0fpUvHwwtJ31=T80ciSOshdVF*2;oP0X}4YzmwoksiqG}R4NgBBbJOqb z2F94zP`s9Z?IzmCyNx$|=Gj;^I?^OiRStwW5XX4n-HrhnLklK4c9x%_00-h77?#=N z&W+*wd2a&7D989_?LQZtlWnq+X$!SQ%o=xhd#2*Fh6X;m=9uP?JcR+L5c`Fe zThd{l!ib(3kU8{=<`ec;lVtl`N}8w6)A3TiI$t*j_XBSYoztY`rBE(Z#Y+?1CTMtR zirW;D3*8oy+y~cv=*dgO*7NYNt=Q-DDE!uLN?8h3DSGhIH3-+(9Gf9DLp|3cKjz<) z$Fgg26+N#)KR5f;`zg~Bz9t~YCr4IwH`r6dQzc%?aL=GB=BwvxiK*%(By-id+Ia&_ zdxHayOeOaQ3~fO2yp~0Oxb=Pp0#<-q0Yi=^BmD81AzKNkfu#oVi_Iy^ZVd2?Bw)IB zdcb0PsoJ#cG3#k9dah;klhIRVx(u2!=&>O*gGqS|7TshAdxR%J$1P%ALQ&g)Gj`>dHwGiU=B3f+E3{q&~r?#Pk>E zth}+;S(JO47e#5ayeZ0%?OXEw$+@1jdH>>gsTl6X>|$(!`z9EYcxfB7+u*}XZP2#C zXOn)FE-qi2|NkO4jY_(ezw+Ye6nGj@r!j(;D$%bJQM_~xUguzBgcx*Q)~H0T3Dzcg zfJ*ep(dCF+2k*PHaIl{*byN=5aydg4&9#7Qk$0*@?Q@u)!%{Z${x?@rMi!IHknTg| zYE?*JHH2#D4n$P9dG5HwR`pYaJ%#z0E_Gqr`;g-VO!A#1`|u%lCqkW|ZO{R+1HQ~r ze9H7Qh|l2r-QAfxw{yZ13Xt@Ycy3hI>9*I~SG%xFA)I0qsE1I`bOVG2rW+wNGTj8B z37+RJR89Ev&Fl(_{|$=Y;8ErNEJ!e}i6wxIx@xRx+^+B^g|T!DMKBk^!qGbHUxL9L zwQDYi<#Ncb-AOC?ITY{?ig$3k^26ucHpjZF1av~t3D2vWYQL>Cj@?K=x^KFy6MXG) zia7tDMjRUVuJ>or1gCH*LXBV3w)K^!Wn^YVWhB=sweuGpoPLGQV}>|`7SC*PHpvCL z1^y%lE{Ltaw;=fO^Ws|aw+*tzG)yk;y&;W&NJAhMbZW$?^>M%_af+i;-Rvc zqg!{7Q z$U?-k{cbJ7aQ2==l^}uf#afQx4?{IE8|rk2D1pVQv;;rAu&$Rr{dg7-})F7PMyT z5MBo>W0bj`;SGprVEs12+{o-E3}~{$!hUD;egtD@?q-ettQbbsordN#44qF7-_#h# zg#LFTszTOB4TKuDH)piEr R8ggH3y_|h^l^mvS{0|j$>#6_% diff --git a/imgui.ini b/imgui.ini index 2e24dc3..adc23d5 100644 --- a/imgui.ini +++ b/imgui.ini @@ -4,17 +4,17 @@ Size=400,400 Collapsed=0 [Window][Phoenix Map Editor] -Pos=60,60 +Pos=1582,392 Size=521,94 Collapsed=0 [Window][Map Information Editor] -Pos=504,255 +Pos=1433,675 Size=549,264 Collapsed=0 [Window][Map Editor Tools] -Pos=405,187 -Size=276,197 +Pos=995,701 +Size=326,231 Collapsed=0 diff --git a/include/config.hpp b/include/config.hpp index 5ecffdd..a285630 100644 --- a/include/config.hpp +++ b/include/config.hpp @@ -1,8 +1,8 @@ #pragma once // GFX constants -#define SCREEN_WIDTH 1000 -#define SCREEN_HEIGHT 1000 +//#define SCREEN_WIDTH 1000 +//#define SCREEN_HEIGHT 1000 // 32x32 textures #define TEXTURE_WIDTH 32 diff --git a/include/map.hpp b/include/map.hpp index 815f5d0..1a195e6 100644 --- a/include/map.hpp +++ b/include/map.hpp @@ -1,4 +1,5 @@ #pragma once +#include #include #include @@ -27,3 +28,5 @@ Map PLoadMapFromFile(std::string filepath); Map PCreateNewMap(std::string filepath); void PSaveMapToFile(Map *map, std::string filepath); void PRenderMap(Map *map, bool debug = false); +void PRenderMapBackground(Map *map); +SDL_Rect PGetMapRect(Map *map); diff --git a/include/state.hpp b/include/state.hpp index c032483..d363dd3 100644 --- a/include/state.hpp +++ b/include/state.hpp @@ -15,6 +15,9 @@ struct GlobalState { std::vector collisions; PhoenixAssets assets; int scale = 20; + + int screenWidth = 1000; + int screenHeight = 1000; }; extern GlobalState state; diff --git a/maps/example.map b/maps/example.map new file mode 100644 index 0000000..5479866 --- /dev/null +++ b/maps/example.map @@ -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 diff --git a/maps/ph_example.map b/maps/ph_example.map index 0198534..ac3fd84 100644 --- a/maps/ph_example.map +++ b/maps/ph_example.map @@ -1,9 +1,9 @@ MAPNAME ph_exampleMap MAPVERS b1 -MAPAUTH JohnDoe -MAPSIZE 20x20 -MAPSCAL 6x6 -MAPSPWN 499,666 +MAPAUTH Interfiber +MAPSIZE 20x40 +MAPSCAL 5x5 +MAPSPWN 297,619 MAP TILE WALL TILE WALL diff --git a/src/collision.cpp b/src/collision.cpp index 8ea125a..3536c4b 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -2,6 +2,7 @@ #include "config.hpp" #include "player.hpp" #include "state.hpp" +#include void PBuildCollisionFromMap(Map *map) { SDL_Log("Building collision data from map"); @@ -44,6 +45,7 @@ bool PCanMoveTo(int x, int y) { SDL_Rect playerRect = PGetPlayerRect(&state.player); playerRect.x = x; playerRect.y = y; + for (PCollisionRect rect : state.collisions) { if (SDL_HasIntersection(&playerRect, &rect.rect)) { return false; diff --git a/src/map.cpp b/src/map.cpp index f8a3c84..ddcf652 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -95,7 +95,6 @@ void PRenderMap(Map *map, bool debug) { row++; i = 0; } - int x = i * TEXTURE_WIDTH; int y = row * TEXTURE_HEIGHT; @@ -175,3 +174,40 @@ Map PCreateNewMap(std::string filepath) { 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); + } + } +} diff --git a/src/phoenix.cpp b/src/phoenix.cpp index 2633bb3..6102ad4 100644 --- a/src/phoenix.cpp +++ b/src/phoenix.cpp @@ -1,5 +1,6 @@ #include "assets.hpp" #include "collision.hpp" +#include "map.hpp" #include "texture.hpp" #include #include @@ -28,10 +29,11 @@ PhoenixGame::PhoenixGame() { IMG_Init(IMG_INIT_PNG); 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.window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_SOFTWARE); + state.window, -1, SDL_RENDERER_PRESENTVSYNC | SDL_RENDERER_ACCELERATED); // Load textures PRunBoostrap(); @@ -41,8 +43,8 @@ PhoenixGame::PhoenixGame() { state.camera.x = 0; state.camera.y = 0; - state.camera.w = SCREEN_WIDTH; - state.camera.h = SCREEN_HEIGHT; + state.camera.w = state.screenWidth; + state.camera.h = state.screenHeight; state.player.x = m_currentMap.mapPlayerSpawnX; state.player.y = m_currentMap.mapPlayerSpawnY; @@ -57,6 +59,7 @@ void PhoenixGame::render() { SDL_SetRenderDrawColor(state.renderer, 0, 0, 0, 255); SDL_RenderClear(state.renderer); + PRenderMapBackground(&m_currentMap); PRenderMap(&m_currentMap); PRenderPlayer(&state.player); @@ -74,6 +77,20 @@ void PhoenixGame::run() { mb_isOpen = false; 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); @@ -103,9 +120,9 @@ void PhoenixGame::run() { } 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.player.y - ((SCREEN_HEIGHT / m_currentMap.mapScaleY) / 2); + state.player.y - ((state.screenHeight / m_currentMap.mapScaleY) / 2); // Rendering code diff --git a/src/texture.cpp b/src/texture.cpp index 3325766..d6e748a 100644 --- a/src/texture.cpp +++ b/src/texture.cpp @@ -30,5 +30,13 @@ void PRenderTexture(PhoenixTexture *texture, int x, int y) { dstRect.w = TEXTURE_WIDTH; dstRect.h = TEXTURE_HEIGHT; - SDL_RenderCopy(state.renderer, texture->texture, NULL, &dstRect); + 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); + } }