From cdab15d8d3070099a3644be7544e191dabb282f7 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Fri, 23 Jun 2023 20:42:55 -0700 Subject: [PATCH] Add hit reset flag for monsters that charge at players such that they must reset it to damage the player with contact damage again. Player spawn location now reads from the level file. Collision tile data loaded. --- Crawler/Crawler.cpp | 32 ++++++++++----------------- Crawler/Crawler.h | 2 +- Crawler/Crawler.tiled-project | 2 +- Crawler/Map.h | 8 ++++++- Crawler/Monster.cpp | 4 +++- Crawler/Monster.h | 1 + Crawler/Player.cpp | 12 ++++------ Crawler/TMXParser.h | 20 ++++++++++------- Crawler/TSXParser.h | 16 +++++++++++++- Crawler/Version.h | 2 +- Crawler/assets/Campaigns/1_1_test.tmx | 20 ++++++++++++++++- Crawler/assets/maps/Level1.tmx | 2 +- Crawler/assets/maps/Level2.tmx | 2 +- 13 files changed, 78 insertions(+), 45 deletions(-) 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 @@ - +