Detect connected tile groups and allow for fade out of the foreground layer when the player gets in range. These groups are initialized on level loading and self-expand.
This commit is contained in:
parent
5ffcf3126a
commit
60c8317b20
@ -609,7 +609,6 @@ void Crawler::HurtEnemies(vf2d pos,float radius,int damage){
|
|||||||
|
|
||||||
void Crawler::RenderWorld(float fElapsedTime){
|
void Crawler::RenderWorld(float fElapsedTime){
|
||||||
Clear({100,180,100});
|
Clear({100,180,100});
|
||||||
std::vector<TileRenderData>foregroundTiles;
|
|
||||||
for (int x = view.GetTopLeftTile().x/24-1; x <= view.GetBottomRightTile().x/24; x++){
|
for (int x = view.GetTopLeftTile().x/24-1; x <= view.GetBottomRightTile().x/24; x++){
|
||||||
for (int y = view.GetTopLeftTile().y/24-1; y <= view.GetBottomRightTile().y/24; y++){
|
for (int y = view.GetTopLeftTile().y/24-1; y <= view.GetBottomRightTile().y/24; y++){
|
||||||
if(x>=0&&x<WORLD_SIZE.x&&y>=0&&y<WORLD_SIZE.y){
|
if(x>=0&&x<WORLD_SIZE.x&&y>=0&&y<WORLD_SIZE.y){
|
||||||
@ -622,9 +621,7 @@ void Crawler::RenderWorld(float fElapsedTime){
|
|||||||
int tileSheetIndex=tileID-(tileSheet.firstgid-1);
|
int tileSheetIndex=tileID-(tileSheet.firstgid-1);
|
||||||
int tileSheetX=tileSheetIndex%tileSheetWidth;
|
int tileSheetX=tileSheetIndex%tileSheetWidth;
|
||||||
int tileSheetY=tileSheetIndex/tileSheetWidth;
|
int tileSheetY=tileSheetIndex/tileSheetWidth;
|
||||||
if(IsForegroundTile(tileSheet,tileSheetIndex)){
|
if(!IsForegroundTile(tileSheet,tileSheetIndex)){
|
||||||
foregroundTiles.push_back({tileSheet.tileset.tileset->Decal(),vi2d{x,y}*24,vi2d{tileSheetX,tileSheetY}*24});
|
|
||||||
} else {
|
|
||||||
view.DrawPartialDecal(vi2d{x,y}*24,{24,24},tileSheet.tileset.tileset->Decal(),vi2d{tileSheetX,tileSheetY}*24,{24,24});
|
view.DrawPartialDecal(vi2d{x,y}*24,{24,24},tileSheet.tileset.tileset->Decal(),vi2d{tileSheetX,tileSheetY}*24,{24,24});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -665,8 +662,17 @@ void Crawler::RenderWorld(float fElapsedTime){
|
|||||||
for(Bullet&b:PLAYER_BULLET_LIST){
|
for(Bullet&b:PLAYER_BULLET_LIST){
|
||||||
b.Draw();
|
b.Draw();
|
||||||
}
|
}
|
||||||
for(TileRenderData&foregroundTile:foregroundTiles){
|
for(TileGroup&group:foregroundTileGroups){
|
||||||
view.DrawPartialDecal(foregroundTile.pos,{24,24},foregroundTile.tileset,foregroundTile.tileSheetPos,{24,24},{255,255,255,uint8_t(std::clamp(geom2d::line<float>(foregroundTile.pos+vi2d{12,12},player.GetPos()).length()*5,0.f,255.f))});
|
if(geom2d::overlaps(group.GetRange(),player.pos)){
|
||||||
|
group.playerBehind=true;
|
||||||
|
} else {
|
||||||
|
group.playerBehind=false;
|
||||||
|
}
|
||||||
|
if(view.IsRectVisible(group.GetRange().pos,group.GetRange().size)){
|
||||||
|
for(TileRenderData&tile:group.GetTiles()){
|
||||||
|
view.DrawPartialDecal(tile.pos,{24,24},tile.tileset,tile.tileSheetPos,{24,24},{255,255,255,uint8_t(group.playerBehind?128:255)});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for(std::vector<DamageNumber>::iterator it=DAMAGENUMBER_LIST.begin();it!=DAMAGENUMBER_LIST.end();++it){
|
for(std::vector<DamageNumber>::iterator it=DAMAGENUMBER_LIST.begin();it!=DAMAGENUMBER_LIST.end();++it){
|
||||||
DamageNumber&dn=*it;
|
DamageNumber&dn=*it;
|
||||||
@ -798,6 +804,7 @@ void Crawler::InitializeLevel(std::string mapFile,MapName map){
|
|||||||
|
|
||||||
void Crawler::LoadLevel(MapName map){
|
void Crawler::LoadLevel(MapName map){
|
||||||
SPAWNER_LIST.clear();
|
SPAWNER_LIST.clear();
|
||||||
|
foregroundTileGroups.clear();
|
||||||
currentLevel=map;
|
currentLevel=map;
|
||||||
WORLD_SIZE={MAP_DATA[map].MapData.width,MAP_DATA[map].MapData.height};
|
WORLD_SIZE={MAP_DATA[map].MapData.width,MAP_DATA[map].MapData.height};
|
||||||
for(SpawnerTag&spawner:MAP_DATA[map].SpawnerData){
|
for(SpawnerTag&spawner:MAP_DATA[map].SpawnerData){
|
||||||
@ -811,6 +818,41 @@ void Crawler::LoadLevel(MapName map){
|
|||||||
}
|
}
|
||||||
SPAWNER_LIST.push_back(MonsterSpawner{{spawner.ObjectData.GetFloat("x")+spawnerRadius.x,spawner.ObjectData.GetFloat("y")+spawnerRadius.y},spawnerRadius,monster_list});
|
SPAWNER_LIST.push_back(MonsterSpawner{{spawner.ObjectData.GetFloat("x")+spawnerRadius.x,spawner.ObjectData.GetFloat("y")+spawnerRadius.y},spawnerRadius,monster_list});
|
||||||
}
|
}
|
||||||
|
for(int x=0;x<WORLD_SIZE.x;x++){
|
||||||
|
for(int y=0;y<WORLD_SIZE.y;y++){
|
||||||
|
for(LayerTag&layer:MAP_DATA[currentLevel].LayerData){
|
||||||
|
int tileID=layer.tiles[y][x]-1;
|
||||||
|
if(tileID!=-1){
|
||||||
|
TilesheetData tileSheet=GetTileSheet(currentLevel,tileID);
|
||||||
|
int tileSheetWidth=tileSheet.tileset.tileset->Sprite()->width/24;
|
||||||
|
int tileSheetHeight=tileSheet.tileset.tileset->Sprite()->height/24;
|
||||||
|
int tileSheetIndex=tileID-(tileSheet.firstgid-1);
|
||||||
|
int tileSheetX=tileSheetIndex%tileSheetWidth;
|
||||||
|
int tileSheetY=tileSheetIndex/tileSheetWidth;
|
||||||
|
if(IsForegroundTile(tileSheet,tileSheetIndex)){
|
||||||
|
TileRenderData tile={tileSheet.tileset.tileset->Decal(),vi2d{x,y}*24,vi2d{tileSheetX,tileSheetY}*24};
|
||||||
|
std::cout<<"Tile "<<vi2d{x,y}<<" w/Tile ID "<<tileSheetIndex<<" is foreground tile."<<std::endl;
|
||||||
|
bool foundGroup=false;
|
||||||
|
for(TileGroup&group:foregroundTileGroups){
|
||||||
|
if(geom2d::overlaps(geom2d::rect<int>{vi2d{x,y}*24-vi2d{1,1},{26,26}},group.GetRange())){
|
||||||
|
std::cout<<" Group found: "<<group.GetRange().pos<<"/"<<group.GetRange().size<<std::endl;
|
||||||
|
group.InsertTile(tile);
|
||||||
|
std::cout<<" After: "<<group.GetRange().pos<<"/"<<group.GetRange().size<<std::endl;
|
||||||
|
foundGroup=true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(!foundGroup){
|
||||||
|
TileGroup group;
|
||||||
|
group.InsertTile(tile);
|
||||||
|
std::cout<<" No Group found. New group: "<<group.GetRange().pos<<"/"<<group.GetRange().size<<std::endl;
|
||||||
|
foregroundTileGroups.push_back(group);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
vi2d Crawler::GetWorldSize(){
|
vi2d Crawler::GetWorldSize(){
|
||||||
|
@ -33,6 +33,7 @@ class Crawler : public olc::PixelGameEngine
|
|||||||
const float WORLD_SHAKE_ADJUST_MAX_TIME=0.4;
|
const float WORLD_SHAKE_ADJUST_MAX_TIME=0.4;
|
||||||
MapName currentLevel=MapName::CAMPAIGN_1_1;
|
MapName currentLevel=MapName::CAMPAIGN_1_1;
|
||||||
vi2d WORLD_SIZE={120,8};
|
vi2d WORLD_SIZE={120,8};
|
||||||
|
std::vector<TileGroup>foregroundTileGroups;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Crawler();
|
Crawler();
|
||||||
|
@ -193,6 +193,7 @@
|
|||||||
<ClCompile Include="Crawler.cpp" />
|
<ClCompile Include="Crawler.cpp" />
|
||||||
<ClCompile Include="DamageNumber.cpp" />
|
<ClCompile Include="DamageNumber.cpp" />
|
||||||
<ClCompile Include="Effect.cpp" />
|
<ClCompile Include="Effect.cpp" />
|
||||||
|
<ClCompile Include="Map.cpp" />
|
||||||
<ClCompile Include="pixelGameEngine.cpp" />
|
<ClCompile Include="pixelGameEngine.cpp" />
|
||||||
<ClCompile Include="Player.cpp" />
|
<ClCompile Include="Player.cpp" />
|
||||||
<ClCompile Include="Monster.cpp" />
|
<ClCompile Include="Monster.cpp" />
|
||||||
|
@ -119,6 +119,9 @@
|
|||||||
<ClCompile Include="Class.cpp">
|
<ClCompile Include="Class.cpp">
|
||||||
<Filter>Source Files</Filter>
|
<Filter>Source Files</Filter>
|
||||||
</ClCompile>
|
</ClCompile>
|
||||||
|
<ClCompile Include="Map.cpp">
|
||||||
|
<Filter>Source Files</Filter>
|
||||||
|
</ClCompile>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="cpp.hint" />
|
<None Include="cpp.hint" />
|
||||||
|
30
Crawler/Map.cpp
Normal file
30
Crawler/Map.cpp
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#include "Map.h"
|
||||||
|
|
||||||
|
void TileGroup::InsertTile(TileRenderData tile){
|
||||||
|
if(tiles.size()==0){
|
||||||
|
range={tile.pos,{24,24}};
|
||||||
|
}
|
||||||
|
tiles.push_back(tile);
|
||||||
|
if(tile.pos.x<range.pos.x){
|
||||||
|
range.pos.x=tile.pos.x;
|
||||||
|
range.size.x+=range.pos.x-tile.pos.x;
|
||||||
|
}
|
||||||
|
if(tile.pos.x+24>range.pos.x+range.size.x){
|
||||||
|
range.size.x+=(tile.pos.x+24)-(range.pos.x+range.size.x);
|
||||||
|
}
|
||||||
|
if(tile.pos.y<range.pos.y){
|
||||||
|
range.pos.y=tile.pos.y;
|
||||||
|
range.size.y+=range.pos.y-tile.pos.y;
|
||||||
|
}
|
||||||
|
if(tile.pos.y+24>range.pos.y+range.size.y){
|
||||||
|
range.size.y+=(tile.pos.y+24)-(range.pos.y+range.size.y);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
geom2d::rect<int>TileGroup::GetRange(){
|
||||||
|
return range;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<TileRenderData>&TileGroup::GetTiles(){
|
||||||
|
return tiles;
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
#include "TSXParser.h"
|
#include "TSXParser.h"
|
||||||
|
#include "olcUTIL_Geometry2D.h"
|
||||||
|
|
||||||
enum MapName{
|
enum MapName{
|
||||||
LEVEL1,
|
LEVEL1,
|
||||||
@ -16,4 +17,15 @@ struct TileRenderData{
|
|||||||
Decal*tileset;
|
Decal*tileset;
|
||||||
vi2d pos;
|
vi2d pos;
|
||||||
vi2d tileSheetPos;
|
vi2d tileSheetPos;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TileGroup{
|
||||||
|
private:
|
||||||
|
geom2d::rect<int>range;
|
||||||
|
std::vector<TileRenderData>tiles;
|
||||||
|
public:
|
||||||
|
geom2d::rect<int>GetRange();
|
||||||
|
std::vector<TileRenderData>&GetTiles();
|
||||||
|
void InsertTile(TileRenderData tile);
|
||||||
|
bool playerBehind=false;
|
||||||
};
|
};
|
@ -2,7 +2,7 @@
|
|||||||
#define VERSION_MAJOR 0
|
#define VERSION_MAJOR 0
|
||||||
#define VERSION_MINOR 2
|
#define VERSION_MINOR 2
|
||||||
#define VERSION_PATCH 0
|
#define VERSION_PATCH 0
|
||||||
#define VERSION_BUILD 204
|
#define VERSION_BUILD 217
|
||||||
|
|
||||||
#define stringify(a) stringify_(a)
|
#define stringify(a) stringify_(a)
|
||||||
#define stringify_(a) #a
|
#define stringify_(a) #a
|
||||||
|
Loading…
x
Reference in New Issue
Block a user