Natürlich antworte ich
Hoffe ja auf die Hilfe von erfahrenen Leuten hier da ich sowas in der form bisher nicht gemacht habe.
Das mit den Klassen war mir soweit bewusst..war halt bisher nur ein testdurchlauf.
Bin auch dran das sinnvoll zu erweitern da es natürlich auf lange sicht ein kleines rpg werden soll
Das mit den Texturen habe ich jetzt soweit hinbekommen, sprich die performance warnung bekomme ich nicht mehr.
Bin im moment nur am rumprobieren also nichts wesentliches zu zeigen/sagen oder so...
Aber ein Punkt evt. noch:
Das man die sachen möglichst selten zeichnen sollte ist mir bewusst auch wenn ich es bisher nicht beherzigt habe
würde da mir aber einfach in der klasse "Instanz" (das spiegelt die map bzw den teil der map wieder in der man sich befindet) einen flag setzen ob sich die karte verändert hat, sprich ob der ausschnitt gescrollt werden müsste ?wenn ja neu zeichnen, wenn nein bleibts so.
Figuren werden sowieso in einer eigenen Klasse gerendet haben damit also erstmal weniger zu tun.
Wie gesagt habe ich den flag noch nicht gesetzt aber eine if anweisung darum würde jetzt auch nicht so die welt sein aber es geht hier um die anderen Punkte.
Ich denke hier kann man noch viel rausholen, die Funktion in der Klasse die für das zeichnen zuständig ist sieht aktuell so aus:
Code:
void drawMap(int x, int y, IrrlichtDevice *device)
{
video::IVideoDriver *driver = device->getVideoDriver();
//Terrain
video::ITexture* TroughEarth = driver->getTexture("media/Trough_earth/rough ripple earth dark to grass tileset.bmp");
driver->makeColorKeyTexture(TroughEarth, core::position2d<s32>(0,0));
//MapElements:
video::ITexture* Trees = driver->getTexture("media/TTrees/trees_tileset.bmp");
driver->makeColorKeyTexture(Trees, core::position2d<s32>(0,0));
video::ITexture* wall = driver->getTexture("media/TStonewall/brownStonewall.bmp");
driver->makeColorKeyTexture(wall, core::position2d<s32>(0,0));
video::ITexture* hills = driver->getTexture("media/TStonebrown/tileset.bmp");
driver->makeColorKeyTexture(hills, core::position2d<s32>(0,0));
//Hintergrund zeichnen
for(int i=0; i < 6; i++)
{
for(int j = 0; j<6; j++)
{
driver->draw2DImage(TroughEarth, core::position2d<s32>(i*200,j*140),core::rect<s32>(530,510,740,650), 0, video::SColor(255,255,255,255),true);
}
}
//Alle Elemente durchgehen und prüfen ob diese in dem sichtbaren bereich sind
for (int i=0; i<max_elements; i++)
{
if(allElements[i].element == 1) //Baum einzelnd
driver->draw2DImage(Trees, core::position2d<s32>(allElements[i].start_x - akt_x,allElements[i].start_y - akt_y),core::rect<s32>(15,0,125,125), 0, video::SColor(255,255,255,255),true);
if(allElements[i].element == 2) //Wall top
driver->draw2DImage(wall, core::position2d<s32>(allElements[i].start_x - akt_x,allElements[i].start_y - akt_y),core::rect<s32>(0,0,760,130), 0, video::SColor(255,255,255,255),true);
if(allElements[i].element == 3) //Wall right
driver->draw2DImage(wall, core::position2d<s32>(allElements[i].start_x - akt_x,allElements[i].start_y - akt_y),core::rect<s32>(0,250,130,1010), 0, video::SColor(255,255,255,255),true);
if(allElements[i].element == 4) //square hills vertical
{
driver->draw2DImage(hills, core::position2d<s32>(allElements[i].start_x - akt_x,allElements[i].start_y - akt_y),core::rect<s32>(960,450,1024,590), 0, video::SColor(255,255,255,255),true);
driver->draw2DImage(hills, core::position2d<s32>(allElements[i].start_x - akt_x,allElements[i].start_y - akt_y + 135),core::rect<s32>(960,450,1024,590), 0, video::SColor(255,255,255,255),true);
driver->draw2DImage(hills, core::position2d<s32>(allElements[i].start_x - akt_x,allElements[i].start_y - akt_y + 275),core::rect<s32>(960,450,1024,590), 0, video::SColor(255,255,255,255),true);
}
}
} //end drawMap
Als erstes wird einfach auf dem ganzen sichtbaren Hintergrund etwas wiese gemalt (in form einer grastextur).
Alle Elemente die mehr oder weniger dynamisch gezeichnet werden werden in einem array gespeichert mit einer ID (aktuell gibt es nur 4 verschiedene elemente).
Wie viele maximal in einer Instanz existieren dürfen lege ich beim initialiseren der klasse fest.
Diese werden einfach alle durchgelaufen und gezeichnet.
(ist das element "0" wird halt dann einfach gar nichts gemacht).
Bin mir nicht sicher ob diese Lösung so gut ist...
...was hier noch fehlt ist die Abfrage ob das element überhaupt in dem sichtbaren kartenausschnitt liegen.
müsste aber nur die abfrage erweitert werden, ist auch nicht so das Problem.
Sprich abgesehen von den zwei Punkten:
*karte nur zeichnen beim scrollen
*nur elemente zeichnen die auf dem kartenabschnitt sind
Was ist noch alles scheiße hier?
Kann man die Benutzereingaben sinnvoll auslagern lassen?
Ich mein die müssen ja eh eig. durchgehend überprüft werden oder habe ich da einen denkfehler?
edit: dateinamen werde ich bearbeiten, wenn du sagst png's sind besser dafür auch die bmp's mal in png's umwandeln
edit2: Okay die erste Idee von mir war nicht durchdacht xD
Wenn ich die nicht neu zeichnen lasse werden die alten ja deswegen noch lange nicht beibehalten...xD
Also muss ich die doch in der Theorie in jedem schleifendruchgang neu zeichnen lassen, oder? oO