Add Tiled Map
This commit is contained in:
parent
166edd3e46
commit
b7728a38e4
70
TiledMap.cpp
Normal file
70
TiledMap.cpp
Normal 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
32
TiledMap.h
Normal 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
113
main.cpp
|
@ -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;
|
||||
}
|
||||
|
|
Reference in New Issue
Block a user