Schleife/ Loop action - Wie löse ich dieses Problem ?

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

  • Schleife/ Loop action - Wie löse ich dieses Problem ?

    Hallo,


    wie kann ich diese action in eine Schleife einbinden? Diese Aktion soll laufen, bis etwas best immtes geschieht.


    Quellcode

    1. - (IBAction)START:(id)sender {
    2. CGRect frame = _CollisionObject.frame;
    3. frame.origin.x = 234;
    4. frame.origin.y = 194;
    5. [UIView beginAnimations:nil context:nil];
    6. [UIView setAnimationBeginsFromCurrentState:0.5];
    7. _CollisionObject.frame = frame;
    8. [UIView commitAnimations];
    9. if (_CollisionObject.center.x >233) {
    10. CGRect frame = _CollisionObject.frame;
    11. frame.origin.x = 36;
    12. frame.origin.y = 194;
    13. [UIView beginAnimations:nil context:nil];
    14. [UIView setAnimationBeginsFromCurrentState:0.5];
    15. _CollisionObject.frame = frame;
    16. [UIView commitAnimations];
    17. }
    Alles anzeigen






    Eine weitere Frage: ich habe die duration also die Dauer des Vorgangs
    auf 0.5s gestellt, wenn ich diesen Wert erhöhen will, geschieht nichts,
    die Dauer bleibt immer gleich, egal wie ich verändere.


    Danke schonmal für die Antworten.
  • OPilot schrieb:

    wie kann ich diese action in eine Schleife einbinden? Diese Aktion soll laufen, bis etwas best immtes geschieht.

    Quellcode

    1. <for oder while Schleife> {
    2. [<Instanz die die Action START: implementiert hat> START:self];
    3. }

    Anmerkung: der Methodenname START: entspricht nicht den Namenskonventionen.

    OPilot schrieb:

    Eine weitere Frage: ich habe die duration also die Dauer des Vorgangs
    auf 0.5s gestellt

    Nein, hast du nicht. Jedenfalls nicht mit dem hier gezeigtem Code.

    OPilot schrieb:

    Wenn ich diesen Wert erhöhen will, geschieht nichts,
    die Dauer bleibt immer gleich, egal wie ich verändere.

    Die Dauer einer Animation stellt man mit setAnimationDuration: ein.
  • Das sieht ziemlich skurril aus. Vielleicht erzählst du mal was du wirklich machen möchtest?

    Zunächst würde ich ein if / else benutzen, da du ja anscheinend immer nur eine der beiden Aktionen ausführen möchtest, oder?
    Wenn du den Code in einer Schleife haben möchtest, warum tust du es nicht?

    do {
    // dein Code
    } while (_CollisionObject.center.x >233)

    könnte sinnvoll sein.
  • Danke. Ja, also das mit dem Loop klappt immer noch nicht ganz.
    Meine Idee: Ich möchte, dass wenn ich auf den Button Start klicke, ein Object nach Rechts bewegt wird, wenn es die bestimmten Koordinaten erreicht hat, soll es wieder umkehren, das tut es auch schon. Jetzt möchte ich, dass wenn das Object wieder Links ist, das es wieder nach Rechts bewegt wird usw..
    Ich möchte, dass dieses Object mit der Zeit schneller wird. Außerdem, wenn dieses Object mit einem anderen zusammenstößt, soll eine Meldung kommen, welche man mit OK bestätigen kann um von vorne anzufangen.

    Mein jetziger Code:




    Quellcode

    1. - (IBAction)START:(id)sender {
    2. do {
    3. CGRect frame = _CollisionObject.frame;
    4. frame.origin.x = 234;
    5. frame.origin.y = 194;
    6. [UIView beginAnimations:nil context:nil];
    7. [UIView setAnimationDuration:3.0];
    8. _CollisionObject.frame = frame;
    9. [UIView commitAnimations];
    10. if (_CollisionObject.center.x >233) {
    11. CGRect frame = _CollisionObject.frame;
    12. frame.origin.x = 36;
    13. frame.origin.y = 194;
    14. [UIView beginAnimations:nil context:nil];
    15. [UIView setAnimationDuration:3.0];
    16. _CollisionObject.frame = frame;
    17. [UIView commitAnimations];
    18. }
    19. else
    20. {
    21. CGRect frame = _CollisionObject.frame;
    22. frame.origin.x = 234;
    23. frame.origin.y = 194;
    24. [UIView beginAnimations:nil context:nil];
    25. [UIView setAnimationDuration:3.0];
    26. _CollisionObject.frame = frame;
    27. [UIView commitAnimations];
    28. }
    29. } while (_CollisionObject.center.x >1000);
    Alles anzeigen




    Habt ihr Lösungsansätze ? Ich bin auf dem Gebiet noch nicht so weit, möchte es daher lernen. Vielen Dank für eure ausführlichen Antworten.
  • Was du suchst ist eine update Methode, die per NSTimer zyklisch aufgerufen wird. Hier ein wenig Pseudycode um dich in die richtige Richtung zu schubsen:

    Quellcode

    1. -(void) update{
    2. if (buttonIsPressed){
    3. if (currentDirection == nachRechts && _CollisionObject.center.x >233){
    4. // bewege dein Objekt nach links und verändere die Variable currentDirection
    5. }else if (currentDirection == nachLinks && _CollisionObject.center.x < 33) {
    6. // bewege dein Objekt nach rechts und verändere die Variable currentDirection
    7. }
    8. }
    9. }


    In der START Methode musst du dann nur noch buttonIsPressed auf YES setzen.
  • @ioscampus - Danke, ich wüsste aber ehrlich gesagt noch nicht, wie ich das Ganze einbinden kann, was ich beachten muss, ich bin leider noch nicht so weit..

    Also den Quelltext den du gepostet hast, den verwende ich, um das Object mithilfe einer Variable(nachRechts,nachLinks) bei Knopfdruck zu bewegen ?
    Ist das schon eine Schleife ? Ich brauche nämlich eine Austrittsbedingung, und zwar dafür, dass wenn mein Object mit einem anderen Kollidiert, eine PopUp Meldung erscheinen soll, und die Zeit( Timer) angezeigt werden soll.. Ich weiß leider nicht, wie ich dieses vermutlich für euch einfache Problem lösen soll, mir scheint das schon recht komplex.



    Quellcode

    1. - (IBAction)START:(id)sender {
    2. do {
    3. CGRect frame = _CollisionObject.frame;
    4. frame.origin.x = 234;
    5. frame.origin.y = 194; //" "
    6. [UIView beginAnimations:nil context:nil];
    7. [UIView setAnimationDuration:3.0];
    8. _CollisionObject.frame = frame;
    9. [UIView commitAnimations];
    10. if (_CollisionObject.center.x >233) {
    11. CGRect frame = _CollisionObject.frame;
    12. frame.origin.x = 36;
    13. frame.origin.y = 194;
    14. [UIView beginAnimations:nil context:nil];
    15. [UIView setAnimationDuration:3.0];
    16. _CollisionObject.frame = frame;
    17. [UIView commitAnimations];
    18. }else if(_CollisionObject.center.x >= 36){
    19. CGRect frame = _CollisionObject.frame;
    20. frame.origin.x = 234; //
    21. frame.origin.y = 194; //" "
    22. [UIView beginAnimations:nil context:nil];
    23. [UIView setAnimationDuration:3.0]; //
    24. _CollisionObject.frame = frame;
    25. [UIView commitAnimations];
    26. }
    27. } while (_CollisionObject.center.x >1000);
    Alles anzeigen






    Das ist ein Teil meines momentan vorhandenen Codes, es wäre sehr nett wenn mir da jemand behilflich sein würde.
  • was du benötigst ist ein wenig mehr wissen in konzepten...

    du solltest dir vllt vor dem sourcecode mal ein wenig theorie anschauen.

    was du benötigst ist eine sehr einfache state machine.

    du schreibst dir eine klasse die permanent ihren zustand auswertet und diesen anzeigt. diese speichert auch ihre zustände bzw den ihrer objekte.

    mit den actions und events veränderst du dann nur noch diese zustände.

    du hast dann einen "gameloop"
    also deine 'schleife' die wird gern automatisch getriggert zb durch einen timer welcher beim start initialisiert wird.

    die klasse muss dann entsprechende propertys besitzen um ihren zustand zu speichern und zu kontrollieren.

    in deinen action methoden oder events wie zb deiner kollisionsprüfung etc werden dann nur noch diese propertys verändert.

    hilfreich das ganze zu verstehen könnte zb sein sich den kontrollfluss mal mit stifft und papier komplett ohne sourcecode aufzumalen.

    ansonsten schau auch mal in die appledoku zu den konzepten und themen wie runloop, events, timer und propertys

    sicherlich ist spriteKit für deine aufgabe eine gute lösung allerdings nützt dir das auch wenig wenn es an grundsatzwissen scheitert...
    snafu
    :() { :|: &};:
    sometimes i dream in hex
    Obey gravity! Because its a law!