Add Tiled Map

master
Kirigaya Kazuto 2017-05-08 20:04:42 +08:00
parent 166edd3e46
commit b7728a38e4
3 changed files with 212 additions and 3 deletions

70
TiledMap.cpp Normal file
View File

@ -0,0 +1,70 @@
#include "TiledMap.h"
TiledBox::TiledBox()
{
tid=-1;
}
struct TiledMap::impl
{
int l,c;
TiledBox** data;
int rectsize;
int vpline,vpcol;
};
TiledMap::TiledMap(int Line,int Col,int RectSize)
{
sp.reset(new impl);
sp->l=Line;
sp->c=Col;
sp->rectsize=RectSize;
sp->vpline=0;
sp->vpcol=0;
sp->data=new TiledBox*[sp->l];
for(int i=0;i<sp->l;i++)
{
sp->data[i]=new TiledBox[sp->c];
}
}
int TiledMap::setBox(int LineID, int ColID, const TiledBox& box)
{
if(LineID>0&&LineID<sp->l&&ColID>0&&ColID<sp->c)
{
sp->data[LineID][ColID]=box;
return 0;
}
return -1;
}
TiledBox* TiledMap::operator[] (int LineID)
{
return sp->data[LineID];
}
int TiledMap::getRectSize()
{
return sp->rectsize;
}
void TiledMap::setRectSize(int RectSize)
{
if(RectSize<0) RectSize=0;
sp->rectsize=RectSize;
}
void TiledMap::setViewPoint(int Line, int Col)
{
Line=std::min(std::max(Line,0),sp->l);
Col=std::min(std::max(Col,0),sp->c);
sp->vpline=Line;
sp->vpcol=Col;
}
void TiledMap::getViewPoint(int& refLine, int& refCol)
{
refLine=sp->vpline;
refCol=sp->vpcol;
}

32
TiledMap.h Normal file
View File

@ -0,0 +1,32 @@
#pragma once
#include <memory>
#include "MiniEngine/MiniEngine.h"
typedef int TextureID;
/** TextureID:
>=0 Valid Texture
-1 Empty
-2 Colored
*/
struct TiledBox
{
TiledBox();
TextureID tid;
MiniEngine::RGBA color;
};
class TiledMap
{
public:
TiledMap(int Line,int Col,int RectSize);
int setBox(int LineID,int ColID,const TiledBox& box);
TiledBox* operator[](int LineID);
void setRectSize(int RectSize);
int getRectSize();
void setViewPoint(int Line,int Col);
void getViewPoint(int& refLine,int& refCol);
private:
struct impl;
std::shared_ptr<impl> sp;
};

113
main.cpp
View File

@ -1,9 +1,116 @@
#include <iostream>
#include "MiniEngine/MiniEngine.h"
#include "MiniEngine/MiniEngine_Event.h"
using namespace MiniEngine;
#include "TiledMap.h"
#include <cstdlib>
using namespace std;
int main()
int AppMain()
{
cout << "Hello world!" << endl;
Window wnd("TiledMap",1024,768);
Renderer rnd=wnd.getRenderer();
TiledMap tmap(20,15,20);
for(int i=0;i<20;i++)
{
for(int j=0;j<15;j++)
{
TiledBox box;
box.tid=-1-rand()%2;
if(box.tid==-2) box.color=RGBA(255,0,0,0);
tmap[i][j]=box;
}
}
tmap.setViewPoint(10,7);
Looper lp;
lp.updater=[&]()
{
Point center(1024/2,768/2);
int vl,vc;
tmap.getViewPoint(vl,vc);
int width=tmap.getRectSize();
rnd.clear();
for(int i=0;i<20;i++)
{
for(int j=0;j<15;j++)
{
Rect rc;
rc.x=center.x-(vc-j)*width-width/2;
rc.y=center.y-(vl-i)*width-width/2;
rc.w=rc.h=width;
SDL_Rect a=rc.toSDLRect();
SDL_Rect b=wnd.getSize().toSDLRect();
if(SDL_HasIntersection(&a,&b)==SDL_TRUE)
{
switch(tmap[i][j].tid)
{
case -1:
break;
case -2:
rnd.setColor(tmap[i][j].color);
rnd.fillRect(rc);
rnd.setColor(RGBA(0,0,0,0));
break;
}
}
}
}
rnd.update();
};
lp.add(SDL_QUIT,[&](){lp.stop();});
lp.add(SDL_KEYDOWN,[&](Event& e)
{
switch(e.key.keysym.sym)
{
case SDLK_KP_PLUS:
printf("Plus Pressed.\n");
tmap.setRectSize(tmap.getRectSize()+10);
lp.needupdate();
break;
case SDLK_KP_MINUS:
printf("Minus Presse.\n");
tmap.setRectSize(tmap.getRectSize()-10);
lp.needupdate();
break;
case SDLK_DOWN:
{
int vx,vy;
tmap.getViewPoint(vx,vy);
tmap.setViewPoint(vx+1,vy);
lp.needupdate();
}
break;
case SDLK_UP:
{
int vx,vy;
tmap.getViewPoint(vx,vy);
tmap.setViewPoint(vx-1,vy);
lp.needupdate();
}
break;
case SDLK_LEFT:
{
int vx,vy;
tmap.getViewPoint(vx,vy);
tmap.setViewPoint(vx,vy-1);
lp.needupdate();
}
break;
case SDLK_RIGHT:
{
int vx,vy;
tmap.getViewPoint(vx,vy);
tmap.setViewPoint(vx,vy+1);
lp.needupdate();
}
break;
}
});
lp.run();
return 0;
}