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; }
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; }