TSXParser refactor and preparations for editor functionality.

master
sigonasr2 9 months ago
parent b88c08261f
commit 5e81a2ce8f
  1. 438
      .gitignore
  2. 31
      TiledCollisionEditor.sln
  3. 44
      TiledCollisionEditor/Quadrilateral.h
  4. 171
      TiledCollisionEditor/TSXParser.h
  5. 175
      TiledCollisionEditor/TiledCollisionEditor.vcxproj
  6. 63
      TiledCollisionEditor/TiledCollisionEditor.vcxproj.filters
  7. 810
      TiledCollisionEditor/Tiles/Basic Tileset.tsx
  8. BIN
      TiledCollisionEditor/Tiles/tilemap-3-normal.png
  9. 53
      TiledCollisionEditor/Tileset.h
  10. 78
      TiledCollisionEditor/TilesetObject.cpp
  11. 55
      TiledCollisionEditor/TilesetObject.h
  12. 74
      TiledCollisionEditor/XMLTag.cpp
  13. 53
      TiledCollisionEditor/XMLTag.h
  14. 50
      TiledCollisionEditor/main.cpp
  15. 1177
      TiledCollisionEditor/olcPGEX_QuickGUI.h
  16. 0
      TiledCollisionEditor/olcPGEX_TransformedView.h
  17. 0
      TiledCollisionEditor/olcUTIL_Camera2D.h
  18. 0
      TiledCollisionEditor/olcUTIL_Geometry2D.h
  19. 2
      TiledCollisionEditor/pixelGameEngine.cpp
  20. 0
      TiledCollisionEditor/pixelGameEngine.h
  21. 56
      main.cpp

438
.gitignore vendored

