diff --git a/Crawler/Crawler.cpp b/Crawler/Crawler.cpp index 25bb250e..b8c21337 100644 --- a/Crawler/Crawler.cpp +++ b/Crawler/Crawler.cpp @@ -8,6 +8,7 @@ #include "Version.h" #include "TMXParser.h" #include "TSXParser.h" +#include "Map.h" #include "DEFINES.h" //192x192 @@ -342,11 +343,7 @@ void Crawler::HandleUserInput(float fElapsedTime){ } if(player.GetVelocity()==vf2d{0,0}){ if(RightHeld()){ - if(player.GetPos().x+12*player.GetSizeMult()+fElapsedTime*100*player.GetMoveSpdMult()0){ - player.SetX(player.GetX()-fElapsedTime*100*player.GetMoveSpdMult()); - } else { - player.SetX(12); - } + player.SetX(player.GetX()-fElapsedTime*100*player.GetMoveSpdMult()); if(setIdleAnimation){ player.SetFacingDirection(LEFT); if(player.GetState()==State::NORMAL){ @@ -368,11 +361,7 @@ void Crawler::HandleUserInput(float fElapsedTime){ setIdleAnimation=false; } if(UpHeld()){ - if(player.GetPos().y-12*player.GetSizeMult()+fElapsedTime*100*player.GetMoveSpdMult()>0){ - player.SetY(player.GetY()-fElapsedTime*100*player.GetMoveSpdMult()); - } else { - player.SetY(12); - } + player.SetY(player.GetY()-fElapsedTime*100*player.GetMoveSpdMult()); if(setIdleAnimation){ player.SetFacingDirection(UP); if(player.GetState()==State::NORMAL){ @@ -382,11 +371,7 @@ void Crawler::HandleUserInput(float fElapsedTime){ setIdleAnimation=false; } if(DownHeld()){ - if(player.GetPos().y+12*player.GetSizeMult()+fElapsedTime*100*player.GetMoveSpdMult()Decal(),vi2d{tileSheetX,tileSheetY}*24,{24,24}); } + if(tileSheet.tileset.collision.find(tileSheetIndex)!=tileSheet.tileset.collision.end()){ + geom2d::rectcollision=tileSheet.tileset.collision[tileSheetIndex].collision; + view.FillRectDecal(vi2d{x,y}*24+collision.pos,collision.size,{0,0,0,128}); + view.DrawRectDecal(vi2d{x,y}*24+collision.pos,collision.size,GREY); + } } } } @@ -797,6 +787,7 @@ void Crawler::InitializeLevel(std::string mapFile,MapName map){ Renderable*r=new Renderable(); MAP_TILESETS["assets/maps/"+baseSourceDir].tileset=r; MAP_TILESETS["assets/maps/"+baseSourceDir].foregroundTiles=tileset.GetData().ForegroundTileData; + MAP_TILESETS["assets/maps/"+baseSourceDir].collision=tileset.GetData().CollisionData; r->Load("assets/maps/"+tileset.GetData().ImageData.data["source"]); } } @@ -806,6 +797,7 @@ void Crawler::LoadLevel(MapName map){ SPAWNER_LIST.clear(); foregroundTileGroups.clear(); currentLevel=map; + player.SetPos(MAP_DATA[map].MapData.playerSpawnLocation); WORLD_SIZE={MAP_DATA[map].MapData.width,MAP_DATA[map].MapData.height}; for(SpawnerTag&spawner:MAP_DATA[map].SpawnerData){ std::vector>monster_list; diff --git a/Crawler/Crawler.h b/Crawler/Crawler.h index 111941fe..3bc19ff9 100644 --- a/Crawler/Crawler.h +++ b/Crawler/Crawler.h @@ -32,13 +32,13 @@ class Crawler : public olc::PixelGameEngine vf2d worldShakeVel={}; const float WORLD_SHAKE_ADJUST_MAX_TIME=0.4; MapName currentLevel=MapName::CAMPAIGN_1_1; - vi2d WORLD_SIZE={120,8}; std::vectorforegroundTileGroups; public: Crawler(); public: + vi2d WORLD_SIZE={120,8}; TileTransformedView view; bool OnUserCreate() override; bool OnUserUpdate(float fElapsedTime) override; diff --git a/Crawler/Crawler.tiled-project b/Crawler/Crawler.tiled-project index 30a4cb54..ee9ed39f 100644 --- a/Crawler/Crawler.tiled-project +++ b/Crawler/Crawler.tiled-project @@ -164,7 +164,7 @@ "id": 4, "members": [ ], - "name": "SpawnLocation", + "name": "PlayerSpawnLocation", "type": "class", "useAs": [ "property", diff --git a/Crawler/Map.h b/Crawler/Map.h index 22db9fdd..c66ab746 100644 --- a/Crawler/Map.h +++ b/Crawler/Map.h @@ -1,16 +1,22 @@ #pragma once -#include "TSXParser.h" #include "olcUTIL_Geometry2D.h" +struct XMLTag; + enum MapName{ LEVEL1, LEVEL2, CAMPAIGN_1_1, }; +struct TileCollisionData{ + geom2d::rectcollision; +}; + struct TilesetData{ Renderable*tileset; std::mapforegroundTiles; + std::mapcollision; }; struct TileRenderData{ diff --git a/Crawler/Monster.cpp b/Crawler/Monster.cpp index 771cce51..7327dfc9 100644 --- a/Crawler/Monster.cpp +++ b/Crawler/Monster.cpp @@ -167,6 +167,7 @@ bool Monster::Update(float fElapsedTime){ targetAcquireTimer=3; target=geom2d::line(pos,game->GetPlayer().GetPos()).upoint(1.2); state=MOVE_TOWARDS; + hasHitPlayer=false; } if(state==MOVE_TOWARDS&&geom2d::line(pos,target).length()>100*fElapsedTime*GetMoveSpdMult()){ SetPosition(pos+geom2d::line(pos,target).vector().norm()*100*fElapsedTime*GetMoveSpdMult()); @@ -295,7 +296,8 @@ void Monster::Draw(){ } } void Monster::Collision(Player&p){ - if(MONSTER_DATA[type].GetCollisionDmg()>0){ + if(MONSTER_DATA[type].GetCollisionDmg()>0&&!hasHitPlayer){ + hasHitPlayer=true; p.Hurt(MONSTER_DATA[type].GetCollisionDmg()); } Collision(); diff --git a/Crawler/Monster.h b/Crawler/Monster.h index 889a101e..c32fb786 100644 --- a/Crawler/Monster.h +++ b/Crawler/Monster.h @@ -71,6 +71,7 @@ struct Monster{ MonsterName type; std::vectorbuffList; AnimationState GetDeathAnimationName(); + bool hasHitPlayer=false; public: Monster(); Monster(vf2d pos,MonsterData data); diff --git a/Crawler/Player.cpp b/Crawler/Player.cpp index b65c97b6..762bd81a 100644 --- a/Crawler/Player.cpp +++ b/Crawler/Player.cpp @@ -29,11 +29,11 @@ void Player::SetClass(Class cl){ } void Player::SetX(float x){ - pos.x=x; + pos.x=std::clamp(x,12.f,float(game->WORLD_SIZE.x*24-12)); }; void Player::SetY(float y){ - pos.y=y; + pos.y=std::clamp(y,12.f,float(game->WORLD_SIZE.y*24-12)); } void Player::SetZ(float z){ @@ -221,13 +221,9 @@ void Player::Update(float fElapsedTime){ vel.y=std::min(0.f,vel.y+friction*fElapsedTime); } float newX=pos.x+vel.x*fElapsedTime; - if(newX-12*size>0&&newX+12*sizeGetWorldSize().x*24){ - pos.x=newX; - } float newY=pos.y+vel.y*fElapsedTime; - if(newY-12*size>0&&newY+12*sizeGetWorldSize().y*24){ - pos.y=newY; - } + SetX(newX); + SetY(newY); if(attack_cooldown_timer==0&&game->GetMouse(0).bHeld){ switch (cl) { case WARRIOR:{ diff --git a/Crawler/TMXParser.h b/Crawler/TMXParser.h index 4fbc5f38..109cdfbc 100644 --- a/Crawler/TMXParser.h +++ b/Crawler/TMXParser.h @@ -18,6 +18,7 @@ struct XMLTag{ struct MapTag{ int width,height; + vi2d playerSpawnLocation; friend std::ostream& operator << (std::ostream& os, MapTag& rhs); }; @@ -74,7 +75,7 @@ class TMXParser{ } std::ostream& operator << (std::ostream& os, MapTag& rhs){ os << - "(width:"< #include "TMXParser.h" +#include "Map.h" +#include "olcUTIL_Geometry2D.h" using namespace olc; struct Tileset{ XMLTag ImageData; std::map ForegroundTileData; + std::map CollisionData; friend std::ostream& operator << (std::ostream& os, Tileset& rhs); }; @@ -17,6 +20,8 @@ class TSXParser{ private: Tileset parsedTilesetInfo; void ParseTag(std::string tag); + std::string previousTag; + int previousTagID; public: TSXParser(std::string file); }; @@ -81,7 +86,16 @@ class TSXParser{ parsedTilesetInfo.ImageData=newTag; } else if (newTag.tag=="tile"&&newTag.data["type"]=="ForegroundTile"){ - parsedTilesetInfo.ForegroundTileData[stoi(newTag.data["id"])]=newTag; + parsedTilesetInfo.ForegroundTileData[newTag.GetInteger("id")]=newTag; + } else + if (newTag.tag=="tile"){ + previousTag=newTag.tag; + previousTagID=newTag.GetInteger("id"); + } else + if (newTag.tag=="object"&&previousTag=="tile"){ + TileCollisionData data; + data.collision=geom2d::rect{{newTag.GetInteger("x"),newTag.GetInteger("y")},{newTag.GetInteger("width"),newTag.GetInteger("height")}}; + parsedTilesetInfo.CollisionData[previousTagID]=data; } std::cout<<"\n"<<"=============\n"; } diff --git a/Crawler/Version.h b/Crawler/Version.h index f0c82786..cba763e3 100644 --- a/Crawler/Version.h +++ b/Crawler/Version.h @@ -2,7 +2,7 @@ #define VERSION_MAJOR 0 #define VERSION_MINOR 2 #define VERSION_PATCH 0 -#define VERSION_BUILD 231 +#define VERSION_BUILD 245 #define stringify(a) stringify_(a) #define stringify_(a) #a diff --git a/Crawler/assets/Campaigns/1_1_test.tmx b/Crawler/assets/Campaigns/1_1_test.tmx index be164fc0..e388f4ea 100644 --- a/Crawler/assets/Campaigns/1_1_test.tmx +++ b/Crawler/assets/Campaigns/1_1_test.tmx @@ -1,5 +1,5 @@ - + @@ -490,4 +490,22 @@ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + + + + + + + + + + + + + + + + + + diff --git a/Crawler/assets/maps/Level1.tmx b/Crawler/assets/maps/Level1.tmx index ae9064ca..54ce5776 100644 --- a/Crawler/assets/maps/Level1.tmx +++ b/Crawler/assets/maps/Level1.tmx @@ -142,7 +142,7 @@ - + diff --git a/Crawler/assets/maps/Level2.tmx b/Crawler/assets/maps/Level2.tmx index a4c09b39..669da2b9 100644 --- a/Crawler/assets/maps/Level2.tmx +++ b/Crawler/assets/maps/Level2.tmx @@ -258,7 +258,7 @@ - +