wie am besten source clipping werte berechnen?


psyco001

Member
Joined
Nov 12, 2007
Messages
260
Hallo leute,

Ich schreib hier nun schon eine weile an einem framework welches mir ein bischen arbeit abnimmt, jedoch harpert es gerade dabei wie ich am besten die clipping koordinaten für eine einzelne kachel am besten performant berechne.

aktuell ist es so das ich eine funktion habe in der alle clipping koordinaten drin stehen und ein struct mit den entsprechenden werten zurück gebe und zwar wie folgt:
Code:
void CEngineMapLayer::getSourceTilePos(SDL_Rect *p_rect, int actTile)
{
	p_rect->w = 16; //TODO: change to dynamic
	p_rect->h = 16; //TODO: change to dynamic
	switch(this->m_Layer[actTile])
    {

	//row1
    case 'a':
        p_rect->x = 0 * 16;
        p_rect->y = 0 * 16;
    break;
    case 'b':
        p_rect->x = 1 * 16;
        p_rect->y = 0 * 16;
    break;
    case 'c':
        p_rect->x = 2 * 16;
        p_rect->y = 0 * 16;
    break;
    case 'd':
        p_rect->x = 3 * 16;
        p_rect->y = 0 * 16;
    break;
...
...
...
	case 'á':
        p_rect->x = 13 * 16;
        p_rect->y = 6 * 16;
    break;
	case 'ó':
        p_rect->x = 14 * 16;
        p_rect->y = 6 * 16;
    break;

    }
}
actTile ist das aktuelle tile welches aus dem source image geclippt und gerendert werden soll.

vorher (wie hier zu sehen) habe ich eine feste anzahl an tiles gehabt die durch die möglichen eingebbaren zeichen auf der tastatur festgelegt waren. Diese wurden in einem char array gespeichert,
jedoch habe ich nun so umgestellt, das ich nun ein UInt16 array benutze.

eine switch anweisung von vorne bis hinten nun mit werten befüllen ist ja übertrieben, aber wie sollte ich es am besten performant machen damit das framework auch für gp2x anwendungen nutzbar bleibt?

eine überlegung wäre den UInt16 in 2x UInt 8 per bitoperatoren aufzuteilen und dann damit dynamisch die koordinaten berechnen. das wäre so erstmal meine überlegung.

hätte dazu vllt. noch jemand nen paar tips oder hinweise?
würde mich drüber freuen
gruss psy

p.s. die 16 soll noch gegen einen dynamisch festlegbaren wert ausgetauscht werden so das die tilles grösser oder kleiner sein können.
 
Guten Abend ;)
Ich weiß jetzt nicht ob ich alles richtig verstanden habe. Du hast eine unbestimmte Anzahl von Tiles die du speichern willst? Und dann je nach Bedarf auslesen möchtest?

Wenn dem so ist, dann benutze doch einfach eine Liste, auch List oder LinkedList genannt ;) Ich hoffe ich konnte helfen. Bin aber zur Zeit auch was Müde und selber am programmieren und eventuell dadurch was verwirrt. Hehe
 
naja, ich war auch schon sehr müde.
das Problem hab ich jetzt gelöst.

ich hab so wie ich es mir selbst bereits überlegt hatte den 16 bit integer in zwei 8 bit integer zerteilt.
Der hintergrund bestand darin das ich für die reihen und spalten der tiles welche alle innerhalb einer grafik gespeichert sind die x und y koordinate zum blitten brauchte, damit ich auch das entsprechende tile aus der grafik bekomme.

nun benutze ich den einen 8bit int für die berechnung in der x und den anderren für die y achse.
nun ist es keine etzend lange switch anweisung mehr sondern eine sehr einfache kurze funktion.
Code:
void CEngineMapLayer::getSourceTilePos(SDL_Rect *p_rect, int actTile)
{
	p_rect->w = 16; //TODO: change to dynamic
	p_rect->h = 16; //TODO: change to dynamic

	//splitting the actTile  Uint 16 into two Uint8 parts
	Uint8 b1 = 0;	//Y
	Uint8 b2 = 0;	//X
	b1 = this->m_Layer[actTile] >> 8;	//setting Y axis
	b2 = (Uint8)this->m_Layer[actTile];	//setting X axis

	p_rect->x = b2 * 16;
	p_rect->y = b1 * 16;
}
 
Back
Top