touchesMoved

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • touchesMoved

    Hallo zusammen,




    ich bin hier gerade fast am verzweifeln und hoffe ihr könnt mir helfen. Ich arbeite gerade an einem Spiel für das iPad, welches einem ganz normalen Puzzle ähnlich ist. Es gibt mehrere Teile, die sich drehen und verschieben lassen und an bestimmten Orten bzw. bestimmten Drehwinkeln "einrasten" sollen. Das Verschieben und rotieren sowie das anschließende Einrasten funktioniert eigentlich ganz gut, nur funktioniert das nicht zusammen. Wenn ich ein Objekt drehe, wird es bei anschließender Verschiebung wieder in den Ursprungszustand zurück gesetzt und umgekehrt. Kennt jemand von euch ein Beispielprojekt oder ein paar Codeschnipsel, mit denen man ein Objekt verschieben UND drehen kann?




    Vielen Dank und viele Grüße
  • Hackmac79 schrieb:

    Wenn ich ein Objekt drehe, wird es bei anschließender Verschiebung wieder in den Ursprungszustand zurück gesetzt und umgekehrt.

    Das bedeutet, dass Du die Transformationsmatrix wieder zurücksetzt. Du solltest darauf achten, für weitere Drehungen immer die Werte zu verknüpfen:

    Quellcode

    1. theView.transform = CGAffineTransformRotate(theView.transform, theAngle);

    Hier solltest Du in der Regel nicht CGAffineTransformMakeRotation verwenden.
    „Meine Komplikation hatte eine Komplikation.“
  • Danke für eure Antworten.


    So einfach ist das aber leider gar nicht. Das Beispiel hinter dem Link werde ich mir gleich mal ansehen, die anderen beiden Methode hatte ich allerdings schon mal probiert. Das Problem ist aber, das eine Rotation dann relativ zum Objekt durchgeführt wird und eine darauf folgende Translation dann eben auch relativ zum Objekt durchgeführt wird. Wenn ich also ein Objekt um 90° drehe und dann nach mit dem Finger nach rechts verschiebe, bewegt sich das Objekt nach unten. Also aus Sicht des Objektes nach rechts und aus meiner Sicht nach unten.

    Wenn ich es wie folgt mache:

    Quellcode

    1. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    2. {
    3. UITouch *touch = [touches anyObject];
    4. if ([[touch view] isKindOfClass:[Plate class]]) {
    5. if ([touch tapCount] == 2) {
    6. startTouchPosition = [touch locationInView:self.view];
    7. }
    8. }
    9. }
    10. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    11. {
    12. UITouch *touch = [touches anyObject];
    13. if ([[touch view] isKindOfClass:[Plate class]]) {
    14. Plate *plate = (Plate*)[touch view];
    15. CGFloat angle;
    16. if ([touch tapCount] == 2) {
    17. CGPoint location = [touch locationInView:self.view];
    18. plate.transform = CGAffineTransformTranslate(plate.transform, location.x - startTouchPosition.x, location.y -startTouchPosition.y);
    19. }
    20. else
    21. {
    22. float dx = [touch locationInView:self.view].x - plate.center.x;
    23. float dy = [touch locationInView:self.view].y - plate.center.y;
    24. angle = atan2f(dy, dx);
    25. plate.transform = CGAffineTransformRotate(plate.transform, angle);
    26. }
    27. }
    28. }
    Alles anzeigen

    ... dann werden die Gesten "Hyperaktiv". Also das Objekt dreht und bewegt sich viel zu schnell. Wenn ich aber CGAffineTransformMakeTranslate oder ...MakeRotate benutze, ist die Geschwindigkeit richtig. Einen Mathematischen Fehler kann ich dann ja eigentlich ausschließen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Hackmac79 ()

  • Wenn die Verschiebung relativ zum Objekt durchgeführt wird, sollte ich auch den Touch relativ zum Objekt benutzen. So funktioniert es:

    Quellcode

    1. - (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
    2. {
    3. UITouch *touch = [touches anyObject];
    4. if ([[touch view] isKindOfClass:[Plate class]]) {
    5. if ([touch tapCount] == 2) {
    6. startTouchPosition = [touch locationInView:[touch view]];
    7. }
    8. }
    9. }
    10. - (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
    11. {
    12. UITouch *touch = [touches anyObject];
    13. if ([[touch view] isKindOfClass:[Plate class]]) {
    14. Plate *plate = (Plate*)[touch view];
    15. CGFloat angle;
    16. if ([touch tapCount] == 2) {
    17. CGPoint location = [touch locationInView:plate];
    18. plate.transform = CGAffineTransformTranslate(plate.transform, location.x - plate.frame.size.width*0.5, location.y - plate.frame.size.height*0.5);
    19. }
    20. else
    21. {
    22. CGPoint location = [touch locationInView:plate];
    23. float dx = startTouchPosition.x - location.x;
    24. float dy = startTouchPosition.y - location.y;
    25. angle = atan2f(dy, dx);
    26. plate.transform = CGAffineTransformRotate(plate.transform, angle);
    27. }
    28. }
    29. }
    Alles anzeigen


    So richtig cool wäre es jetzt, wenn das Objekt nicht sofort in Richtung meines Fingers rotiert wenn ich es berühre, sondern erst rotiert wenn ich den Finger bewege. Also um DeltaAngle. Ich dachte das hätte ich dadurch erledigt, dass ich die vorherige Transformation mit übergeben habe. Dafür bin ich jetzt aber zu [Blockierte Grafik: http://www.osxentwicklerforum.de/wcf/images/smilies/sleeping.png]. Gute Nacht!