Add in floating-point support for collision boxes. Remove ceil() calls for transformed view DrawRectDecal and FillRectDecal functions (why are they there?)
This commit is contained in:
parent
6d11eb5048
commit
20928b6867
@ -898,9 +898,9 @@ void AiL::RenderWorld(float fElapsedTime){
|
|||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
if("debug_collision_boxes"_I){
|
if("debug_collision_boxes"_I){
|
||||||
if(tileSheet.tileset->collision.find(tileSheetIndex)!=tileSheet.tileset->collision.end()){
|
if(tileSheet.tileset->collision.find(tileSheetIndex)!=tileSheet.tileset->collision.end()){
|
||||||
geom2d::rect<int>collision=tileSheet.tileset->collision[tileSheetIndex].collision;
|
geom2d::rect<float>collision=tileSheet.tileset->collision[tileSheetIndex].collision;
|
||||||
view.FillRectDecal(vi2d{x,y}*GetCurrentMapData().tilewidth+collision.pos,collision.size,{0,0,0,128});
|
view.FillRectDecal(vf2d{float(x),float(y)}*float(GetCurrentMapData().tilewidth)+collision.pos,collision.size,{0,0,0,128});
|
||||||
view.DrawRectDecal(vi2d{x,y}*GetCurrentMapData().tilewidth+collision.pos,collision.size,GREY);
|
view.DrawRectDecal(vf2d{float(x),float(y)}*float(GetCurrentMapData().tilewidth)+collision.pos,collision.size,GREY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -926,9 +926,9 @@ void AiL::RenderWorld(float fElapsedTime){
|
|||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
if("debug_collision_boxes"_I){
|
if("debug_collision_boxes"_I){
|
||||||
if(tileSheet.tileset->collision.find(tileSheetIndex)!=tileSheet.tileset->collision.end()){
|
if(tileSheet.tileset->collision.find(tileSheetIndex)!=tileSheet.tileset->collision.end()){
|
||||||
geom2d::rect<int>collision=tileSheet.tileset->collision[tileSheetIndex].collision;
|
geom2d::rect<float>collision=tileSheet.tileset->collision[tileSheetIndex].collision;
|
||||||
view.FillRectDecal(vi2d{x,y}*GetCurrentMapData().tilewidth+collision.pos,collision.size,{0,0,0,128});
|
view.FillRectDecal(vf2d{float(x),float(y)}*float(GetCurrentMapData().tilewidth)+collision.pos,collision.size,{0,0,0,128});
|
||||||
view.DrawRectDecal(vi2d{x,y}*GetCurrentMapData().tilewidth+collision.pos,collision.size,GREY);
|
view.DrawRectDecal(vf2d{float(x),float(y)}*float(GetCurrentMapData().tilewidth)+collision.pos,collision.size,GREY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1067,11 +1067,19 @@ void AiL::RenderWorld(float fElapsedTime){
|
|||||||
RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)});
|
RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)});
|
||||||
float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length();
|
float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length();
|
||||||
if(distToPlayer<24*3&&tile->tileOpacity>0&&tile->tileSheet.tileset->collision.find(tile->tileID)!=tile->tileSheet.tileset->collision.end()){
|
if(distToPlayer<24*3&&tile->tileOpacity>0&&tile->tileSheet.tileset->collision.find(tile->tileID)!=tile->tileSheet.tileset->collision.end()){
|
||||||
geom2d::rect<int>collision=tile->tileSheet.tileset->collision[tile->tileID].collision;
|
geom2d::rect<float>collision=tile->tileSheet.tileset->collision[tile->tileID].collision;
|
||||||
distToPlayer/=4;
|
distToPlayer/=4;
|
||||||
if(distToPlayer<1){distToPlayer=1;}
|
if(distToPlayer<1){distToPlayer=1;}
|
||||||
view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))});
|
view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))});
|
||||||
view.DrawRectDecal(tile->pos+collision.pos,collision.size,{128,0,0,uint8_t(255/sqrt(distToPlayer))});
|
view.DrawRectDecal(tile->pos+collision.pos,collision.size,{128,0,0,uint8_t(255/sqrt(distToPlayer))});
|
||||||
|
#ifdef _DEBUG
|
||||||
|
if("debug_collision_boxes_snapping"_I){
|
||||||
|
if(fmod(tile->pos.x+collision.pos.x,1.f)!=0.f||fmod(tile->pos.y+collision.pos.y,1.f)!=0.f){
|
||||||
|
view.DrawShadowStringPropDecal(tile->pos+collision.pos-vf2d{0,24},(tile->pos+collision.pos).str(),RED,BLACK,{0.5f,1.f},24.f);
|
||||||
|
view.DrawShadowStringPropDecal(tile->pos+collision.pos+vf2d{0,24},((tile->pos+collision.pos)+(collision.size)).str(),GREEN,BLACK,{0.5f,1.f},24.f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
@ -1092,11 +1100,19 @@ void AiL::RenderWorld(float fElapsedTime){
|
|||||||
RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)});
|
RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)});
|
||||||
float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length();
|
float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length();
|
||||||
if(distToPlayer<24*3&&tile->tileOpacity>0&&tile->tileSheet.tileset->collision.find(tile->tileID)!=tile->tileSheet.tileset->collision.end()){
|
if(distToPlayer<24*3&&tile->tileOpacity>0&&tile->tileSheet.tileset->collision.find(tile->tileID)!=tile->tileSheet.tileset->collision.end()){
|
||||||
geom2d::rect<int>collision=tile->tileSheet.tileset->collision[tile->tileID].collision;
|
geom2d::rect<float>collision=tile->tileSheet.tileset->collision[tile->tileID].collision;
|
||||||
distToPlayer/=4;
|
distToPlayer/=4;
|
||||||
if(distToPlayer<1){distToPlayer=1;}
|
if(distToPlayer<1){distToPlayer=1;}
|
||||||
view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))});
|
view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))});
|
||||||
view.DrawRectDecal(tile->pos+collision.pos,collision.size,{128,0,0,uint8_t(255/sqrt(distToPlayer))});
|
view.DrawRectDecal(tile->pos+collision.pos,collision.size,{128,0,0,uint8_t(255/sqrt(distToPlayer))});
|
||||||
|
#ifdef _DEBUG
|
||||||
|
if("debug_collision_boxes_snapping"_I){
|
||||||
|
if(fmod(tile->pos.x+collision.pos.x,1.f)!=0.f||fmod(tile->pos.y+collision.pos.y,1.f)!=0.f){
|
||||||
|
view.DrawShadowStringPropDecal(tile->pos+collision.pos-vf2d{0,24},(tile->pos+collision.pos).str(),RED,BLACK,{0.5f,1.f},24.f);
|
||||||
|
view.DrawShadowStringPropDecal(tile->pos+collision.pos+vf2d{0,24},((tile->pos+collision.pos)+(collision.size)).str(),GREEN,BLACK,{0.5f,1.f},24.f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
@ -1124,9 +1140,9 @@ void AiL::RenderWorld(float fElapsedTime){
|
|||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
if("debug_collision_boxes"_I){
|
if("debug_collision_boxes"_I){
|
||||||
if(tileSheet.tileset->collision.find(tileSheetIndex)!=tileSheet.tileset->collision.end()){
|
if(tileSheet.tileset->collision.find(tileSheetIndex)!=tileSheet.tileset->collision.end()){
|
||||||
geom2d::rect<int>collision=tileSheet.tileset->collision[tileSheetIndex].collision;
|
geom2d::rect<float>collision=tileSheet.tileset->collision[tileSheetIndex].collision;
|
||||||
view.FillRectDecal(vi2d{x,y}*game->GetCurrentMapData().tilewidth+collision.pos,collision.size,{0,0,0,128});
|
view.FillRectDecal(vf2d{float(x),float(y)}*float(game->GetCurrentMapData().tilewidth)+collision.pos,collision.size,{0,0,0,128});
|
||||||
view.DrawRectDecal(vi2d{x,y}*game->GetCurrentMapData().tilewidth+collision.pos,collision.size,GREY);
|
view.DrawRectDecal(vf2d{float(x),float(y)}*float(game->GetCurrentMapData().tilewidth)+collision.pos,collision.size,GREY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
@ -1210,7 +1226,7 @@ void AiL::RenderWorld(float fElapsedTime){
|
|||||||
RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)});
|
RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)});
|
||||||
float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length();
|
float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length();
|
||||||
if(distToPlayer<24*3&&tile->tileOpacity>0&&tile->tileSheet.tileset->collision.find(tile->tileID)!=tile->tileSheet.tileset->collision.end()){
|
if(distToPlayer<24*3&&tile->tileOpacity>0&&tile->tileSheet.tileset->collision.find(tile->tileID)!=tile->tileSheet.tileset->collision.end()){
|
||||||
geom2d::rect<int>collision=tile->tileSheet.tileset->collision[tile->tileID].collision;
|
geom2d::rect<float>collision=tile->tileSheet.tileset->collision[tile->tileID].collision;
|
||||||
distToPlayer/=4;
|
distToPlayer/=4;
|
||||||
if(distToPlayer<1){distToPlayer=1;}
|
if(distToPlayer<1){distToPlayer=1;}
|
||||||
view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))});
|
view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))});
|
||||||
@ -1235,7 +1251,7 @@ void AiL::RenderWorld(float fElapsedTime){
|
|||||||
RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)});
|
RenderTile(*tile,{255,255,255,uint8_t(255-tile->tileOpacity/TileGroup::FADE_TIME*TileGroup::FADE_AMT)});
|
||||||
float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length();
|
float distToPlayer=geom2d::line<float>(player->GetPos(),tile->pos+vf2d{12,12}).length();
|
||||||
if(distToPlayer<24*3&&tile->tileOpacity>0&&tile->tileSheet.tileset->collision.find(tile->tileID)!=tile->tileSheet.tileset->collision.end()){
|
if(distToPlayer<24*3&&tile->tileOpacity>0&&tile->tileSheet.tileset->collision.find(tile->tileID)!=tile->tileSheet.tileset->collision.end()){
|
||||||
geom2d::rect<int>collision=tile->tileSheet.tileset->collision[tile->tileID].collision;
|
geom2d::rect<float>collision=tile->tileSheet.tileset->collision[tile->tileID].collision;
|
||||||
distToPlayer/=4;
|
distToPlayer/=4;
|
||||||
if(distToPlayer<1){distToPlayer=1;}
|
if(distToPlayer<1){distToPlayer=1;}
|
||||||
view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))});
|
view.FillRectDecal(tile->pos+collision.pos,collision.size,{255,0,0,uint8_t(128*tile->tileOpacity/sqrt(distToPlayer))});
|
||||||
@ -1895,7 +1911,7 @@ TilesheetData AiL::GetTileSheet(MapName map,int tileID){
|
|||||||
}
|
}
|
||||||
|
|
||||||
bool AiL::HasTileCollision(MapName map,vf2d pos,bool upperLevel){
|
bool AiL::HasTileCollision(MapName map,vf2d pos,bool upperLevel){
|
||||||
geom2d::rect<int>collisionRect=GetTileCollision(map,pos,upperLevel);
|
geom2d::rect<float>collisionRect=GetTileCollision(map,pos,upperLevel);
|
||||||
vi2d collisionRectSnapPos=vi2d{pos/float(game->GetCurrentMapData().tilewidth)}*game->GetCurrentMapData().tilewidth;
|
vi2d collisionRectSnapPos=vi2d{pos/float(game->GetCurrentMapData().tilewidth)}*game->GetCurrentMapData().tilewidth;
|
||||||
collisionRect.pos+=collisionRectSnapPos;
|
collisionRect.pos+=collisionRectSnapPos;
|
||||||
return geom2d::overlaps(collisionRect,pos);
|
return geom2d::overlaps(collisionRect,pos);
|
||||||
@ -1905,7 +1921,7 @@ bool AiL::IsBridgeLayer(LayerTag&layer){
|
|||||||
return layer.tag.data.find("class")!=layer.tag.data.end()&&layer.tag.data["class"]=="Bridge";
|
return layer.tag.data.find("class")!=layer.tag.data.end()&&layer.tag.data["class"]=="Bridge";
|
||||||
}
|
}
|
||||||
|
|
||||||
geom2d::rect<int>AiL::GetTileCollision(MapName map,vf2d pos,bool upperLevel){
|
geom2d::rect<float>AiL::GetTileCollision(MapName map,vf2d pos,bool upperLevel){
|
||||||
if(pos.x<0||pos.y<0||pos.x>=GetCurrentMapData().width*game->GetCurrentMapData().tilewidth||pos.y>=GetCurrentMapData().height*game->GetCurrentMapData().tilewidth)return NO_COLLISION;
|
if(pos.x<0||pos.y<0||pos.x>=GetCurrentMapData().width*game->GetCurrentMapData().tilewidth||pos.y>=GetCurrentMapData().height*game->GetCurrentMapData().tilewidth)return NO_COLLISION;
|
||||||
if(GetCurrentMap().optimizedTile)return NO_COLLISION; //Overworld map has no collision.
|
if(GetCurrentMap().optimizedTile)return NO_COLLISION; //Overworld map has no collision.
|
||||||
|
|
||||||
@ -1919,13 +1935,13 @@ geom2d::rect<int>AiL::GetTileCollision(MapName map,vf2d pos,bool upperLevel){
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(!hasTerrain)return geom2d::rect<int>({0,0},{GetCurrentMapData().tilewidth,GetCurrentMapData().tilewidth}); //We assume no terrain means we can't walk on this.
|
if(!hasTerrain)return geom2d::rect<float>({0.f,0.f},{float(GetCurrentMapData().tilewidth),float(GetCurrentMapData().tilewidth)}); //We assume no terrain means we can't walk on this.
|
||||||
|
|
||||||
#pragma region Lower Bridge Collision Check
|
#pragma region Lower Bridge Collision Check
|
||||||
if(!upperLevel){ //We are looking for lower bridge collisions.
|
if(!upperLevel){ //We are looking for lower bridge collisions.
|
||||||
for(ZoneData&zone:MAP_DATA[map].ZoneData["LowerBridgeCollision"]){
|
for(ZoneData&zone:MAP_DATA[map].ZoneData["LowerBridgeCollision"]){
|
||||||
if(geom2d::contains(zone.zone,pos)){
|
if(geom2d::contains(zone.zone,pos)){
|
||||||
return {{0,0},{game->GetCurrentMapData().tilewidth,game->GetCurrentMapData().tilewidth}};
|
return {{0,0},{float(game->GetCurrentMapData().tilewidth),float(game->GetCurrentMapData().tilewidth)}};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1940,13 +1956,13 @@ geom2d::rect<int>AiL::GetTileCollision(MapName map,vf2d pos,bool upperLevel){
|
|||||||
return NO_COLLISION;
|
return NO_COLLISION;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
geom2d::rect<int>foundRect=NO_COLLISION;
|
geom2d::rect<float>foundRect=NO_COLLISION;
|
||||||
for(int counter=0;LayerTag&layer:MAP_DATA[map].LayerData){
|
for(int counter=0;LayerTag&layer:MAP_DATA[map].LayerData){
|
||||||
//auto HasNoClass=[&](){return layer.tag.data.find("class")==layer.tag.data.end();};
|
//auto HasNoClass=[&](){return layer.tag.data.find("class")==layer.tag.data.end();};
|
||||||
if(counter!=bridgeLayerIndex){
|
if(counter!=bridgeLayerIndex){
|
||||||
int tileID=layer.tiles[int(pos.y)/GetCurrentMapData().tilewidth][int(pos.x)/GetCurrentMapData().tilewidth]-1;
|
int tileID=layer.tiles[int(pos.y)/GetCurrentMapData().tilewidth][int(pos.x)/GetCurrentMapData().tilewidth]-1;
|
||||||
if(tileID!=-1&&GetTileSheet(map,tileID%1000000).tileset->collision.find(tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1)!=GetTileSheet(map,tileID%1000000).tileset->collision.end()){
|
if(tileID!=-1&&GetTileSheet(map,tileID%1000000).tileset->collision.find(tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1)!=GetTileSheet(map,tileID%1000000).tileset->collision.end()){
|
||||||
geom2d::rect<int>collisionRect=GetTileSheet(map,tileID%1000000).tileset->collision[tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1].collision;
|
geom2d::rect<float>collisionRect=GetTileSheet(map,tileID%1000000).tileset->collision[tileID%1000000-GetTileSheet(map,tileID%1000000).firstgid+1].collision;
|
||||||
if(foundRect.pos==NO_COLLISION.pos&&foundRect.size==NO_COLLISION.size){
|
if(foundRect.pos==NO_COLLISION.pos&&foundRect.size==NO_COLLISION.size){
|
||||||
foundRect=collisionRect;
|
foundRect=collisionRect;
|
||||||
}else{
|
}else{
|
||||||
|
|||||||
@ -133,7 +133,7 @@ public:
|
|||||||
bool OnUserUpdate(float fElapsedTime) override;
|
bool OnUserUpdate(float fElapsedTime) override;
|
||||||
bool OnUserDestroy() override;
|
bool OnUserDestroy() override;
|
||||||
public:
|
public:
|
||||||
geom2d::rect<int>NO_COLLISION={};
|
geom2d::rect<float>NO_COLLISION={{0.f,0.f,},{0.f,0.f}};
|
||||||
TileTransformedView view;
|
TileTransformedView view;
|
||||||
void InitializeLevel(std::string mapFile,MapName map);
|
void InitializeLevel(std::string mapFile,MapName map);
|
||||||
void LoadLevel(MapName map);
|
void LoadLevel(MapName map);
|
||||||
@ -166,7 +166,7 @@ public:
|
|||||||
//tileID is the tile number from the tilesets.
|
//tileID is the tile number from the tilesets.
|
||||||
TilesheetData GetTileSheet(MapName map,int tileID);
|
TilesheetData GetTileSheet(MapName map,int tileID);
|
||||||
//Gets the rectangle of the tile collision at this tile. If upperLevel is set to true, the collision tile must be in a Bridge class layer for the tile to hit. Also, zones containing LowerBridgeCollision will apply when upperLevel is set to false.
|
//Gets the rectangle of the tile collision at this tile. If upperLevel is set to true, the collision tile must be in a Bridge class layer for the tile to hit. Also, zones containing LowerBridgeCollision will apply when upperLevel is set to false.
|
||||||
geom2d::rect<int>GetTileCollision(MapName map,vf2d pos,bool upperLevel=false);
|
geom2d::rect<float>GetTileCollision(MapName map,vf2d pos,bool upperLevel=false);
|
||||||
//Checks if the point resides inside of a collision tile.
|
//Checks if the point resides inside of a collision tile.
|
||||||
bool HasTileCollision(MapName map,vf2d pos,bool upperLevel=false);
|
bool HasTileCollision(MapName map,vf2d pos,bool upperLevel=false);
|
||||||
const MapName&GetCurrentLevel()const;
|
const MapName&GetCurrentLevel()const;
|
||||||
|
|||||||
@ -50,7 +50,7 @@ public:
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct TileCollisionData{
|
struct TileCollisionData{
|
||||||
geom2d::rect<int>collision;
|
geom2d::rect<float>collision;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TilesetData{
|
struct TilesetData{
|
||||||
@ -59,7 +59,7 @@ struct TilesetData{
|
|||||||
bool isTerrain=false;
|
bool isTerrain=false;
|
||||||
std::map<int,XMLTag>foregroundTiles;
|
std::map<int,XMLTag>foregroundTiles;
|
||||||
std::map<int,XMLTag>upperForegroundTiles;
|
std::map<int,XMLTag>upperForegroundTiles;
|
||||||
std::map<int,TileCollisionData>collision;
|
std::map<float,TileCollisionData>collision;
|
||||||
std::map<int,XMLTag>staircaseTiles;
|
std::map<int,XMLTag>staircaseTiles;
|
||||||
std::map<int,std::vector<int>>animationData;
|
std::map<int,std::vector<int>>animationData;
|
||||||
std::set<int>reflectiveData;
|
std::set<int>reflectiveData;
|
||||||
@ -75,7 +75,7 @@ struct TilesheetData{
|
|||||||
|
|
||||||
struct TileRenderData{
|
struct TileRenderData{
|
||||||
TilesheetData tileSheet;
|
TilesheetData tileSheet;
|
||||||
vi2d pos;
|
vf2d pos;
|
||||||
vi2d tileSheetPos;
|
vi2d tileSheetPos;
|
||||||
int tileID;
|
int tileID;
|
||||||
int layerID;
|
int layerID;
|
||||||
|
|||||||
@ -116,7 +116,7 @@ void Monster::PerformIdleAnimation(){
|
|||||||
bool Monster::SetX(float x){
|
bool Monster::SetX(float x){
|
||||||
vf2d newPos={x,pos.y};
|
vf2d newPos={x,pos.y};
|
||||||
vi2d tilePos=vi2d(newPos/float(game->GetCurrentMapData().tilewidth))*game->GetCurrentMapData().tilewidth;
|
vi2d tilePos=vi2d(newPos/float(game->GetCurrentMapData().tilewidth))*game->GetCurrentMapData().tilewidth;
|
||||||
geom2d::rect<int>collisionRect=game->GetTileCollision(game->GetCurrentLevel(),newPos,upperLevel);
|
geom2d::rect<float>collisionRect=game->GetTileCollision(game->GetCurrentLevel(),newPos,upperLevel);
|
||||||
if(collisionRect.pos==vi2d{0,0}&&collisionRect.size==vi2d{1,1}){
|
if(collisionRect.pos==vi2d{0,0}&&collisionRect.size==vi2d{1,1}){
|
||||||
pos.x=std::clamp(x,game->GetCurrentMapData().tilewidth/2.f*GetSizeMult(),float(game->GetCurrentMapData().width*game->GetCurrentMapData().tilewidth-game->GetCurrentMapData().tilewidth/2.f*GetSizeMult()));
|
pos.x=std::clamp(x,game->GetCurrentMapData().tilewidth/2.f*GetSizeMult(),float(game->GetCurrentMapData().width*game->GetCurrentMapData().tilewidth-game->GetCurrentMapData().tilewidth/2.f*GetSizeMult()));
|
||||||
Moved();
|
Moved();
|
||||||
@ -135,7 +135,7 @@ bool Monster::SetX(float x){
|
|||||||
bool Monster::SetY(float y){
|
bool Monster::SetY(float y){
|
||||||
vf2d newPos={pos.x,y};
|
vf2d newPos={pos.x,y};
|
||||||
vi2d tilePos=vi2d(newPos/float(game->GetCurrentMapData().tilewidth))*game->GetCurrentMapData().tilewidth;
|
vi2d tilePos=vi2d(newPos/float(game->GetCurrentMapData().tilewidth))*game->GetCurrentMapData().tilewidth;
|
||||||
geom2d::rect<int>collisionRect=game->GetTileCollision(game->GetCurrentLevel(),newPos,upperLevel);
|
geom2d::rect<float>collisionRect=game->GetTileCollision(game->GetCurrentLevel(),newPos,upperLevel);
|
||||||
if(collisionRect.pos==vi2d{0,0}&&collisionRect.size==vi2d{1,1}){
|
if(collisionRect.pos==vi2d{0,0}&&collisionRect.size==vi2d{1,1}){
|
||||||
pos.y=std::clamp(y,game->GetCurrentMapData().tilewidth/2.f*GetSizeMult(),float(game->GetCurrentMapData().height*game->GetCurrentMapData().tilewidth-game->GetCurrentMapData().tilewidth/2.f*GetSizeMult()));
|
pos.y=std::clamp(y,game->GetCurrentMapData().tilewidth/2.f*GetSizeMult(),float(game->GetCurrentMapData().height*game->GetCurrentMapData().tilewidth-game->GetCurrentMapData().tilewidth/2.f*GetSizeMult()));
|
||||||
Moved();
|
Moved();
|
||||||
|
|||||||
@ -50,7 +50,7 @@ void Pathfinding::Initialize(){
|
|||||||
sNode&node=nodes[{x,y}];
|
sNode&node=nodes[{x,y}];
|
||||||
node.x = x; // ...because we give each node its own coordinates
|
node.x = x; // ...because we give each node its own coordinates
|
||||||
node.y = y; // ...because we give each node its own coordinates
|
node.y = y; // ...because we give each node its own coordinates
|
||||||
geom2d::rect<int>tile=game->GetTileCollision(game->GetCurrentLevel(),{float(x*gridSpacing.x),float(y*gridSpacing.y)});
|
geom2d::rect<float>tile=game->GetTileCollision(game->GetCurrentLevel(),{float(x*gridSpacing.x),float(y*gridSpacing.y)});
|
||||||
node.bObstacle = tile.pos!=game->NO_COLLISION.pos||tile.size!=game->NO_COLLISION.size;
|
node.bObstacle = tile.pos!=game->NO_COLLISION.pos||tile.size!=game->NO_COLLISION.size;
|
||||||
tile=game->GetTileCollision(game->GetCurrentLevel(),{float(x*gridSpacing.x),float(y*gridSpacing.y)},true);
|
tile=game->GetTileCollision(game->GetCurrentLevel(),{float(x*gridSpacing.x),float(y*gridSpacing.y)},true);
|
||||||
node.bObstacleUpper = tile.pos!=game->NO_COLLISION.pos||tile.size!=game->NO_COLLISION.size;
|
node.bObstacleUpper = tile.pos!=game->NO_COLLISION.pos||tile.size!=game->NO_COLLISION.size;
|
||||||
|
|||||||
@ -107,7 +107,7 @@ void Player::ForceSetPos(vf2d pos){
|
|||||||
bool Player::SetX(float x){
|
bool Player::SetX(float x){
|
||||||
vf2d newPos={x,pos.y};
|
vf2d newPos={x,pos.y};
|
||||||
vi2d tilePos=vi2d(newPos/float(game->GetCurrentMapData().tilewidth))*game->GetCurrentMapData().tilewidth;
|
vi2d tilePos=vi2d(newPos/float(game->GetCurrentMapData().tilewidth))*game->GetCurrentMapData().tilewidth;
|
||||||
geom2d::rect<int>collisionRect=game->GetTileCollision(game->GetCurrentLevel(),newPos,upperLevel);
|
geom2d::rect<float>collisionRect=game->GetTileCollision(game->GetCurrentLevel(),newPos,upperLevel);
|
||||||
#pragma region lambdas
|
#pragma region lambdas
|
||||||
auto NoTileCollisionExistsHere=[&](){return collisionRect.pos==game->NO_COLLISION.pos&&collisionRect.size==game->NO_COLLISION.size;};
|
auto NoTileCollisionExistsHere=[&](){return collisionRect.pos==game->NO_COLLISION.pos&&collisionRect.size==game->NO_COLLISION.size;};
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
@ -133,7 +133,7 @@ bool Player::SetX(float x){
|
|||||||
bool Player::SetY(float y){
|
bool Player::SetY(float y){
|
||||||
vf2d newPos={pos.x,y};
|
vf2d newPos={pos.x,y};
|
||||||
vi2d tilePos=vi2d(newPos/float(game->GetCurrentMapData().tilewidth))*game->GetCurrentMapData().tilewidth;
|
vi2d tilePos=vi2d(newPos/float(game->GetCurrentMapData().tilewidth))*game->GetCurrentMapData().tilewidth;
|
||||||
geom2d::rect<int>collisionRect=game->GetTileCollision(game->GetCurrentLevel(),newPos,upperLevel);
|
geom2d::rect<float>collisionRect=game->GetTileCollision(game->GetCurrentLevel(),newPos,upperLevel);
|
||||||
#pragma region lambdas
|
#pragma region lambdas
|
||||||
auto NoTileCollisionExistsHere=[&](){return collisionRect.pos==game->NO_COLLISION.pos&&collisionRect.size==game->NO_COLLISION.size;};
|
auto NoTileCollisionExistsHere=[&](){return collisionRect.pos==game->NO_COLLISION.pos&&collisionRect.size==game->NO_COLLISION.size;};
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|||||||
@ -51,7 +51,7 @@ struct Tileset{
|
|||||||
bool isTerrain=false;
|
bool isTerrain=false;
|
||||||
std::map<int,XMLTag> ForegroundTileData;
|
std::map<int,XMLTag> ForegroundTileData;
|
||||||
std::map<int,XMLTag> UpperForegroundTileData;
|
std::map<int,XMLTag> UpperForegroundTileData;
|
||||||
std::map<int,TileCollisionData> CollisionData;
|
std::map<float,TileCollisionData> CollisionData;
|
||||||
std::map<int,XMLTag> StaircaseData;
|
std::map<int,XMLTag> StaircaseData;
|
||||||
std::map<int,std::vector<int>> AnimationData;
|
std::map<int,std::vector<int>> AnimationData;
|
||||||
std::set<int> ReflectiveData;
|
std::set<int> ReflectiveData;
|
||||||
@ -178,7 +178,7 @@ class TSXParser{
|
|||||||
} else
|
} else
|
||||||
if (newTag.tag=="object"&&previousTag=="tile"){
|
if (newTag.tag=="object"&&previousTag=="tile"){
|
||||||
TileCollisionData data;
|
TileCollisionData data;
|
||||||
data.collision=geom2d::rect<int>{{newTag.GetInteger("x"),newTag.GetInteger("y")},{newTag.GetInteger("width"),newTag.GetInteger("height")}};
|
data.collision=geom2d::rect<float>{{newTag.GetFloat("x"),newTag.GetFloat("y")},{newTag.GetFloat("width"),newTag.GetFloat("height")}};
|
||||||
if(parsedTilesetInfo.CollisionData.count(previousTagID)){
|
if(parsedTilesetInfo.CollisionData.count(previousTagID)){
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
if(_DEBUG_MAP_LOAD_INFO)ERR("WARNING! There was already collision data defined for tile "<<previousTagID<<"!");
|
if(_DEBUG_MAP_LOAD_INFO)ERR("WARNING! There was already collision data defined for tile "<<previousTagID<<"!");
|
||||||
|
|||||||
@ -39,7 +39,7 @@ All rights reserved.
|
|||||||
#define VERSION_MAJOR 0
|
#define VERSION_MAJOR 0
|
||||||
#define VERSION_MINOR 2
|
#define VERSION_MINOR 2
|
||||||
#define VERSION_PATCH 1
|
#define VERSION_PATCH 1
|
||||||
#define VERSION_BUILD 5618
|
#define VERSION_BUILD 5648
|
||||||
|
|
||||||
#define stringify(a) stringify_(a)
|
#define stringify(a) stringify_(a)
|
||||||
#define stringify_(a) #a
|
#define stringify_(a) #a
|
||||||
|
|||||||
@ -128,6 +128,9 @@ debug_player_info = 0
|
|||||||
# Shows collision boxes of tiles.
|
# Shows collision boxes of tiles.
|
||||||
debug_collision_boxes = 0
|
debug_collision_boxes = 0
|
||||||
|
|
||||||
|
# Shows collision boxe snapping of floating point-based tiles.
|
||||||
|
debug_collision_boxes_snapping = 0
|
||||||
|
|
||||||
# Shows pathfinding debugging
|
# Shows pathfinding debugging
|
||||||
debug_pathfinding = 0
|
debug_pathfinding = 0
|
||||||
|
|
||||||
|
|||||||
@ -760,7 +760,7 @@
|
|||||||
</tile>
|
</tile>
|
||||||
<tile id="591" type="ForegroundTile">
|
<tile id="591" type="ForegroundTile">
|
||||||
<objectgroup draworder="index" id="2">
|
<objectgroup draworder="index" id="2">
|
||||||
<object id="1" x="7.36364" y="4.90909" width="17" height="19.2727"/>
|
<object id="1" x="7.36364" y="4.90909" width="16.6364" height="19.0909"/>
|
||||||
</objectgroup>
|
</objectgroup>
|
||||||
</tile>
|
</tile>
|
||||||
<tile id="592" type="ForegroundTile">
|
<tile id="592" type="ForegroundTile">
|
||||||
|
|||||||
@ -644,12 +644,12 @@ namespace olc
|
|||||||
|
|
||||||
void TransformedView::FillRectDecal(const olc::vf2d & pos, const olc::vf2d & size, const olc::Pixel col)
|
void TransformedView::FillRectDecal(const olc::vf2d & pos, const olc::vf2d & size, const olc::Pixel col)
|
||||||
{
|
{
|
||||||
pge->FillRectDecal(WorldToScreen(pos), (size * m_vWorldScale).ceil(), col);
|
pge->FillRectDecal(WorldToScreen(pos), size * m_vWorldScale, col);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransformedView::DrawRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col)
|
void TransformedView::DrawRectDecal(const olc::vf2d& pos, const olc::vf2d& size, const olc::Pixel col)
|
||||||
{
|
{
|
||||||
pge->DrawRectDecal(WorldToScreen(pos), (size * m_vWorldScale).ceil(), col);
|
pge->DrawRectDecal(WorldToScreen(pos), size * m_vWorldScale, col);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TransformedView::DrawLineDecal(const olc::vf2d& pos1, const olc::vf2d& pos2, Pixel p)
|
void TransformedView::DrawLineDecal(const olc::vf2d& pos1, const olc::vf2d& pos2, Pixel p)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user