@ -0,0 +1,438 @@
# Created by https://www.toptal.com/developers/gitignore/api/visualstudio,c++
# Edit at https://www.toptal.com/developers/gitignore?templates=visualstudio,c++
### C++ ###
# Prerequisites
*.d
*.ini
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Precompiled Headers
*.gch
*.pch
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Fortran module files
*.mod
*.smod
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
*.out
*.app
### VisualStudio ###
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
##
## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore
# User-specific files
*.rsuser
*.suo
*.user
*.userosscache
*.sln.docstates
# User-specific files (MonoDevelop/Xamarin Studio)
*.userprefs
# Mono auto generated files
mono_crash.*
# Build results
[Dd]ebug/
[Dd]ebugPublic/
[Rr]elease/
[Rr]eleases/
x64/
x86/
[Ww][Ii][Nn]32/
[Aa][Rr][Mm]/
[Aa][Rr][Mm]64/
bld/
[Bb]in/
[Oo]bj/
[Ll]og/
[Ll]ogs/
# Visual Studio 2015/2017 cache/options directory
.vs/
# Uncomment if you have tasks that create the project's static files in wwwroot
#wwwroot/
# Visual Studio 2017 auto generated files
Generated\ Files/
# MSTest test Results
[Tt]est[Rr]esult*/
[Bb]uild[Ll]og.*
# NUnit
*.VisualState.xml
TestResult.xml
nunit-*.xml
# Build Results of an ATL Project
[Dd]ebugPS/
[Rr]eleasePS/
dlldata.c
# Benchmark Results
BenchmarkDotNet.Artifacts/
# .NET Core
project.lock.json
project.fragment.lock.json
artifacts/
# ASP.NET Scaffolding
ScaffoldingReadMe.txt
# StyleCop
StyleCopReport.xml
# Files built by Visual Studio
*_i.c
*_p.c
*_h.h
*.ilk
*.meta
*.iobj
*.pdb
*.ipdb
*.pgc
*.pgd
*.rsp
*.sbr
*.tlb
*.tli
*.tlh
*.tmp
*.tmp_proj
*_wpftmp.csproj
*.log
*.tlog
*.vspscc
*.vssscc
.builds
*.pidb
*.svclog
*.scc
# Chutzpah Test files
_Chutzpah*
# Visual C++ cache files
ipch/
*.aps
*.ncb
*.opendb
*.opensdf
*.sdf
*.cachefile
*.VC.db
*.VC.VC.opendb
# Visual Studio profiler
*.psess
*.vsp
*.vspx
*.sap
# Visual Studio Trace Files
*.e2e
# TFS 2012 Local Workspace
$tf/
# Guidance Automation Toolkit
*.gpState
# ReSharper is a .NET coding add-in
_ReSharper*/
*.[Rr]e[Ss]harper
*.DotSettings.user
# TeamCity is a build add-in
_TeamCity*
# DotCover is a Code Coverage Tool
*.dotCover
# AxoCover is a Code Coverage Tool
.axoCover/*
!.axoCover/settings.json
# Coverlet is a free, cross platform Code Coverage Tool
coverage*.json
coverage*.xml
coverage*.info
# Visual Studio code coverage results
*.coverage
*.coveragexml
# NCrunch
_NCrunch_*
.*crunch*.local.xml
nCrunchTemp_*
# MightyMoose
*.mm.*
AutoTest.Net/
# Web workbench (sass)
.sass-cache/
# Installshield output folder
[Ee]xpress/
# DocProject is a documentation generator add-in
DocProject/buildhelp/
DocProject/Help/*.HxT
DocProject/Help/*.HxC
DocProject/Help/*.hhc
DocProject/Help/*.hhk
DocProject/Help/*.hhp
DocProject/Help/Html2
DocProject/Help/html
# Click-Once directory
publish/
# Publish Web Output
*.[Pp]ublish.xml
*.azurePubxml
# Note: Comment the next line if you want to checkin your web deploy settings,
# but database connection strings (with potential passwords) will be unencrypted
*.pubxml
*.publishproj
# Microsoft Azure Web App publish settings. Comment the next line if you want to
# checkin your Azure Web App publish settings, but sensitive information contained
# in these scripts will be unencrypted
PublishScripts/
# NuGet Packages
*.nupkg
# NuGet Symbol Packages
*.snupkg
# The packages folder can be ignored because of Package Restore
**/[Pp]ackages/*
# except build/, which is used as an MSBuild target.
!**/[Pp]ackages/build/
# Uncomment if necessary however generally it will be regenerated when needed
#!**/[Pp]ackages/repositories.config
# NuGet v3's project.json files produces more ignorable files
*.nuget.props
*.nuget.targets
# Microsoft Azure Build Output
csx/
*.build.csdef
# Microsoft Azure Emulator
ecf/
rcf/
# Windows Store app package directories and files
AppPackages/
BundleArtifacts/
Package.StoreAssociation.xml
_pkginfo.txt
*.appx
*.appxbundle
*.appxupload
# Visual Studio cache files
# files ending in .cache can be ignored
*.[Cc]ache
# but keep track of directories ending in .cache
!?*.[Cc]ache/
# Others
ClientBin/
~$*
*~
*.dbmdl
*.dbproj.schemaview
*.jfm
*.pfx
*.publishsettings
orleans.codegen.cs
# Including strong name files can present a security risk
# (https://github.com/github/gitignore/pull/2483#issue-259490424)
#*.snk
# Since there are multiple workflows, uncomment next line to ignore bower_components
# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
#bower_components/
# RIA/Silverlight projects
Generated_Code/
# Backup & report files from converting an old project file
# to a newer Visual Studio version. Backup files are not needed,
# because we have git ;-)
_UpgradeReport_Files/
Backup*/
UpgradeLog*.XML
UpgradeLog*.htm
ServiceFabricBackup/
*.rptproj.bak
# SQL Server files
*.mdf
*.ldf
*.ndf
# Business Intelligence projects
*.rdl.data
*.bim.layout
*.bim_*.settings
*.rptproj.rsuser
*- [Bb]ackup.rdl
*- [Bb]ackup ([0-9]).rdl
*- [Bb]ackup ([0-9][0-9]).rdl
# Microsoft Fakes
FakesAssemblies/
# GhostDoc plugin setting file
*.GhostDoc.xml
# Node.js Tools for Visual Studio
.ntvs_analysis.dat
node_modules/
# Visual Studio 6 build log
*.plg
# Visual Studio 6 workspace options file
*.opt
# Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
*.vbw
# Visual Studio 6 auto-generated project file (contains which files were open etc.)
*.vbp
# Visual Studio 6 workspace and project file (working project files containing files to include in project)
*.dsw
*.dsp
# Visual Studio 6 technical files
# Visual Studio LightSwitch build output
**/*.HTMLClient/GeneratedArtifacts
**/*.DesktopClient/GeneratedArtifacts
**/*.DesktopClient/ModelManifest.xml
**/*.Server/GeneratedArtifacts
**/*.Server/ModelManifest.xml
_Pvt_Extensions
# Paket dependency manager
.paket/paket.exe
paket-files/
# FAKE - F# Make
.fake/
# CodeRush personal settings
.cr/personal
# Python Tools for Visual Studio (PTVS)
__pycache__/
*.pyc
# Cake - Uncomment if you are using it
# tools/**
# !tools/packages.config
# Tabs Studio
*.tss
# Telerik's JustMock configuration file
*.jmconfig
# BizTalk build output
*.btp.cs
*.btm.cs
*.odx.cs
*.xsd.cs
# OpenCover UI analysis results
OpenCover/
# Azure Stream Analytics local run output
ASALocalRun/
# MSBuild Binary and Structured Log
*.binlog
# NVidia Nsight GPU debugger configuration file
*.nvuser
# MFractors (Xamarin productivity tool) working folder
.mfractor/
# Local History for Visual Studio
.localhistory/
# Visual Studio History (VSHistory) files
.vshistory/
# BeatPulse healthcheck temp database
healthchecksdb
# Backup folder for Package Reference Convert tool in Visual Studio 2017
MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
# Fody - auto-generated XML schema
FodyWeavers.xsd
# VS Code files for those working on multiple tools
.vscode/*
!.vscode/settings.json
!.vscode/tasks.json
!.vscode/launch.json
!.vscode/extensions.json
*.code-workspace
# Local History for Visual Studio Code
.history/
# Windows Installer files from build outputs
*.cab
*.msi
*.msix
*.msm
*.msp
# JetBrains Rider
*.sln.iml
### VisualStudio Patch ###
# Additional files built by Visual Studio
# End of https://www.toptal.com/developers/gitignore/api/visualstudio,c++

@ -0,0 +1,31 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.8.34525.116
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TiledCollisionEditor", "TiledCollisionEditor\TiledCollisionEditor.vcxproj", "{1DCE7E68-F810-4183-83F3-233A8EE41027}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x64 = Debug|x64
Debug|x86 = Debug|x86
Release|x64 = Release|x64
Release|x86 = Release|x86
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{1DCE7E68-F810-4183-83F3-233A8EE41027}.Debug|x64.ActiveCfg = Debug|x64
{1DCE7E68-F810-4183-83F3-233A8EE41027}.Debug|x64.Build.0 = Debug|x64
{1DCE7E68-F810-4183-83F3-233A8EE41027}.Debug|x86.ActiveCfg = Debug|Win32
{1DCE7E68-F810-4183-83F3-233A8EE41027}.Debug|x86.Build.0 = Debug|Win32
{1DCE7E68-F810-4183-83F3-233A8EE41027}.Release|x64.ActiveCfg = Release|x64
{1DCE7E68-F810-4183-83F3-233A8EE41027}.Release|x64.Build.0 = Release|x64
{1DCE7E68-F810-4183-83F3-233A8EE41027}.Release|x86.ActiveCfg = Release|Win32
{1DCE7E68-F810-4183-83F3-233A8EE41027}.Release|x86.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {DC9A1F91-BAD2-4A60-8406-CDB843D55AA0}
EndGlobalSection
EndGlobal

@ -0,0 +1,44 @@
#pragma region License
/*
License (OLC-3)
~~~~~~~~~~~~~~~
Copyright 2024 Joshua Sigona <sigonasr2@gmail.com>
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions or derivations of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions or derivative works in binary form must reproduce the above
copyright notice. This list of conditions and the following disclaimer must be
reproduced in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may
be used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
Portions of this software are copyright © 2024 The FreeType
Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
All rights reserved.
*/
#pragma endregion
#pragma once
#include "olcUTIL_Geometry2D.h"
using namespace olc;
#include <array>
using Quadrilateral=std::array<vf2d,4>;

