Skip to content
BiceMaster edited this page Feb 26, 2013 · 24 revisions

Assemblage används för att läsa in Entityspecifikationer (Recept) från fil. I denna fil specifierar du ett namn på entitettypen/receptet, vilka komponenter den färdiga entiteten skall ha (Ingridienser) samt initieringsvärden för dessa. För närvarande finns det bara stöd för ett recept per fil. Detta är ett medvetet val för att minska mergekonflikter. Du måste alltså skapa en ny assemblagefil för varje nytt recept.

Notera: Recept som saknar ingridienser läses inte in. Recept som har felaktiga ingridienser läses inte in.

För att en ingrediens ska fungera måste komponenten den beskriver veta om sitt TypeIdx samt ha mappat sig mot ComponentFactory. Ska ingridiensen ta emot initieringsvariabler måste metoden init() vara överlagrad i varje komponent.

###Filformat ######Kommentarer Kommentarer skrivs på egen rad där varje rad prefixas med antingen #,,/. Med dessa kan man alltså kommentera i formen #, / * */ och //. ######Entitetsspecifikation För att ange en Entitetsspecifikation(recept) ange 'e' följt av namn. Bara det första receptet läses in. ######Komponenter För att ange en komponent ange 'c' följt av komponentens namn. ######Initieringsdata för komponenter För att ange initialieringsdata för en komponent ange d (för data), följt av datatyp, variabelnamn samt värde. Detta måste vara i direkt anslutning till komponentdeklarationen. Du kan alltså itne speca flera komponenter och ange initieringsdata sist då assembalge inte fattar till vilken komponent en viss data då tillhör.

Datatyper
Datatyp Shorthand Fullt namn
Flyttal f float
Dubbel precision d double
Bool b bool
Byte / tecken c char
Heltal i int
Positiva heltal u unsigned
Sträng s string
Vector 2 n/a vec2
Vector 3 n/a vec3
Vector 4 n/a vec4

Sammansatt

	# Comment
	// Comment

	/*
	 * Comment
	 */

	e <EntityName>

	c <ComponentName>

	d f <floatVariable> <value>
	d float <floatVariable2> <value>
	d d <doubleVariable> <value>
	d double <doubleVariable2> <value>
	d b <boolVariable> <value>
	d bool <boolVariable2> <value>
	d c <charVariable> <value>
	d char <charVariable2> <value>
	d s <stringVariable> <value>
	d string <stringVariable2> <value>
	d i <intVariable> <value>
	d int <intVariable2> <value>
	d u <unsignedIntVariable> <value>
	d unsigned <unsignedIntVariable2> <value>

	c nextComponentname

Exempel på implementation

	e ScoreHudElement
	
	c HudElement
	d string m_value "assemblage fungerar!"
	d s m_element "scoreText"

Förbereda en komponent för att läsas in

Lägg in denna raden i h-filen: static ComponentRegister<_KOMPONENTNAMN_> s_reg; och denna i cpp: ComponentRegister<_KOMPONENTNAMN_> _KOMPONENTNAMN_::s_reg("_KOMPONENTNAMN_");

Till sist så måste komponenten läggas till i konstruktorn för ComponentAssemblageAllocator ifall den endast kommer skapas med assemblage. Detta för att tvinga länkaren att ladda symbolen för komponenten när endast skapning via assemblagefil görs. Använd templatefunktionen handle<_KOMPONENTNAMN_>(); för att registrera komponenten.

Ersätt _KOMPONENTNAMN_ med klassnamnet.

Läsa in initieringsvariabler

För att göra detta måste du överlagra init() från basklassen Component. Det är här du specifierar vilka variabler du vill ta emot.

Notera: Ingen typkonvertering eller kontroll av typ görs utan att alla data "castas" blint.

oepratorn >> är överlagrad för strängar samt basala datatyper. Du kan även läsa data mha getDataAsBasicDataType(), getDataAsVec2(), getDataAsVec3(), getDataAsVec4() och getDataAsString(). Vektorer måste läsas mha av deras hjälpmetoder.

Exempel på hur en init() kan se ut:

	void Transform::init( vector<ComponentData> p_initData )
	{
		for( unsigned int i=0; i<p_initData.size(); i++ )
		{
			if( p_initData[i].dataName == "m_translation" )
				p_initData[i].getDataAsVec3( m_trans.x, m_trans.y, m_trans.z );
			else if( p_initData[i].dataName == "m_name" )
				p_initData[i]>>m_name;
			else if( p_initData[i].dataName == "m_type"
				p_initData[i].getDataAsBasicDataType<int>( &m_type );
		}
	}

Exempel på assemblagefil:

	e SpecialMonkey
	
	c LoadMesh
	d string m_filename "InstanceApes.agl"
	
	c Transform
	d vec3 m_translation 0.0, -30.0, 0.0
	
	c PhysicsBody
	 
	c BodyInitData
	d float m_position 0.0, -30.0, 0.0
	d int m_collisionEnabled 1
	d int m_impulseEnabled 1
	d int m_compound 0
	d int m_static 1