Endlich ist eine ansprechende GUI im TouchStudio möglich
@AEG
Endlich ist eine ansprechende GUI im TouchStudio möglich! :D
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
Weitere Infos zur Version beta 1.2 des "TouchStudios"
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
AW: Microsoft Research TouchStudio
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;
}
}
}
}
AW: Microsoft Research TouchStudio
@Jrahe: Irwie blick ich bei der neuen Version nicht mehr durch... Wie kann man so einen "button" machen?
Erstellung eines "Button" in TouchStudio beta 1.2
Hallo AEG,
Zitat:
Zitat von
AEG
@Jrahe: Irwie blick ich bei der neuen Version nicht mehr durch... Wie kann man so einen "button" machen?
...also.... ;)
Zitat:
[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!) :D
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
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:
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... ! :cool:
Gruß Jörg
AW: Microsoft Research TouchStudio
Im getting it! Wuw, danke Jrahe (und natürlich auch moroli) :)
AW: Erstellung eines "Button" in TouchStudio beta 1.2
Zitat:
Zitat von
jrahe
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...
AW: Endlich ist eine ansprechende GUI im TouchStudio möglich
Zitat:
Zitat von
jrahe
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... ;)
AW: Endlich ist eine ansprechende GUI im TouchStudio möglich
Zitat:
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.... :p
AW: Microsoft Research TouchStudio
Puh, da werd ich wohl noch ein paar Minuten brauchen um dein Script, Moroli, zusammenzuklicken :)
AW: Microsoft Research TouchStudio
Zitat:
Zitat von
AEG
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...
AW: Microsoft Research TouchStudio
Hallo AEG,
Zitat:
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... ;-)
Liste der Anhänge anzeigen (Anzahl: 6)
Browser zur Darstellung der Musikalben und ihrer Informationen
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.
Anhang 69738 Anhang 69734
Anhang 69739 Anhang 69736
Anhang 69737 Anhang 69735
Wichtig:
...in dem Code sind Kommentarzeilen eingefügt, die mit einem Doppel-Slash beginnen.
...also alle Zeilen "// ..." beim abtippen ignorieren :cool:
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
Liste der Anhänge anzeigen (Anzahl: 6)
Wer schlägt den Frosch...?
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...? :confused:
...na ja, sowas wie "Frogger" sollte doch auch mit dem "TouchStudio" möglich sein. :cool:
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ß. :p
Ebenso "nett" sind Werte unter 200 mit mehreren Fahrbahnen, da dann der Frosch schon im wartenden Zustand am unteren Fahrbahnrand getroffen werden kann. :p
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:
Anhang 70574 Anhang 70570 Anhang 70571
Spielfeldgröße 500 oder 200 bei jeweils 2 Fahrbahnen:
Anhang 70569 Anhang 70572
Spielende:
Anhang 70573
VIEL SPASS beim Scripten und Spielen
Jörg
AW: Microsoft Research TouchStudio
Jörg hat wieder zugeschlagen ...
Und endlich begreife ich halbwegs wie man ein Spiel macht, Danke :)
AW: Microsoft Research TouchStudio
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.
AW: Microsoft Research TouchStudio
...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
AW: Microsoft Research TouchStudio
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
AW: Microsoft Research TouchStudio
Also ich hab ja das selbe Problem, dass die App nicht verfügbar ist, allerdings funktioniert sie bei mir mittlerweile einwandfrei wie zuvor.
Dafür musste ich mein LG aber mittels MFG unlocken, nach dem Relock kann ich sie nurnoch deinstallieren.
ich hoffe, es geht auch bald ohne Unlock, die app wieder zu nutzen.
AW: Microsoft Research TouchStudio
@jackal3000
Wie ich sehe, hast du ein LG E900.
Traust du dir es zu, zwei kleine Änderungen an der Registry zu machen, so wie ich?
Dann könntest du dir die App wieder aufs Handy laden, hab ich auch gemacht, funktioniert ziemlich gut.
Zune täuschen kannst du, indem du deinen Aufenthaltsort auf USA bzw Vereinigte Staaten stellst, allerdings musst du auch eine amerikanische Windows Live ID haben, anders meckert Zune rum.
Wenn du dir Weg 1 zutraust, schreib mir ne PM, ich geb dir die Mittel, die du brauchst, ich weiß nicht, wie legal das alles hier ist, wenn ich zB die .xap von TouchStudio hier öffentlich poste. (Das Mittel zum Unlock mittels MFG ist ja öffentlich verfügbar, nur ich weiß nicht, wie die Lage hier ist beim posten von .xap Dateien)
AW: Microsoft Research TouchStudio
@internetfreak: Wenn du mit Weg 1 einen Jailbreak meinst, dann traue ich mir das zwar zu, weiß aber nicht, ob ich mich das traue.
Würde ich damit nicht den Support von Microsoft verlieren oder könnte ich es nach dem installieren von Touchstudio wieder problemlos mit Registryeinträgen zurücksetzen?
Meinst du vielleicht mit den Änderungen so etwas?
AW: Microsoft Research TouchStudio
@jackal
Nein, das meinte ich nicht.
In gewisser Hinsicht sind die Änderungen wohl schon ein jailbreak, denn ich kann nach der Prozedur auch Apps von VisualStudio auf das Gerät deployen ohne Entwickleraccount.
Wenn du die Änderungen durchführst, musst du die Änderungen so lassen, anders funktioniert Touchstudio nicht (ich habs ausprobiert und mein Phone danach wieder relocked, TouchStudio meldete mir dann nen Fehler)
Allerdings sind das nur zwei Registrykeys, die du ändern musst und wenn du nur das tust, was du sollst, dürfte nix passieren.
Ob du damit den Support verlierst, weiß ich nicht, allerdings sind die Änderungen nach einem Hardreset sowieso weg.