@ -0,0 +1,171 @@
#pragma region License
/*
License (OLC-3)
~~~~~~~~~~~~~~~
Copyright 2024 Joshua Sigona <sigonasr2@gmail.com>
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions or derivations of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions or derivative works in binary form must reproduce the above
copyright notice. This list of conditions and the following disclaimer must be
reproduced in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may
be used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
Portions of this software are copyright © 2024 The FreeType
Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
All rights reserved.
*/
#pragma endregion
#pragma once
#include <sstream>
#include <map>
#include <unordered_map>
#include <fstream>
#include "olcUTIL_Geometry2D.h"
#include "Tileset.h"
using namespace olc;
using namespace olc::utils;
class TSXParser{
public:
inline Tileset&GetData(){
return parsedTilesetInfo;
}
private:
Tileset parsedTilesetInfo;
int previousTagID;
inline void ParseTag(std::string tag){
XMLTag newTag;
//First character is a '<' so we discard it.
tag.erase(0,1); tag.erase(tag.length()-1,1); //Erase the first and last characters in the tag. Now parse by spaces.
std::stringstream s(tag); //Turn it into a string stream to now parse into individual whitespaces.
std::string data;
while (s.good()) {
int quotationMarkCount=0;
bool pastEquals=false;
data="";
bool valid=false;
while(s.good()){
int character=s.get();
if(character=='"'){
quotationMarkCount++;
}
if(character==' '&&quotationMarkCount%2==0){
valid=true;
break;
}
data+=character;
if(pastEquals&&quotationMarkCount%2==0){
valid=true;
break;
}
if(character=='='&&quotationMarkCount%2==0){
pastEquals=true;
}
}
if(valid&&data.length()>0){
if (newTag.tag.length()==0) { //Tag's empty, so first line is the tag.
newTag.tag=data;
} else {
std::string key = data.substr(0,data.find("="));
std::string value = data.substr(data.find("=")+1,std::string::npos);
//Strip Quotation marks.
value = value.substr(1,std::string::npos);
value = value.substr(0,value.length()-1);
newTag.data[key]=value;
}
}
}
if (newTag.tag=="tileset") {
parsedTilesetInfo.tilewidth=stoi(newTag.data["tilewidth"]);
parsedTilesetInfo.tileheight=stoi(newTag.data["tileheight"]);
parsedTilesetInfo.columns=stoi(newTag.data["columns"]);
} else
if (newTag.tag=="image") {
parsedTilesetInfo.ImageData=newTag;
parsedTilesetInfo.filename=newTag.GetString("source");
parsedTilesetInfo.imagewidth=newTag.GetInteger("width");
parsedTilesetInfo.imageheight=newTag.GetInteger("height");
} else
if (newTag.tag=="property"){
if(newTag.data["name"]=="Name"){
std::string objectName=newTag.data["value"];
parsedTilesetInfo.objects[objectName].AddTile(parsedTilesetInfo,previousTagID);
}
} else
if (newTag.tag=="tile"){
previousTagID=newTag.GetInteger("id");
}
};
public:
inline TSXParser(std::string file)
:previousTagID(-1){
std::ifstream f(file,std::ios::in);
std::string accumulator="";
while (f.good()) {
std::string data;
f>>data;
if (data.empty()) continue;
if (accumulator.length()>0) {
accumulator+=" "+data;
//Check if it ends with '>'
if (data[data.length()-1]=='>') {
ParseTag(accumulator);
accumulator="";
}
} else
if (data[0]=='<') {
//Beginning of XML tag.
accumulator=data;
if(accumulator.length()>1&&accumulator.at(1)=='/'){
accumulator=""; //Restart because this is an end tag.
}
if(accumulator.length()>1&&accumulator.find('>')!=std::string::npos){
accumulator=""; //Restart because this tag has nothing in it!
}
}
}
}
};
//#define TSX_PARSER_SETUP
std::ostream&operator<<(std::ostream& os, Tileset& rhs){
os<<rhs.ImageData.FormatTagData(rhs.ImageData.data)<<"\n";
return os;
}
std::ostream& operator << (std::ostream& os, XMLTag& rhs){
os <<
rhs.tag <<"\n"<<
rhs.FormatTagData(rhs.data) <<"\n";
return os;
}

