Einführung von NSTimer

Hallo Zusammen,

in unserem vorhergehenden Tutorial  haben wir einen kleinen Soldaten auf dem iPhone zum bewegen gebracht. Allerdings kann dieser sich von einem Ort zum anderen teleportieren – wir wollen jedoch das er über den Bildschirm wandert. Die werden wir durch einen NSTimer erreichen. NSTimer ist eine von Apple vorgefertigte Klasse zum erzeugen von Timern (also Zeitschaltuhren auf deutsch??). Grob eingeteilt gibt es Timer die eine Methode nach einer definierten Zeit immer wieder aufrufen und Timer die dies nur einmal tun. Für unseren Zweck erstellen wir direkt am Ende unserer viewDidLoad Methode aus dem vorhergehenden Tutorial einen sich wiederholenden Timer.

[NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(updateGame) userInfo:nil repeats:YES];

Zunächst legen wir den Intervall auf 0.05 Sekunden fest. Anschließend definieren wir die Methode die aufgerufen werden soll (updateGame) und wo diese Methode gefunden werden kann (self – also die aktuelle Klasse). Da wir keinen Parameter übergeben wollen, bleibt userInfo leer. Zum Schluss sagen wir noch, dass der Timer sich wiederholen soll.

Vielleicht ist dem einen oder anderen aufgefallen, dass ich keinen Link zum Timer definiert habe. Das kann man machen und würde dann so aussehen:

NSTimer *meinTimer = [NSTimer scheduledTimerWithTimeInterval:0.05 target:self selector:@selector(updateGame) userInfo:nil repeats:YES];

Wir brauchen es hier nicht, da der Timer nie gestoppt werden soll.

Was fehlt jetzt? Klar, wir müssen die Methode updateGame noch programmieren. Aber irgendwie haben wir uns noch keine Gedanken gemacht, was in der Methode passieren soll. Holen wir das nun nach. Wir sollten in touchesBegan nicht mehr die Position unseres kleinen Soldaten direkt verändern. Es ist viel geschickter statt dessen ein Ziel festzulegen. In unserer updateGame Methode bewegen wir den Soldaten dann auf das definierte Ziel zu.

Fangen wir mit der Zielposition an. Wir müssen sie zunächst im Header ViewController.h definieren.

CGPoint    zielPosition;

Bitte beachtet dass hier kein * vor zielPosition stehen darf. Ein * ist wie bereits erläutert ein Link zu einem Objekt. CGPoint ist jedoch kein Objekt sondern eine Struktur aus der Programmiersprache C. Das klingt zunächst etwas verwirrend – ist es auch, aber irgendwann hat man es drin.

Wir gehen nun in zu touchesBegan und ändern es wie folgt. TouchesMoved kann so bleiben wie es ist.

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
	UITouch *touch = [[event allTouches] anyObject];
	zielPosition = [touch locationInView:touch.view];
}

Jetzt können wir endlich unsere updateDurchTimer Methode erstellen.

-(void) updateGame{
    int xDirection;
    int yDirection;

    if (soldierView.center.x > targetPosition.x){

        //Bewegung nach links
        xDirection = -5;        
    }else {

        //Bewegung nach rechts
        xDirection = 5;
    }

    if (soldierView.center.y > targetPosition.y){

        //Bewegung nach unten
        yDirection = -5;
    }else {

        //Bewegung nach oben
        yDirection = 5;
    }

    soldierView.center = CGPointMake(soldierView.center.x + xDirection, soldierView.center.y+yDirection);

}

Als erstes definieren wir uns zwei Hilfsvariabeln vom Typ int. Der Datentyp int steht für Integer und ist einfach eine positive oder negative ganze Zahl. Auch int ist wieder ein C Datentyp und kein Objekt, deshalb darf wieder kein * bei der Deklarierung genutzt werden.
Anschließend vergleichen wir mit Hilfe einer if-Bedingung die aktuelle Position des kleinen Soldaten und unsere Zielposition. Wenn unser Soldat links von der Zielposition ist müssen wir zu seiner x Koordinate was dazu geben (Bewegung nach rechts).
Das gleiche machen wir mit der y-Koordinate. Zum Schluss verändern wir die Position der soldierView um die errechneten Werte.

Zeit um einen Versuch zu wagen…

… schon besser aber noch nicht richtig gut. Der kleine Soldat „tanzt“ nun um die Zielposition herum, sobald er sie erreicht hat. Das ist natürlich auch klar, denn wir verändern seine Position immer um 5 Pixel auch wenn er nur noch 2 Pixel von der Zielposition entfernt ist. Daher optimieren wir noch ein bisschen:

    
    if (soldierView.center.x > targetPosition.x){

        //Bewegung nach links
        xDirection = targetPosition.x - soldierView.center.x;
        if (xDirection < -5) {
            xDirection = -5;
        }

    }else {

        //Bewegung nach rechts
        xDirection = targetPosition.x - soldierView.center.x;
        if (xDirection > 5) {
            xDirection = 5;
        }
    }

    if (soldierView.center.y > targetPosition.y){

        //Bewegung nach unten
        yDirection = targetPosition.y - soldierView.center.y;
        if (yDirection < -5) {
            yDirection = -5;
        }
    }else {

        //Bewegung nach oben
        yDirection = targetPosition.y - soldierView.center.y;
        if (yDirection > 5) {
            yDirection = 5;
        }

    }

Jetzt ist alles geschmeidig. Übrigens kommentiert man eine Zeile durch // aus. Dadurch kann man in den Quelltext schreiben, was man gerade macht. Ich nutze es in meinen Programmen sehr häufig und würde es auch euch empfehlen!

Bis zum nächsten Artikel.
Alle Gute.

Oder gleich beim nächsten Teil weitermachen.

1 thought on “Einführung von NSTimer

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.