Microsoft Research TouchStudio Microsoft Research TouchStudio - Seite 7
Seite 7 von 8 ErsteErste ... 67 ... LetzteLetzte
Ergebnis 121 bis 140 von 148
  1. @AEG
    Endlich ist eine ansprechende GUI im TouchStudio möglich!

    Wie in dem Beispiel "PicBrowser" von moroli dargestellt, können wir jetzt unsere eigene GUI erstellen.
    In seinem Beispiel ein "touch-sensitiver" Bereich (=> Button) zum Abfragen möglicher Infos zur Geo-Koordinate und ein "wisch-sensitiver" Bereich zum vor-/zurückblättern in den Ergebnissen.

    ...und wie wird es erst mit Mango werden... schwärm!

    Gruß Jörg
    1
     

  2. Mit der neuen Version beta 1.2 sind zahlreiche Neuerungen zum "TouchStudio" hinzugefügt worden sowie einige Befehle geändert worden.

    ACHTUNG:
    Damit laufen die Beispielscripte in den vorangegangenen Posts bis einschließlich Post #100 nur noch bedingt resp. müssen evtl. angepasst werden.

    Ab den Posts #117 ("TwoPics") und #118 ("PicBrowser") von moroli sind die aufgeführten Scripte für die neue Version erstellt.

    Infos zur neuen Version beta 1.2:
    1.) Release notes v1.2.0.1 beta (englisch)
    2.) Announcing TouchStudio v1.2 beta (english)
    3.) Facebook "TouchStudioApp"

    Gruß Jörg
    1
     

  3. Aus "TwoPics" und "PicBrowser" mach Action "TwoPics Blending" ...

    Es werden zwei Bilder gemacht und danach kann man mittels des "Boards" (auf dem die entsprechende Prozentzahl angezeigt wird) durch links- und rechts-wischen die Prozentzahl beim Überblenden anpassen. Nach einem "Tap" wird gefragt, ob das Ergebnis (Bild) gespeichert werden soll.

    Code:
    action TwoPics_Blending() : Nothing {
      b := media->create_board(140);
      b->set_background(colors->accent);
      s := b->create_text(480, 140, 90, '50 %');
      s->set_pos(230, 70);
      b->post_to_wall;
      pic1 := senses->take_camera_picture;
      pic2 := senses->take_camera_picture;
      pic3 := pic1->clone;
      pic3->blend(pic2, 0, 0, 0, .5);
      pic3->post_to_wall;
      i := 50;
      h := true;
      fertig := false;
      while not fertig do {
        if b->touched then {
          while b->touched do {
            h := false;
          }
        }
        if not h then {
          if b->touch_velocity->x = 0 and b->touch_velocity->y = 0 then {
            h := true;
            if wall->ask_boolean('Soll das Bild gespeichert werden ?', '') then {
              pic3->save_to_library;
            }
            fertig := true;
          }
          if b->touch_velocity->x < 0 then {
            h := true;
            if i < 100 then {
              i := i + 10;
            }
            s->set_text(i || ' %');
            b->update_on_wall;
            pic3->blend(pic1, 0, 0, 0, 1);
            pic3->blend(pic2, 0, 0, 0, i / 100);
            pic3->update_on_wall;
          }
          if b->touch_velocity->x > 0 then {
            h := true;
            if i > 0 then {
              i := i - 10;
            }
            s->set_text(i || ' %');
            b->update_on_wall;
            pic3->blend(pic1, 0, 0, 0, 1);
            pic3->blend(pic2, 0, 0, 0, i / 100);
            pic3->update_on_wall;
          }
        }
      }
    }
    2
     

  4. @Jrahe: Irwie blick ich bei der neuen Version nicht mehr durch... Wie kann man so einen "button" machen?
    0
     

  5. Hallo AEG,
    Zitat Zitat von AEG Beitrag anzeigen
    @Jrahe: Irwie blick ich bei der neuen Version nicht mehr durch... Wie kann man so einen "button" machen?
    ...also....
    [FONT=Arial]"[/FONT][FONT=Arial]...Da stelle mer uns janz dumm. Und da sage mer so:
    [/FONT][FONT=Arial]En Dampfmaschin, dat is ene jroße schwarze Raum, der hat hinten und vorn e Loch.
    Dat eine Loch, dat is de Feuerung. Und dat andere Loch, dat krieje mer später.“
    [/FONT]
    (Sorry für OT, aber diese Szene in "Die Feuerzangbowle" von Heinrich Spoerl, verfilmt mit Heinz Rühmann, ist einfach zu genial!)


    Back to Topic:
    Die neue Version ist eigentlich gar nicht so anders als die Vorgänger-Version.

    Neu hinzugekommen ist das sogenannte "board", eine Art Bühne insbesondere für Spiele und ähnliches. Die Elemente darauf sind sogenannte "sprites" (ähnlich wie bei der Macromedia "Flash"-Programmierung) = schnelle bewegliche Objekte, die aber auch z.B. Textobjekte sein können, deren Inhalt sich entsprechend ändert.

    Dieses "board" ist "touch-sensibel".
    Und über diesen Weg lassen sich nicht nur Spiele steuern (...geniales Beispiel ist zum Beispiel das mitgelieferte Script "try missile defense"), sondern auch "Button-ähnliche"-Flächen erstellen.

    Und genau dies hat moroli in seinem Script "PicBrowser" (Post #118 ) genutzt:
    a) wischen über diese "board"-Fläche = vor- und zurückblättern
    b) tappen auf einen Bereich der "board"-Fläche = Funktion auslösen (= Button)



    Schritte zur Umsetzung:
    am Beispiel von "PicBrowser" Post #118 von moroli

    1.) Zu Anfang in seinem Script wird das board initialisiert und die Eigenschaft der Hintergrundfarbe zugewiesen.
    Code:
      b := media->create_board(180);
      b->set_background(colors->accent);
    wobei in Klammern angegeben wird: => (Höhe des boards)


    2.) Es folgt die Initialisierung der Sprite-Objekte, hier sind es Text-Sprites.
    Code:
      s1 := b->create_text(480, 20, 30, '');
      s2 := b->create_text(480, 20, 30, '');
      s3 := b->create_text(480, 20, 30, '');
      s4 := b->create_text(480, 40, 18, '');
    wobei in der Klammer angegeben werden: => (Breite, Höhe, Schriftgröße, Inhalt)


    3.) Anschließend werden diese Text-Sprites positioniert.
    Code:
      s1->set_pos(230, 10);
      s2->set_pos(230, 40);
      s3->set_pos(230, 70);
      s4->set_pos(230, 120);
    wobei in den Klammern angegeben wird: => (Abstand von links, Abstand von oben) bezogen auf das board


    4.) Mit "post to wall" wird das board auf die "Leinwand" gebracht
    Code:
      b->post_to_wall;

    5.) In der anschließenden "while true do"-Schleife werden für den Rest der Programmlaufzeit die folgenden Parameter überprüft. Diese Schleife läuft solange, bis das Programm beendet wird.

    "h" ist hier nur ein flag als Indikator, ob gerade eine Handlung ("tappen" oder "wischen") vollzogen wird. Während dessen ist h auf "false" gesetzt. Nach Abschluß der Handlung wird h wieder auf "true" gesetzt.


    5a.) Bei einem "Touch" auf dem board mit einer (Wisch-)Geschwindigkeit in x-Richtung = 0 und in y-Richtung = 0 haben wir einen "einfachen tap" => Funktion eines Buttons
    Code:
    if b->touch_velocity->x = 0 and b->touch_velocity->y = 0 then
    In dieser If-Abfrage wird dann überprüft, ob es Geo-Informationen zur Position gibt.


    5b.) Bei der nächsten If-Abfrage wird für den "touch" die Geschwindigkeit in x-Richtung (= horizontal) überprüft, also das "Wischen".
    Wenn diese Geschwindigkeit kleiner 0 ist = Wisch nach links => nächstes Bild
    (=> i := i + 1)
    Code:
    if b->touch_velocity->x < 0 then

    5c.) Und bei der nächsten If-Abfrage wird erneut für den "touch" die Geschwindigkeit in x-Richtung (= horizontal) überprüft.
    Wenn diese Geschwindigkeit größer 0 ist = Wisch nach rechts => vorangegangenes Bild
    (=> i := i - 1)
    Code:
    if b->touch_velocity->x > 0 then

    6.) In den If-Abfragen werden dann den Text-Sprites die entsprechenden (Text-)Inhalte zugewiesen.
    Zum Beispiel in der letzten If-Abfrage aus 5c.) :
    Code:
            s1->set_text(i + 1 || ' / ' || media->pictures->count);
            s2->set_text(p1->date->to_string);
            s3->set_text(x1 || ' x ' || y1);
            s4->set_text('### Tap to get the Location ###');

    7.) Und schließlich wird das board auf der Leinwand aktualisiert:
    Code:
            b->update_on_wall;


    Ich hoffe, daß dieses Beispiel die Anwendung als "Button" bzw. Nutzung als einfache GUI etwas verständlicher gemacht hat.

    Vielen Dank noch einmal an moroli für sein SUPER-Script... !

    Gruß Jörg
    Geändert von jrahe (28.05.2011 um 20:25 Uhr)
    2
     

  6. Im getting it! Wuw, danke Jrahe (und natürlich auch moroli)
    0
     

  7. Zitat Zitat von jrahe Beitrag anzeigen
    Vielen Dank noch einmal an moroli für sein SUPER-Script... !
    Auch dir ein Dankeschön für die tollen Erläuterungen. Jetzt habe ich endlich verstanden, was ich da so programmiert habe.

    Nee, im Ernst, so kann das wirklich jeder nachvollziehen - toll...
    2
     

  8. Zitat Zitat von jrahe Beitrag anzeigen
    Wie in dem Beispiel "PicBrowser" von moroli dargestellt, können wir jetzt unsere eigene GUI erstellen. In seinem Beispiel ein "touch-sensitiver" Bereich (=> Button) zum Abfragen möglicher Infos zur Geo-Koordinate und ein "wisch-sensitiver" Bereich zum vor-/zurückblättern in den Ergebnissen.
    Und auch die kleinen runden Buttons/Icons von WP7 (haben die eigentlich einen eigenen Namen?) funktionieren => Script "!myLittleGui":

    Code:
    script \u0021myLittleGui;
    
    action \u0021CreateToolbar() : Nothing {
      if wall->ask_boolean('Neues Board erstellen?', '') then {
        b := media->create_board(80);
        b->set_background(colors->dark_gray);
        addButton('http://windowsteamblog.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/wpdev/appbar.back.rest_5F00_4C7C8A1E.png');
        addButton('http://windowsteamblog.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/wpdev/appbar.next.rest_5F00_3A245F36.png');
        addButton('http://windowsteamblog.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/wpdev/appbar.upload.rest_5F00_7971ECF9.png');
        addButton('http://windowsteamblog.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/wpdev/appbar.download.rest_5F00_4FCDFBF9.png');
        addButton('http://windowsteamblog.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/wpdev/appbar.feature.search.rest_5F00_6D90485F.png');
        b->create_rectangle(1, 1);
      }
    }
    
    action \u0021TestGui() : Nothing {
      b->post_to_wall;
      c := media->create_board(460);
      c->set_background(colors->gray);
      s := c->create_ellipse(40, 40);
      s->set_color(colors->green);
      x := 240;
      y := 240;
      s->set_pos(x, y);
      c->post_to_wall;
      d := 10;
      while true do {
        i := waitForTap();
        if i = 0 then {
          x := x - d;
        }
        if i = 1 then {
          x := x + d;
        }
        if i = 2 then {
          y := y - d;
        }
        if i = 3 then {
          y := y + d;
        }
        x := checkRange(x);
        y := checkRange(y);
        s->set_pos(x, y);
        c->update_on_wall;
      }
    }
    
    var b : Board {
    }
    
    action addButton(url: String) : Nothing {
      url2 := 'http://windowsteamblog.com/cfs-filesystemfile.ashx/__key/CommunityServer-Blogs-Components-WeblogFiles/wpdev/appbar.basecircle.rest_5F00_72DE6D69.png';
      p := web->download_picture(url);
      p2 := web->download_picture(url2);
      s := b->create_picture(p);
      s2 := b->create_picture(p2);
      x := b->count / 2 * 80 - 15;
      s->set_pos(x, 40);
      s2->set_pos(x, 40);
    }
    
    action searchPicUrl() : Nothing {
      wall->prompt('Bitte auf der folgenden Website ein Icon aussuchen/anklicken und den Link dann kopieren!');
      web->browse('http://windowsteamblog.com/windows_phone/b/wpdev/archive/2010/03/27/windows-phone-7-series-icon-pack.aspx');
    }
    
    action waitForTap() : Number {
      j := - 1;
      while j < 0 do {
        s := b->at(b->count - 1);
        if b->touched then {
          s->set_pos(b->touch_current->x, b->touch_current->y);
        }
        else {
          s->set_pos(0, 0);
        }
        if s->overlaps_with(b->at(1)) then {
          j := 0;
        }
        if s->overlaps_with(b->at(3)) then {
          j := 1;
        }
        if s->overlaps_with(b->at(5)) then {
          j := 2;
        }
        if s->overlaps_with(b->at(7)) then {
          j := 3;
        }
        if s->overlaps_with(b->at(9)) then {
          j := 4;
        }
      }
      j;
    }
    
    action checkRange(x: Number) : Number {
      xx := x;
      if x < 0 then {
        xx := 460;
      }
      if x > 460 then {
        xx := 0;
      }
      xx;
    }
    
    Shared from TouchStudio v1.2.0.1 beta - http://touchstudioapp.com
    Anmerkungen:

    Das "\u0021" im Script war ursprünglich ein Ausrufezeichen (!) - nutze ich gern für die Sortierung (steht dann ganz vorne).

    Beim ersten Starten muss man "!CreateToolbar" aufrufen - die Toolbar (das Board) wird dann in der Cloud gespeichert und bleibt somit erhalten. Die Variable "b" vom Typ "Board" muss dazu unter "data" angelegt werden.

    Dann kann man mit "!TestGui" diese kleinen runden "Dinger" (s.o.) testen - damit steuert man dann einen Kreis (Buttons: hoch, runter, rechts, links).

    Bevor "!TestGui" ein zweites Mal gestartet werden kann, muss man aus dem Script raus und wieder rein, sonst fliegt man ganz raus - liegt wohl daran, dass das "Board" ("Toolbar") noch auf der alten "Wall" liegt, obwohl diese ja eigentlich beendet ist.

    Mehr wird nicht verraten - jrahe kann das eh alles viel besser erklären...
    2
     

  9. Mehr wird nicht verraten - jrahe kann das eh alles viel besser erklären...
    ...da bin ich mir nicht sicher. Ich habe doch selbst noch gar nicht verstanden, was ich da erklärt habe?!

    Danke für´s feedback....
    0
     

  10. Puh, da werd ich wohl noch ein paar Minuten brauchen um dein Script, Moroli, zusammenzuklicken
    0
     

  11. Zitat Zitat von AEG Beitrag anzeigen
    Puh, da werd ich wohl noch ein paar Minuten brauchen um dein Script, Moroli, zusammenzuklicken
    Der Export geht ja inzwischen ganz einfach (z.B. per email) - nun hoffe ich, dass der "Import" mit dem nächsten Update auch ermöglicht wird...
    1
     

  12. Hallo AEG,
    Puh, da werd ich wohl noch ein paar Minuten brauchen um dein Script, Moroli, zusammenzuklicken
    ...kleiner TIP, wenn, wie in der ersten action "!CreateToolbar", sehr lange und fehleranfällige web-Adressen eingegeben werden müssen:

    Ich nutze "Sendto WP7" auf dem Handy. Mit dem entsprechenden Link im Firefox kann ich mir web-Adressen direkt auf das Handy schicken, diese dann im IE öffnen und somit die web-Adresse per copy&paste anschließend im "TouchStudio" einfügen.

    Funktioniert wunderbar...
    1
     

  13. Hallo,
    ...hier "aufbauend" auf dem Script "PicBrowser" von moroli die Moifikation als "MusikBrowser".

    Das Script besteht aus nur einer action.

    Ich nutze hier zwei "boards" für Informationen und zur Steuerung:
    a) das untere board dient der Anzeige der Informationen zum aktuellen Musikalbum.
    => durch "wischen nach links" wird das nächste Album angezeigt
    => durch "wischen nach rechts" wird das vorhergehende Album angezeigt
    => durch antippen wird der Player mit dem ersten Titel des aktuellen Albums gestartet
    wenn schon ein Titel des Albums läuft, wird zum nächsten Titel geschaltet

    b) das obere board zeigt das Cover des aktuellen Musikalbums
    => durch antippen kann eine Liste aller Titel des aktuellen Albums ein-/ausgeblendet werden

    Auf diese Weise kann man durch die Musikalben blättern.
    Während die einzelnen Alben übergeblendet werden, läuft der Player mit dem gerade gespielten Titel im Hintergrund weiter.
    Die Liste aller Titel aktualisiert sich nach dem aktuellen Album automatisch.

    Gestartet wird das Programm mit einem ersten Wisch nach links oder rechts.

    Das Programm läuft sehr stabil bei mir. (11 Alben mit 127 Liedern)
    => Allerdings braucht es beim Weiterschalten zum nächsten/vorherigen Album ca. 1 Sekunde. Das liegt an dem "Überblendeffekt" für die Cover-Bilder.
    => Bei Verlassen des Programms oder aktivem Lockscreen beendet sich das Programm bei Wiederrückkehr.

    EDIT (10.06.2011)
    => wenn ein Album ohne Cover-Bild aufgerufen wird, bricht das Programm mit einer Fehlermeldung ab.
    => für diesen Fall könnte eine zusätzliche Überprüfung in Form von "is valid" eingearbeitet werden.


    Microsoft Research TouchStudio-1.jpg Microsoft Research TouchStudio-1a.jpg

    Microsoft Research TouchStudio-2.jpg Microsoft Research TouchStudio-2a.jpg

    Microsoft Research TouchStudio-3.jpg Microsoft Research TouchStudio-3a.jpg


    Wichtig:
    ...in dem Code sind Kommentarzeilen eingefügt, die mit einem Doppel-Slash beginnen.
    ...also alle Zeilen "// ..." beim abtippen ignorieren

    Viel Spaß
    Jörg

    Code:
    action _MusikBrowser() : Nothing {
    
    	// Definition "board picture" => für das Albumcover
      bp := media->create_board(460);
      bp->set_background(colors->background); 
    
    	// Definition "board box" => für die Textinfobox
      bb := media->create_board(180);
      bb->set_background(colors->gray);
      
    	// Definition des "Hilfs-Objekt" für sp1
      p := media->create_picture(460, 460);
      p->clear(colors->background);
      
    	// Definition der sprite-Objekte
      sp1 := bp->create_picture(p);
      sp2 := bp->create_rectangle(460, 460);
      sp3 := bp->create_text(460, 460, 20, '');
      sb1 := bb->create_text(480, 20, 30, '');
      sb2 := bb->create_text(480, 20, 30, '');
      sb3 := bb->create_text(480, 20, 30, '');
      sb4 := bb->create_text(480, 40, 18, '');
    
    	// Positionierung der sprite-Objekte
      sp1->set_pos(230, 230);
      sp2->set_pos( - 230, 230);
      sp3->set_pos( - 230, 230);
      sb1->set_pos(230, 10);
      sb2->set_pos(230, 40);
      sb3->set_pos(230, 70);
      sb4->set_pos(230, 120);
      
    	// Zuweisung der Eigenschaften einiger sprite-Objekte
      sp2->set_color(colors->black->make_transparent(0.7));
      sp3->set_text('kein\nAlbum\ngewählt');
      sb1->set_text('Zum Starten hier \qwischen\q');
      
    	// Projektion der boards auf die wall
      bb->post_to_wall;
      bp->post_to_wall;
      
    	// Definition Index i für die Musikalben und x für den aktuellen Musiktitel
      i := - 1;
      x := 0;
      
    	// Definition des Status, ob "board box" berührt wurde
      flag1 := true;
    	// Definition des Status, ob "board picture" berührt wurde  
      flag2 := true;
    	// Definition des Status, ob die Titel-Liste angezeigt wird 
      flag3 := true;
      
    	// Definition n = "Anzahl der Alben" und a = "aktuelles Album"
      n := media->song_albums->count;
      a := media->song_albums->at(0);
      
      
    	// Start der "Dauerschleife" für den eigentlichen Programmablauf
      while true do {
      
    	// Abfrage, ob das obere "board picture" berührt wurde
        if bp->touched then {
          while bp->touched do {
            flag2 := false;
          }
        }
    	// ...ab hier, für den Fall, das berührt wurde
        if not flag2 then {
          if flag3 then {
            sp2->move(460, 0);
            sp3->move(460, 0);
            flag3 := false;
          }
          else {
            sp2->move( - 460, 0);
            sp3->move( - 460, 0);
            flag3 := true;
          }
          bp->update_on_wall;
          flag2 := true;
        }
    	
    	
    	// Abfrage, ob das untere "board box" berührt wurde
        if bb->touched then {
          while bb->touched do {
            flag1 := false;
          }
        }
    	// ...ab hier, für den Fall, das berührt wurde
        if not flag1 then {
    		// Fall = einfacher tap => Player "start" bzw. "weiter" nächstes Lied
          if bb->touch_velocity->x = 0 and bb->touch_velocity->y = 0 then {
            if i >= 0 then {
              player->play(a->songs->at(x));
              if x < a->songs->count - 1 then {
                x := x + 1;
              }
              else {
                x := 0;
              }
            }
          }
     		// Fall = Wisch nach links => nächstes Musikalbum
         if bb->touch_velocity->x < 0 then {
            i := i + 1;
            if i >= n then {
              i := 0;
            }
            x := 0;
          }
     		// Fall = Wisch nach rechts => vorheriges Musikalbum
          if bb->touch_velocity->x > 0 then {
            i := i - 1;
            if i < 0 then {
              i := n - 1;
            }
            x := 0;
          }
    	  
    		// Ermitteln und Einsetzen der aktuellen Daten
          if i >= 0 then {
            a := media->song_albums->at(i);
            anz := a->songs->count;
            cover := a->art;
            cover->resize(460, 460);
    		
    		// Überblenden der Cover innerhalb 1 Sekunde
            alpha := 0;
            for 0 <= i1 < 10 do {
              alpha := alpha + 0.1;
              p->blend(cover, 0, 0, 0, alpha);
              p->update_on_wall;
            }
    		
    		// Schreiben der Infos zum aktuellen Album
            sb1->set_text(a->name);
            sb2->set_text(a->artist);
            sb3->set_text(a->songs->count || '  Titel      ' || math->floor((a->duration) / 60) || '  Minuten');
    		
    		// Erstellen der Liste der Titel des aktuellen Albuns
            song := a->songs->at(0);
            liste := '';
            liste := liste || song->name;
            for 0 <= i2 < anz - 1 do {
              song := a->songs->at(i2 + 1);
              liste := liste || '\n' || song->name;
            }
    		
    		// Schreiben der Titel-Liste
            sp3->set_text(liste);
    		
    		// Schreiben der Infos zum aktuell gespielten Titel
    		// dieser ist nicht unbedingt identisch mit aktuellem Album
            if player->is_playing then {
              sb4->set_text('-----------------------------------\naktueller Titel\n' || player->active_song->artist || '  -  ' || player->active_song->name || '  -  ' || player->active_song->track);
            }
            else {
              sb4->set_text('-----------------------------------\nTippen zum Starten des Players\n' || a->songs->at(0));
            }
    		
    		// Aktualisierung der boards auf der wall
            bb->update_on_wall;
            bp->update_on_wall;
            flag1 := true;
          }
        }
      }
    }
    
    Shared from TouchStudio v1.2.0.1 beta - http://touchstudioapp.com
    Edited with comments by Jörg Rahe
    Thanks to moroli from pockepc.ch
    Geändert von jrahe (10.06.2011 um 10:51 Uhr)
    1
     

  14. Ich hatte mir gestern das erste Mal den Bereich der Spiele angesehen...
    Neben vielen anderen (Test-)Versionen wird z.B. auch "Frogger" angeboten. Recht gut gemacht, kostet in der "Vollversion" 0,99 Euro.

    Was aber ist mit denjenigen, die nicht über eine Kreditkarte verfügen...?
    ...na ja, sowas wie "Frogger" sollte doch auch mit dem "TouchStudio" möglich sein.

    Hier also ein schnelles Beispiel:
    (...es ist natürlich noch ausbaufähig und individuell anpassbar)

    FROSCH

    Spielstart:
    Zu Beginn werden drei Parameter vom Spieler abgefragt:
    1. die gewünschte Spielfeldgröße. Hier bietet sich ein Wert von 400 an.
    Bei Werten über 500 wird es richtig lustig, wenn man den Frosch am unteren Fahrbahnrand nicht mehr sieht und diesen "blind" steuern muß.
    Ebenso "nett" sind Werte unter 200 mit mehreren Fahrbahnen, da dann der Frosch schon im wartenden Zustand am unteren Fahrbahnrand getroffen werden kann.

    2. die Anzahl der Fahrbahnen. Hier bietet sich ein Wert von z.B. 4 an.
    Je mehr Fahrbahnen, desto höher sind die zu erzielenden Punkte.
    Aber manchmal ist weniger auch mehr....

    3. der gewünschte Start-Level. Wenn hier nichts eingegeben wird, startet das Spiel mit Level 1.
    Je höher der Level, desto höher sind die zu erzielenden Punkte, aber entsprechend schneller bewegen sich aucch die Autos.

    Steuerung:
    Durch Wischbewegung auf der Spielfläche springt der Frosch entsprechend der Wischrichtung entweder jeweils eine Fahrbahn höher/runter oder aber einen Schritt nach rechts/links.
    Mit jedem Sprung nach oben erhöhen sich die Punkte (die Punkthöhe ist abhängig von der Anzahl der Fahrbahnen und dem Level).
    Mit dem Erreichen des oberen Fahrbahnrands wird der Level jeweils erhöht.
    Je höher der Level, desto schneller fahren die Autos.
    Bei Kontakt mit einem Auto wird das Spiel beendet.

    Zeitsteurung:
    Auf Grund eines aktuellen Fehlers im "TouchStudio" ist die Differenzberechnung zwichen zwei timestamps aktuell nicht möglich. Daher habe ich die Zeitsteuerung noch nicht implementiert. Die Anzeige ist schon vorbereitet.
    (... der Fehler im "TouchStudio" wird mit dem nächsten Update behoben werden)

    Strategie:
    Der Phantasie sind hier kaum Grenzen gesetzt. Ob man(n) sich ausschließlich am oberen Rand aufhält, um möglichst schnell die Level "hochzuschalten", oder aber es lieber mit einem großen Spielfeld und nur einer Fahrbahn versucht...

    Script:
    In dem nachfolgenden Script sind mit einem "//" eingeleitete Kommentarzeilen mit Erklärungen zu den einzelnen Programmteilen eingefügt worden. Diese sind beim Abtippen zu ignorieren.
    Neben der "Hauptaction" FROSCH ist eine weitere action RESET, um den Highscore zu löschen.
    Dieser Highscore bleibt als "globale Variable" auch nach Spielende erhalten, solange, bis er mit der action RESET wieder auf Null gesetzt wird.
    Insgesamt gibt es drei "globale Variablen":
    a) high => Highscore
    b) lev => aktueller Level (wird beim Start erfragt oder alternativ mit 1 begonnen)
    c) score => aktueller Punktestand (wird beim Start auf Null gesetzt)

    Code:
    script Frosch;
    ///////////////////////////////////////////////////////////////////////////
    // data = globale Variablen
    // der Wert für Highscore bleibt auch nach Beenden des Spiels erhalten
    // die Werte für Level und Punkte werden bei jedem neuen Spiel zurückgesetzt
    
    var high : Number {
    }
    
    var lev : Number {
    }
    
    var score : Number {
    }
    
    
    
    
    
    ///////////////////////////////////////////////////////////////////////////
    // Hier beginnt die zusätzliche "action" RESET, um den Highscore zu löschen
    
    action Reset() : Nothing {
    if wall->ask boolean("Wirklich Highscore löschen?", "") then {
    	high := 0;
    	}
    }
    
    
    
    
    
    ///////////////////////////////////////////////////////////////////////////
    // Hier beginnt die "action" => FROSCH
    // 
    // Zu Beginn des Spiels werden die Startparameter abgefragt:
    // Höhe Spielfeld, Anzahl der Spuren, gewünschter Startlevel
    
    action Frosch(height: Number, lane: Number, level: Number) : Nothing {
    
    // zunächst werden die Startwerte initialisiert:
    // vert = vertikale Schrittweite des Frosch, entspricht einer Spurbreite
    // horiz = horizontale Schrittweite des Frosch
    // x und y sind die Startposition für den Frosch
    // a und b sind Parameter für das Tempo der Autos
    // points sind die Punkte für Spurwechsel aufwärts, abhängig vom Schwierigkeitsgrad
    // flag ist ein Indikator für das Hochsetzen zum nächsten Level
    
      if level = 0 then {
        lev := 1;
      }
      else {
        lev := math->abs(level);
      }
      score := 0;
      zeit := 60;
      vert := height / (lane + 2);
      horiz := 40;
      x := 240;
      y := height - vert / 2;
      a := 10;
      b := 10;
      tempo := a + b * lev;
      points := lane * lev;
      flag := false;
      
      // Initialisierung des Spielfelds
      Game := media->create_board(height);
      Game->set_background(colors->gray);
    
      // Initialisierung und Positionierung der Spuren
      for 0 <= i < lane do {
        spur := Game->create_rectangle(480, height / (lane + 2) - 5);
        spur->set_pos(240, vert / 2 + (i + 1) * vert);
      }
    
      // Initialisierung und Positionierung des Froschs
      frog := Game->create_ellipse(40, 40);
      frog->set_color(colors->green);
      frog->set_pos(x, y);
    
      // Initialisierung und Positionierung der Autos
      for 0 <= i1 < lane do {
        car := Game->create_rectangle(50, 30);
        car->set_color(colors->rand);
        car->set_pos(30, vert / 2 + vert + i1 * vert);
        car->set_speed((1 + math->rand(10)) * tempo, 0);
      }
    
      // Initialisierung und Positionierung der Punkteanzeige
      Punkte := Game->create_text(100, 20, 24, 'Punkte: ' || score);
      Punkte->set_pos(60, 20);
      Punkte->set_color(colors->light_gray);
      High := Game->create_text(100, 20, 24, 'High: ' || high);
    
      // Initialisierung und Positionierung der Highscoreanzeige
      High->set_pos(330, 20);
      High->set_color(colors->light_gray);
      Zeit := Game->create_text(100, 20, 24, 'Zeit: ' || zeit);
    
      // Initialisierung und Positionierung der Zeitanzeige (aktuell nicht aktiv)
      Zeit->set_pos(60, height - 30);
      Zeit->set_color(colors->light_gray);
    
      // Initialisierung und Positionierung der Levelanzeige
      Level := Game->create_text(100, 20, 24, 'Level: ' || lev);
      Level->set_pos(330, height - 30);
      Level->set_color(colors->light_gray);
      
      // Aktualisierung des Spielfelds und Beginn der Startzeit
      Game->evolve;
      Game->post_to_wall;
      start := time->now;
      
      // Hier beginnt das eigentliche Spiel in einer "Endlosschleife"
      while true do {
        
    	// die folgende Abfrage überprüft, ob das Spielfeld berührt wurde
        if Game->touched then {
          p := Game->touch_start;
    	  // während der Überprüfung wird das Spiel fortlaufend aktualisiert
          while Game->touched do {
            Game->evolve;
            Game->update_on_wall;
          }
          p1 := Game->touch_end;
    	  
    	  // Ermittlung, ob Wischbewegung horizontal (dx) oder vertikal (dy)
          dx := math->abs(p->x - p1->x);
          dy := math->abs(p->y - p1->y);
          if dx > dy then {
    		// Wischbewegung => nach rechts
            if p1->x > p->x then {
              if frog->x + horiz <= 460 then {
                frog->move(horiz, 0);
              }
              Game->evolve;
            }
            else {
    		// Wischbewegung => nach links
              if frog->x - horiz >= 0 then {
                frog->move( - horiz, 0);
              }
              Game->evolve;
            }
          }
          else {
    		// Wischbewegung => nach unten
            if p1->y > p->y then {
              if frog->y + vert <= height then {
                frog->move(0, vert);
              }
              Game->evolve;
            }
            else {
     		// Wischbewegung => nach oben + Punkte + Level höher bei Erreichen oberem Rand
             if frog->y - vert >= 0 then {
                frog->move(0, - vert);
                score := score + points;
                points := lane * lev;
                Punkte->set_text('Punkte: ' || score);
                if frog->y < height / (lane + 2) then {
                  lev := lev + 1;
                  Level->set_text('Level: ' || lev);
                  tempo := a + b * lev;
                  flag := true;
                }
              }
              Game->evolve;
            }
          }
        }
    	
    	// permanent wird für jede Spur überprüft, ob eine Kollision mit Frosch vorliegt
        for 0 <= i2 < lane do {
    	  // mit "u" werden die Autos auf den einzelnen Spuren ermittelt
          u := Game->at(i2 + lane + 1);
    	  // wenn zuvor ein Level höher gestellt wurde, wird das Tempo angepasst
          if flag then {
            u->set_speed((1 + math->rand(10)) * tempo, 0);
          }
    	  // wenn es zu einer Kollision kommt, wird das Spiel gestoppt
          if u->overlaps_with(frog) then {
            if score > high then {
              high := score;
              High->set_text('High: ' || high);
            }
            ENDE := Game->create text(200, 40, 60, "ENDE");
    		ENDE->set position(240, height/2);
    		ENDE->set color(colors->red);
    		while true do {
    			do nothing;
    			}
          }
        }
    	
    	// zurücksetzen des Indikators für "Level höhersetzen" und Aktualisierung des Spielfelds
        flag := false;
        Game->evolve;
        Game->update_on_wall;
      }
    }

    Beispiele:

    Spielfeldgröße 400 mit 2 oder 4 oder 8 Fahrbhnen:

    Microsoft Research TouchStudio-frosch-2spur.jpg Microsoft Research TouchStudio-frosch-4spur.jpg Microsoft Research TouchStudio-frosch-8spur.jpg



    Spielfeldgröße 500 oder 200 bei jeweils 2 Fahrbahnen:

    Microsoft Research TouchStudio-frosch-2spur-big.jpg Microsoft Research TouchStudio-frosch-2spur-small.jpg



    Spielende:

    Microsoft Research TouchStudio-frosch-ende.jpg


    VIEL SPASS beim Scripten und Spielen
    Jörg
    Geändert von jrahe (11.06.2011 um 19:55 Uhr)
    2
     

  15. Jörg hat wieder zugeschlagen ...
    Und endlich begreife ich halbwegs wie man ein Spiel macht, Danke
    0
     

  16. Hallo allerseits,
    gibt es eine Möglichkeit, mit TouchStudio Schnellzugriffe zu erstellen und auf dem Startbildschirm anzuzeigen???
    z.B. Bluetooth, GPS, WLAN, Klingelton etc. ein- und ausschalten ohne über 'Einstellungen' zu gehen.
    0
     

  17. ...nein, zur Zeit noch nicht.

    Mit dem (offiziellen) Mango-Update im Herbst werden einzelne Scripte auf dem Startbildschirm abzulegen sein.

    Inwieweit die Schnittstellen zu WLAN, GPS, BT etc. von Microsoft freigegeben werden, weiß ich nicht.

    Gruß Jörg
    0
     

  18. D. h., Du weißt schon jetzt, dass das offizielle Mango Update in diesem Bereich anders wird, als die Mango Beta?
    Ich könnte mir lediglich vorstellen, dass ein App-Update die neuen Funktionen bringen könnte. Aber Für eine Funktion "Script auf Tile" bedarf es bestimmt nicht der Mangoversion.
    Mit der kostenlosen PocketPC.ch App von meinem OMNIA7 aus geschrieben.
    0
     

  19. Hallo Salix,
    ...nein, ich weiß nicht, ob und inwieweit sich das offizielle Mango update von der aktuellen beta-Version unterscheiden wird.

    Für das Anpinnen von Scripten auf der Startseite muß aber das offizielle Mango update in diesem Bereich auch nicht anders sein als das Mango beta update. Mit Mango beta wäre dies wahrscheinlich auch schon möglich.
    Allerdings muß die Anwendung "TouchStudio" dafür "anders sein", nämlich für Mango neu programmiert/angepasst werden, um diese Funktionen nutzen zu können.

    Ähnliches betrifft z.B. das "Multitasking":
    Mit der Mango beta Version erhalten wir schon jetzt bei längerem Druck auf die "zurück"-Taste eine Übersicht der aktuell "laufenden" apps. Ein wirklich schnelles Hin- und Herschalten (quasi Multitasking) aber ist noch nicht möglich, da es noch keine neuen apps gibt, die dies unterstützen.

    Auf der Microsoft Research Team Seite resp. in deren paper resp. auf deren facebook-Seite stehen die neuen mit Mango kommenden Funktionen, u.a. Scripte als tile auf die Startseite zu pinnen.
    Aktuell ist dies aber noch nicht möglich.

    Gruß Jörg
    Geändert von jrahe (06.07.2011 um 07:59 Uhr)
    0
     

  20. Also irgendwie finde ich das nicht im MarketPlace.
    Muss ich dafür Entwickler sein oder bin ich (bzw. mein Phone) einfach zu blöd dafür?
    Mit der kostenlosen PocketPC.ch App von meinem LG-E900 aus geschrieben.
    0
     

Seite 7 von 8 ErsteErste ... 67 ... LetzteLetzte

Ähnliche Themen

  1. gekochte ROMs und Microsoft Dienste wie z.B. Microsoft MyPhone
    Von gitarrero im Forum Touch HD ROM Upgrade
    Antworten: 6
    Letzter Beitrag: 02.06.2009, 14:02
  2. Microsoft Research stellt neue Technologien vor
    Von MuvOn im Forum Plauderecke
    Antworten: 2
    Letzter Beitrag: 12.07.2004, 11:16

Besucher haben diese Seite mit folgenden Suchbegriffen gefunden:

touchstudio

wp7 app gps distant

touchstudio wp7

wp7 touch studio

touch studio wp7

touchstudio tutorial

touch studio tutorialmicrosoft research touchstudiotouch studio wp7 tutorialtouchstudio scriptswindows phone 7 touchstudiowp7 touchstudiotouch studio scriptsTouch Studio anleitungmicrosoft touch studio manualwindows phone schwarz kachelnMS touchstudiomicrosoft touch studiowindows-live-for-android-126945touchstudio windows phone 7touchstudio dokumentationtouchStudio hilfenutzung der zdf mediathek wp7windows phone 7 scriptingtouch studio wp7 wall hintergrund

Stichworte