@ -0,0 +1,175 @@
<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup Label="ProjectConfigurations">
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Release</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Debug|x64">
<Configuration>Debug</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|x64">
<Configuration>Release</Configuration>
<Platform>x64</Platform>
</ProjectConfiguration>
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>17.0</VCProjectVersion>
<Keyword>Win32Proj</Keyword>
<ProjectGuid>{1dce7e68-f810-4183-83f3-233a8ee41027}</ProjectGuid>
<RootNamespace>TiledCollisionEditor</RootNamespace>
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<PlatformToolset>v143</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<ImportGroup Label="ExtensionSettings">
</ImportGroup>
<ImportGroup Label="Shared">
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
</ImportGroup>
<PropertyGroup Label="UserMacros" />
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>true</ConformanceMode>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
<EnableCOMDATFolding>true</EnableCOMDATFolding>
<OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation>
</Link>
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="olcPGEX_QuickGUI.h">
<SubType>
</SubType>
</ClInclude>
<ClInclude Include="olcPGEX_TransformedView.h" />
<ClInclude Include="olcUTIL_Camera2D.h" />
<ClInclude Include="olcUTIL_Geometry2D.h" />
<ClInclude Include="pixelGameEngine.h" />
<ClInclude Include="Quadrilateral.h">
<SubType>
</SubType>
</ClInclude>
<ClInclude Include="Tileset.h">
<SubType>
</SubType>
</ClInclude>
<ClInclude Include="TilesetObject.h">
<SubType>
</SubType>
</ClInclude>
<ClInclude Include="TSXParser.h">
<SubType>
</SubType>
</ClInclude>
<ClInclude Include="XMLTag.h">
<SubType>
</SubType>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp" />
<ClCompile Include="pixelGameEngine.cpp" />
<ClCompile Include="TilesetObject.cpp">
<SubType>
</SubType>
</ClCompile>
<ClCompile Include="XMLTag.cpp">
<SubType>
</SubType>
</ClCompile>
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
</ImportGroup>
</Project>

