Greetings,
Right now i have a tilemap made with the MS Scrolling Engine. I totally love it. However if i use MoveLayer i have to relocate all the sprites on their corresponding positions each time i use it. This of course will drop my framerate alot if i have some creatures and npcs walking around. So what i really would like to do is instead of moving the layers moving the player around and making some sort of camera that follows him.
For this to be done i need to have the map on a seperate surface which i then will be able to clip and blit to CRM32Pro.screen. I can't get this to work. Whenever i give the map a render target different then CRM32Pro.screen i get nothing but a blackscreen.
The map does work on CRM32Pro.screen.
Here is my map.cpp:
Here are some relevant pieces of code from my Controller.cpp:
What am i doing wrong? or what is missing?
Greetings,
Blackunknown(made a typo while registering)
Right now i have a tilemap made with the MS Scrolling Engine. I totally love it. However if i use MoveLayer i have to relocate all the sprites on their corresponding positions each time i use it. This of course will drop my framerate alot if i have some creatures and npcs walking around. So what i really would like to do is instead of moving the layers moving the player around and making some sort of camera that follows him.
For this to be done i need to have the map on a seperate surface which i then will be able to clip and blit to CRM32Pro.screen. I can't get this to work. Whenever i give the map a render target different then CRM32Pro.screen i get nothing but a blackscreen.
The map does work on CRM32Pro.screen.
Here is my map.cpp:
Código [Seleccionar]
#include "Map.h"
Map::Map(SDL_Surface *target){
this->target = target;
SE = new cMSSE;
SE->Init("Map");
SE->SetRenderTarget(target);
tileset = new CRM32Pro_CTile;
//tileset->Create("tiles.bmp","test");
tileset->Load(GFX_RESOURCE, "Tileset");
tileset->SetTileSet(1, 32, 32);
mapBase = new cMSSE_MapBase(100,100);
mapBase->SetMapBaseValue(-1,-1,2); // Fill all map with value 1
mapBase->SetTileSizeX(32);
mapBase->SetTileSizeY(32);
if(mapBase->CheckMap() == 0)
ILogSystem.Msg(LOG_NORMAL," - ManualLoad() has found problems checking the map on layer 0\n");
// Assign the map and tileset to layer '0'
SE->SetLayerMapData(0, mapBase);
SE->SetLayerTileset(0, tileset);
// Set the status: execution and autospeed
SE->SetLayerStatus(0,SE_LAYERSTATUS_EXECUTE_SPEED);
// -Layer '1' initialization-
layer1 = new cMSSE_MapBase(100, 100);
layer1->SetTileSizeX(32);
layer1->SetTileSizeY(32);
for(int i = 0; i < 100; i++){
for(int j = 0; j < 100; j++){
layer1->iTilemap[i][j] = 6;
}
}
layer1->iTilemap[50][40] = 20;
layer1->CheckMap();
SE->SetLayerMapData(1, layer1);
SE->SetLayerTileset(1, tileset);
SE->SetLayerStatus(1, SE_LAYERSTATUS_EXECUTE_SPEED);
SE->SetLayerPosition(1,SE_LAYERPOSITION_MIDDLE, SE_LAYERPOSITION_MIDDLE);
SDL_Rect offset;
offset.x = 512 - 10*32;
offset.y = 384 - 8*32;
offset.h = 16*32;
offset.w = 20*32;
SE->SetViewport(&offset);
}
void Map::init(){
}
void Map::update(){
SE->Update();
}
void Map::moveLayer(int layer, int x, int y){
SE->MoveLayer(layer, x, y);
}
Here are some relevant pieces of code from my Controller.cpp:
Código [Seleccionar]
//I dont know any other way to initiate an SDL_Surface if there is one //please tell me.
mapSurface = IImage->Load(GFX_RESOURCE, "background");
map = new Map(mapSurface);
//Game loop
void Controller::Run(){
while(!quit){
calculateFrames();
checkInput();
movePlayer();
//AI routine
drawGame();
updateWindow();
clearMemory();
}
CRM32Pro.Quit();
}
//the drawGame method
void Controller::drawGame(){
//No clipping yet. Calculated camera clipping should happen here.
SDL_BlitSurface(mapSurface,NULL,CRM32Pro.screen,NULL);
map->update();
SDL_BlitSurface(fps,NULL,CRM32Pro.screen,NULL);
player->draw();
}
What am i doing wrong? or what is missing?
Greetings,
Blackunknown(made a typo while registering)