|
|
|
@ -1,3 +1,4 @@ |
|
|
|
|
#include "olcUTIL_Geometry2D.h" |
|
|
|
|
#include "TSXParser.h" |
|
|
|
|
#include "olcPGEX_TransformedView.h" |
|
|
|
|
#include "olcUTIL_Camera2D.h" |
|
|
|
@ -19,6 +20,8 @@ class TiledCollisionEditor : public olc::PixelGameEngine |
|
|
|
|
int editingPoint=4; //0-3 for the index we are editing within editingQuad.
|
|
|
|
|
bool dragging=false; |
|
|
|
|
|
|
|
|
|
Renderable circle; |
|
|
|
|
|
|
|
|
|
TransformedView view; |
|
|
|
|
|
|
|
|
|
public: |
|
|
|
@ -34,6 +37,13 @@ public: |
|
|
|
|
{ |
|
|
|
|
SetFontSprite("font3.png"); |
|
|
|
|
|
|
|
|
|
circle.Create(5,5); |
|
|
|
|
SetDrawTarget(circle.Sprite()); |
|
|
|
|
Clear(BLANK); |
|
|
|
|
FillCircle({2,2},2); |
|
|
|
|
SetDrawTarget(nullptr); |
|
|
|
|
circle.Decal()->Update(); |
|
|
|
|
|
|
|
|
|
std::string tilesetFilename=TILESET_DIR+"Basic Tileset.tsx"; |
|
|
|
|
Tileset&tileset=tilesets[tilesetFilename]=TSXParser{tilesetFilename}.GetData(); |
|
|
|
|
|
|
|
|
@ -122,6 +132,21 @@ public: |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(GetMouse(Mouse::LEFT).bPressed){ |
|
|
|
|
#pragma region Select a point on a collision quad. |
|
|
|
|
for(const Quadrilateral&quad:obj.collisionTiles){ |
|
|
|
|
for(size_t pointInd=0;const vf2d&point:quad){ |
|
|
|
|
if(geom2d::line<float>(point,view.ScreenToWorld(GetMousePos())).length()<4){ |
|
|
|
|
if(GetMouse(Mouse::LEFT).bPressed){ |
|
|
|
|
editingPoint=pointInd; |
|
|
|
|
editingQuad=const_cast<Quadrilateral*>(&quad); |
|
|
|
|
} |
|
|
|
|
goto exitCollisionCheck; |
|
|
|
|
} |
|
|
|
|
pointInd++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
exitCollisionCheck: |
|
|
|
|
#pragma endregion |
|
|
|
|
if(EditingQuad&&!dragging){ |
|
|
|
|
(*editingQuad)[editingPoint]=GetSnapPoint(); |
|
|
|
|
editingPoint++; |
|
|
|
@ -129,12 +154,12 @@ public: |
|
|
|
|
if(obj.collisionTiles.size()==0){ |
|
|
|
|
Quadrilateral newQuad{GetSnapPoint()}; |
|
|
|
|
tilesets[activeTileset].objects[selectedObj].collisionTiles.push_back(newQuad); |
|
|
|
|
} |
|
|
|
|
dragging=true; |
|
|
|
|
editingQuad=const_cast<Quadrilateral*>(&obj.collisionTiles.back());
|
|
|
|
|
originalQuad=*editingQuad; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if(GetMouse(Mouse::LEFT).bReleased){ |
|
|
|
|
if(EditingQuad&&dragging){ |
|
|
|
@ -144,6 +169,10 @@ public: |
|
|
|
|
(*editingQuad)[2]=GetSnapPoint(); |
|
|
|
|
(*editingQuad)[3]=vf2d{initialPoint.x,cursorPos.y}; |
|
|
|
|
dragging=false; |
|
|
|
|
}else |
|
|
|
|
if(EditingQuad&&!dragging){ |
|
|
|
|
(*editingQuad)[editingPoint]=GetSnapPoint(); |
|
|
|
|
editingPoint=4; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -164,6 +193,15 @@ public: |
|
|
|
|
uvs.assign(4,{0.f,0.f}); |
|
|
|
|
cols.assign(4,{255,40,40,128}); |
|
|
|
|
view.DrawPolygonDecal(nullptr,points,uvs,cols); |
|
|
|
|
|
|
|
|
|
for(bool highlighted=false;const vf2d&point:quad){ |
|
|
|
|
if(geom2d::line<float>(point,view.ScreenToWorld(GetMousePos())).length()<4&&!highlighted){ |
|
|
|
|
view.DrawRotatedDecal(point,circle.Decal(),0.f,circle.Sprite()->Size()/2,{1.f,1.f},YELLOW); |
|
|
|
|
highlighted=true; |
|
|
|
|
}else{ |
|
|
|
|
view.DrawRotatedDecal(point,circle.Decal(),0.f,circle.Sprite()->Size()/2,{1.f,1.f},RED); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|