@ -0,0 +1,63 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Filter Include="Source Files">
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
<Extensions>cpp;c;cc;cxx;c++;cppm;ixx;def;odl;idl;hpj;bat;asm;asmx</Extensions>
</Filter>
<Filter Include="Header Files">
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
</Filter>
<Filter Include="Resource Files">
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
</Filter>
</ItemGroup>
<ItemGroup>
<ClInclude Include="olcPGEX_QuickGUI.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="olcPGEX_TransformedView.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="olcUTIL_Camera2D.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="olcUTIL_Geometry2D.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="pixelGameEngine.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="TSXParser.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="TilesetObject.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Tileset.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Quadrilateral.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="XMLTag.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="main.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="pixelGameEngine.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="TilesetObject.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="XMLTag.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
</Project>

@ -0,0 +1,810 @@
<?xml version="1.0" encoding="UTF-8"?>
<tileset version="1.10" tiledversion="1.10.2" name="Basic Tileset" tilewidth="16" tileheight="16" tilecount="864" columns="32">
<transformations hflip="1" vflip="1" rotate="0" preferuntransformed="0"/>
<image source="tilemap-3-normal.png" width="512" height="432"/>
<tile id="3" type="Object">
<properties>
<property name="Name" value="Stop Sign"/>
</properties>
</tile>
<tile id="4" type="Object">
<properties>
<property name="Name" value="Stop Sign"/>
</properties>
</tile>
<tile id="8" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="9" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="10" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="11" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="12" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="13" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="14" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="15" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="16" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="17" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="18" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="19" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="20" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="21" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="22" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="23" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="24" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="35" type="Object">
<properties>
<property name="Name" value="Stop Sign"/>
</properties>
</tile>
<tile id="36" type="Object">
<properties>
<property name="Name" value="Stop Sign"/>
</properties>
</tile>
<tile id="40" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="41" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="42" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="43" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="44" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="45" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="46" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="47" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="48" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="49" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="50" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="51" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="52" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="53" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="54" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="55" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="56" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="67" type="Object">
<properties>
<property name="Name" value="Stop Sign"/>
</properties>
</tile>
<tile id="68" type="Object">
<properties>
<property name="Name" value="Stop Sign"/>
</properties>
</tile>
<tile id="72" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="73" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="74" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="75" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="76" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="77" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="78" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="79" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="80" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="81" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="82" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="83" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="84" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="85" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="86" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="87" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="88" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="99" type="Object">
<properties>
<property name="Name" value="Stop Sign"/>
</properties>
</tile>
<tile id="100" type="Object">
<properties>
<property name="Name" value="Stop Sign"/>
</properties>
</tile>
<tile id="104" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="105" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="106" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="107" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="108" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="109" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="110" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="111" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="112" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="113" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="114" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="115" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="116" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="117" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="118" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="119" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="120" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="136" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="137" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="138" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="139" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="140" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="141" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="142" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="143" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="144" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="145" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="146" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="147" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="148" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="149" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="150" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="151" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="152" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="168" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="169" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="170" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="171" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="172" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="173" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="174" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="175" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="176" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="177" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="178" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="179" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="180" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="181" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="182" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="183" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="184" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="200" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="201" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="202" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="203" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="204" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="205" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="206" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="207" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="208" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="209" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="210" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="211" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="212" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="213" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="214" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="215" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="216" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="232" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="233" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="234" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="235" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="236" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="237" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="238" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="239" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="240" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="241" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="242" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="243" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="244" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="245" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="246" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="247" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="248" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="264" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="265" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="266" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="267" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="268" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="269" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="270" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="271" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="272" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="273" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="274" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="275" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="276" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="277" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="278" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="279" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
<tile id="280" type="PerspectiveObject">
<properties>
<property name="Name" value="BlueHouse1"/>
</properties>
</tile>
</tileset>

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

