Exemplo n.º 1
0
bool Character::update(float elapsed)
{
	float distance = speed * elapsed;

	//Distanz zum nächsten Feld berechnen
	CL_Point nextField = getNextField(moveDirection);
	CL_Pointf nextFieldCoordinates = getCoordinates(nextField);
	float distanceToField = abs(position.x - nextFieldCoordinates.x) + abs(position.y - nextFieldCoordinates.y);

	//Ist die zurückzulegende Distanz größer als die Distanz zum nächsten Feldmittelpunkt
	//und ist das Feld frei, so muss eine eventuelle Richtungsänderung geprüft werden
	while (distance > distanceToField && world->getLevel()->isFreeField(nextField))
	{
		//Zum Feldmittelpunkt bewegen
		move(distanceToField);

		distance -= distanceToField;

		currentField = getIndices(nextFieldCoordinates);

		//wird für erbende Klassen aufgerufen, um Aktionen auf dem Feldmittelpunkt ausführen zu können
		onFieldCenter();

		//Ist eine Richtungsänderung möglich, dann Richtung ändern
		if(world->getLevel()->isFreeField(getNextField(newDirection)))
			moveDirection = newDirection;

		//Distanz zum nächsten Feld berechnen
		nextField = getNextField(moveDirection);
		nextFieldCoordinates = getCoordinates(nextField);
		distanceToField = abs(position.x - nextFieldCoordinates.x) + abs(position.y - nextFieldCoordinates.y);
	}

	//Spielfigur weiterbewegen bzw. Richtung ändern
	if(world->getLevel()->isFreeField(nextField))
		move(distance);
	else if(world->getLevel()->isFreeField(getNextField(newDirection)))
		moveDirection = newDirection;

	animationPos += elapsed * animationSpeed;

	while (animationPos >= animationLength)
		animationPos -= animationLength;

	body.set_frame(getAnimationPos());

	return true;
}
Exemplo n.º 2
0
bool Character::update(float elapsed)
{
	// zurückzulegende Distanz berechnen
	float distance = speed * elapsed;

	// aktuelle Animationsposition berechnen und setzen
	animationPos += elapsed * animationSpeed;

	while (animationPos >= animationLength)
		animationPos -= animationLength;

	body.set_frame(getAnimationPos());

	const Level& level = world->getLevel();

	// nächstes Feld in Bewegungsrichtung abrufen
	CL_Point nextField = getNextField(moveDirection);

	// wenn Richtung geändert werden soll und nächste Feld nicht frei ist
	if (moveDirection != newDirection && !level.isFreeField(nextField))
	{
		// Richtung ändern
		moveDirection = newDirection;

		// nächstes Feld in neuer Richtung abrufen
		nextField = getNextField(moveDirection);
	}

	CL_Pointf coordinates = level.getCoordinates(nextField);

	// Distanz zum Mittelpunkt des nächsten Feldes berechnen
	float distanceToField = abs(position.x - coordinates.x) + abs(position.y - coordinates.y);

	// solange nächstes Feld frei und zurückzulegende Distanz größer als Distanz zum Mittelpunkt
	while (level.isFreeField(nextField) && distance > distanceToField)
	{
		// zum Mittelpunkt des nächsten Feldes gehen
		move(distanceToField);

		// aktuelles Feld ändern
		currentField = nextField;

		// Benachrichtigung für Subklassen (zur Pfadfindung)
		arrivedAtField();

		// zurückzulegende Distanz verringern
		distance -= distanceToField;

		// wenn nächstes Feld in gewünschter Richtung
		if (level.isFreeField(getNextField(newDirection)))
			// zur gewünschten Richtung
			moveDirection = newDirection;

		// nächstes Feld abrufen
		nextField = getNextField(moveDirection);

		// Distanz zum nächsten Feld berechnen
		coordinates = level.getCoordinates(nextField);		
		distanceToField = abs(position.x - coordinates.x) + abs(position.y - coordinates.y);
	}

	// wenn nächstes Feld frei
	if (level.isFreeField(nextField))
		// Restdistanz in Bewegungsrichtung zurücklegen
		move(distance);

	return true;
}