@ -0,0 +1,53 @@
#pragma region License
/*
License (OLC-3)
~~~~~~~~~~~~~~~
Copyright 2024 Joshua Sigona <sigonasr2@gmail.com>
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions or derivations of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions or derivative works in binary form must reproduce the above
copyright notice. This list of conditions and the following disclaimer must be
reproduced in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may
be used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
Portions of this software are copyright © 2024 The FreeType
Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
All rights reserved.
*/
#pragma endregion
#pragma once
#include <unordered_map>
#include "XMLTag.h"
#include "TilesetObject.h"
#include "pixelGameEngine.h"
struct Tileset{
std::string filename;
std::unordered_map<std::string,TilesetObject>objects;
XMLTag ImageData;
int tilewidth=0,tileheight=0;
int imagewidth=0,imageheight=0;
int columns=0;
bool isTerrain=false;
friend std::ostream& operator << (std::ostream& os, Tileset& rhs);
};

@ -0,0 +1,78 @@
#pragma region License
/*
License (OLC-3)
~~~~~~~~~~~~~~~
Copyright 2024 Joshua Sigona <sigonasr2@gmail.com>
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions or derivations of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions or derivative works in binary form must reproduce the above
copyright notice. This list of conditions and the following disclaimer must be
reproduced in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may
be used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
Portions of this software are copyright © 2024 The FreeType
Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
All rights reserved.
*/
#pragma endregion
#include "TilesetObject.h"
#include "Tileset.h"
void TilesetObject::AddTile(const Tileset&tileset,int tileID){
if(bounds.size==vi2d{1,1}){
int tileX=tileID%tileset.columns;
int tileY=tileID/tileset.columns;
bounds={vi2d{tileX,tileY}*tileset.tilewidth,{tileset.tilewidth,tileset.tileheight}};
upperLeftTileId=tileID;
}else{
int tileX=tileID%tileset.columns;
int tileY=tileID/tileset.columns;
int textureX=tileX*tileset.tilewidth;
int textureY=tileY*tileset.tileheight;
int minX=bounds.pos.x;
int minY=bounds.pos.y;
int maxX=bounds.pos.x+bounds.size.x;
int maxY=bounds.pos.y+bounds.size.y;
if(textureX<minX){
minX=textureX;
}
if(textureX+tileset.tilewidth>maxX){
maxX=textureX+tileset.tilewidth;
}
if(textureY<minY){
minY=textureY;
}
if(textureY+tileset.tileheight>maxY){
maxY=textureY+tileset.tileheight;
}
bounds={{minX,minY},{maxX-minX,maxY-minY}};
int minTileX=minX/tileset.tilewidth;
int minTileY=minY/tileset.tileheight;
int upperLeftTileId=minTileY*tileset.columns+minTileX;
this->upperLeftTileId=upperLeftTileId;
}
}

@ -0,0 +1,55 @@
#pragma region License
/*
License (OLC-3)
~~~~~~~~~~~~~~~
Copyright 2024 Joshua Sigona <sigonasr2@gmail.com>
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions or derivations of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions or derivative works in binary form must reproduce the above
copyright notice. This list of conditions and the following disclaimer must be
reproduced in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may
be used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
Portions of this software are copyright © 2024 The FreeType
Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
All rights reserved.
*/
#pragma endregion
#pragma once
#include <string>
#include "Quadrilateral.h"
using namespace olc::utils;
class Tileset;
class TilesetObject{
public:
std::string name;
int upperLeftTileId;
bool perspectiveObj=false;
bool facingLeft=true;
geom2d::rect<int>bounds;
std::vector<Quadrilateral>collisionTiles;
void AddTile(const Tileset&tileset,int tileID);
};

@ -0,0 +1,74 @@
#pragma region License
/*
License (OLC-3)
~~~~~~~~~~~~~~~
Copyright 2024 Joshua Sigona <sigonasr2@gmail.com>
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions or derivations of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions or derivative works in binary form must reproduce the above
copyright notice. This list of conditions and the following disclaimer must be
reproduced in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may
be used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
Portions of this software are copyright © 2024 The FreeType
Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
All rights reserved.
*/
#pragma endregion
#include "XMLTag.h"
const std::string XMLTag::FormatTagData(std::map<std::string,std::string>tiles){
std::string displayStr="";
for (std::map<std::string,std::string>::iterator it=data.begin();it!=data.end();it++) {
displayStr+=" "+it->first+": "+it->second+"\n";
}
return displayStr;
}
std::string XMLTag::str(){
return tag+"\n";
}
int XMLTag::GetInteger(std::string dataTag){
return std::stoi(data[dataTag]);
}
float XMLTag::GetFloat(std::string dataTag){
return std::stof(data[dataTag]);
}
double XMLTag::GetDouble(std::string dataTag){
return std::stod(data[dataTag]);
}
bool XMLTag::GetBool(std::string dataTag){
if (data[dataTag]=="0"||data[dataTag]=="false") {
return false;
} else {
return true;
}
}
std::string XMLTag::GetString(std::string dataTag){
return data[dataTag];
}

@ -0,0 +1,53 @@
#pragma region License
/*
License (OLC-3)
~~~~~~~~~~~~~~~
Copyright 2024 Joshua Sigona <sigonasr2@gmail.com>
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
1. Redistributions or derivations of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions or derivative works in binary form must reproduce the above
copyright notice. This list of conditions and the following disclaimer must be
reproduced in the documentation and/or other materials provided with the distribution.
3. Neither the name of the copyright holder nor the names of its contributors may
be used to endorse or promote products derived from this software without specific
prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
SUCH DAMAGE.
Portions of this software are copyright © 2024 The FreeType
Project (www.freetype.org). Please see LICENSE_FT.txt for more information.
All rights reserved.
*/
#pragma endregion
#pragma once
#include <string>
#include <map>
struct XMLTag{
std::string tag;
std::map<std::string,std::string> data;
const std::string FormatTagData(std::map<std::string,std::string>tiles);
friend std::ostream& operator << (std::ostream& os, XMLTag& rhs);
std::string str();
int GetInteger(std::string dataTag);
float GetFloat(std::string dataTag);
double GetDouble(std::string dataTag);
bool GetBool(std::string dataTag);
std::string GetString(std::string dataTag);
};

@ -0,0 +1,50 @@
#include "TSXParser.h"
#include "olcPGEX_TransformedView.h"
#include "olcUTIL_Camera2D.h"
#include "olcPGEX_QuickGUI.h"
using namespace olc;
using namespace olc::utils;
const std::string TILESET_DIR="./Tiles/";
class TiledCollisionEditor : public olc::PixelGameEngine
{
std::unordered_map<std::string,Tileset>tilesets;
std::unordered_map<std::string,Renderable>images;
public:
TiledCollisionEditor()
{
sAppName = "TiledCollisionEditor";
}
public:
bool OnUserCreate() override
{
std::string tilesetFilename=TILESET_DIR+"Basic Tileset.tsx";
Tileset&tileset=tilesets[tilesetFilename]=TSXParser{tilesetFilename}.GetData();
Renderable&tilesetImg=images[tilesetFilename];
tilesetImg.Load(TILESET_DIR+tileset.filename);
return true;
}
bool OnUserUpdate(float fElapsedTime) override
{
Clear(VERY_DARK_BLUE);
for(auto&[tilesetName,tileset]:tilesets){
DrawDecal({0,0},images[tilesetName].Decal());
}
return true;
}
};
int main()
{
TiledCollisionEditor demo;
if (demo.Construct(640, 180, 4, 4))
demo.Start();
return 0;
}

File diff suppressed because it is too large Load Diff

@ -4,3 +4,5 @@
#include "pixelGameEngine.h" #include "pixelGameEngine.h"
#define OLC_PGEX_TRANSFORMEDVIEW #define OLC_PGEX_TRANSFORMEDVIEW
#include "olcPGEX_TransformedView.h" #include "olcPGEX_TransformedView.h"
#define OLC_PGEX_QUICKGUI
#include "olcPGEX_QuickGUI.h"

@ -1,56 +0,0 @@
#include "olcUTIL_Geometry2D.h"
#include "pixelGameEngine.h"
#include "olcPGEX_TransformedView.h"
#include "olcUTIL_Camera2D.h"
using namespace olc;
#define WIDTH 640
#define HEIGHT 480
class TiledCollisionEditor : public olc::PixelGameEngine
{
public:
TiledCollisionEditor()
{
sAppName = "TiledCollisionEditor";
}
public:
bool OnUserCreate() override
{
return true;
}
bool OnUserUpdate(float fElapsedTime) override
{
return true;
}
bool OnUserDestroy()override{
return true;
}
};
enum Direction{
RIGHT,
DOWN,
LEFT,
UP
};
struct Data{
int x,y;
};
int main()
{
TiledCollisionEditor demo;
if (demo.Construct(640, 480, 4, 4))
demo.Start();
return 0;
}
Loading…
Cancel
Save