[Squeak-ev] EToys: 2 Bugs in "Expression-Builder"; und "falscher" Wertebereich bei Schieber; und Problem mit Malen+Lager

Bert Freudenberg bert at impara.de
Son Sep 19 11:54:12 UTC 2004


Am 19.09.2004 um 11:10 schrieb Harald Mueller:

> Hallo -
>
> folgendes Szenario: Lukas wollte auch die Geschwindigkeit seines LKW
> steuern, und zwar auch mit Rückwärtsfahrt. Schon vorher sind wir über 
> den
> "Schieber" gestolpert. Er wollte, dass Stillstand ca. bei Reglerstand 
> beim
> unteren Drittel eintritt; nach unten dann Rückwärtsfahren (braucht 
> nicht so
> schnell zu sein), nach ober vorwärts.
>
> 1. Problem: Man kann den Schieber auch beim Malen einfügen; Lukas hat 
> einen
> roten Strich daneben an die Nullposition gemalt. Nach "Keep" sind die 
> zwei
> Dinge aber *nicht* verbunden ("grouped"), sondern bleiben einzeln und 
> fallen
> beim Herumschieben wieder auseinander - sehr unerwartet.
> Wir haben dann kurz herumgeschaut nach einer zusätzlichen 
> "Gruppierung",
> aber im EToys-Kontext ist uns nicht eingefallen, wo das sein könnte 
> ... geht
> halt nicht.

Doch, geht ;-)

Man kann Objekte ineinander einbetten. Am einfachsten ist wohl, du 
holst dir ein Rechteck aus dem Lager und verschiebst den Schieber und 
Strich darüber. Jetzt den Halo für den Schieber aktivieren, im Menu 
roten Halo-Smarties "einbetten in..." - "Rechteck" auswählen. Genauso 
für den Strich. Falls das Rechteck stört, kann man dessen Farbe dann 
noch transparent machen. Danach muss man nur aufpassen, nicht das 
schwarze Smartie zu verwenden, da man damit ein Objekt aus dem 
momentanen Behälter heraushebt (erkennbar am Schatten). Das braune 
Smartie verschiebt dagegen nur das Objekt, ohne es hochzuheben.

In manchen Objekten passiert das Einbetten automatisch, z.B. in der 
Spielwiese und dem Behälter.

> 2. Befragt nach dem Wertebereich des Schiebers, war Lukas' sofortige 
> Antwort
> "0 ganz unten und 100 ganz oben". Das ist nun vielleicht ein 
> "kulturelles"
> Vorurteil (auch von einigen Computerspielen, die Lukas kann), aber 
> auch die
> anderen Zahlenwerte, die bisher aufgetaucht sind (Winkel, 
> Geschwindigkeiten,
> x- und y-Position) sind immer ganze Zahlen (im Gegensatz zur Realität 
> - aber
> didaktisch doch ok) - daher ist 0.00 bis 1.00 schon sehr unerwartet und
> unserer Meinung nach "falsch".

Über die Defaultwerte könnte man trefflich streiten - aber all das 
kannst du im Betrachter des Schiebers einstellen. Dort findest du eine 
Kategorie "Regler" (die sollte natürlich eigentlich "Schieber" heißen, 
bzw der Schieber lieber Schieberegler? Hmm) in der du den Wertebereich 
einstellen kannst, Runden erzwingen ("abrunden" - naja, an der 
Übersetzung müssen wir noch feilen), und auch den Bereich umkehren. 
Zusätzlich kann man im Menu vom "Reglerwert" die Anzahl der 
Dezimalstellen auf 0 setzen, sieht netter aus als 85.00.

Für dein Autobeispiel könnte man also den Werte-Bereich direkt von -2 
bis +8 setzen und kommt so ohne Verrenkungen (die leider momentan nötig 
sind) zum Ziel. Zum direkten Steuern kann man auch gut den Joystick aus 
dem Lager verwenden, den kann man entweder mit der Maus bedienen oder 
mit einem echten Joystick, da kommt schon fast Spielhallengefühl auf 
;-)

> 3. Jetzt kommt aber das richtige Problem: Wir haben uns - mit Hilfe 
> einer
> Tabelle auf Papier - Funktionen überlegt, um aus dem Schieber 
> 0.00...1.00
> die Geschwindigkeit -2...+8 zu machen. Die erste Funktion war
>     (Schiebers Reglerwert - 0.2) * 10
> Wir haben also
> a. ein Skript für "LKW fährt vorwärts um" herausgezogen
> b. den "Schiebers Reglerwert" auf das "5" gezogen
> c. "mit Bauchweh" (wegen der Klammern) dann "- 0.2" angehängt
> d. und dann "* 10"
> Leider wird das "- 0.2" ohne irgendeine Meldung akzeptiert - aber 
> intern
> dann gleich auf 0 gerundet (oder abgeschnitten). Das ist nicht ok.
>
> [Wieso ich das (c) zugelassen habe? Erstens machen wir "exploratives 
> Lernen"
> - hätt ja gehen können :-) Zweitens weiß ich, dass dahinter Smalltalk 
> steht
> - und dort gilt ja immer "links vor rechts", also hätte es ja - zwar
> didaktisch riskant/falsch, weil *gegen* "Punkt- vor Strichrechnung" - 
> doch
> auch gehen können]
>
>
> Ich habe nun aber lange genug mit Programmen zu tun - also haben wir 
> nach
> ausprobieren und Nix-mit-Rückwärts die Zahlen angeschaut, und da war 
> statt
> 0.2 eben 0 ... also neue Funktion ...

Zu der Formel - siehe unten. Aber das Rundungsproblem kann ich nicht 
nachvollziehen - wo wurde gerundet?

> 4. ... natürlich (für mich - Lukas war schon etwas verdattert, weil 
> unsere
> schön erarbeitete erste Funktion nicht "wollte") jetzt
>     Schiebers Reglerwert * 10 - 2
> ... geht aber auch nicht.
> Big bug: Das Ergebnis im Skript (habe ich heute erst mit Lukas 
> nachgeschaut)
> ist
>     get___Value * (10 - 2)
> !!!!???????????????? (und für die erste Funktion mit dem 
> abgeschnitteten 0.2
> ->0 war das Ergebnis
>     get___Value - (0 * 10)
> ). Ich erwarte mir auf jeden Fall strenge "Punkt- vor Strichrechnung" -
> alles andere ist falsch.
> (Und dann muss man natürlich für max: und min: auch die Prio 
> definieren -2
> "vernünftige" Möglichkeiten wären m.E.
>    "Strichrechung" = +, -
>    "Punktrechnung" = alles andere
> oder
>    "Vergleichsrechnung" = min:, max:
>    "Strichrechung" = +, -
>    "Punktrechnung" = alles andere
>
> Gleichrangige Operatoren natürlich wie üblich von links nach rechts.
>
> Beispiel eines EToys-Ausdrucks:
>     Wert1 - 3 max: 4 - Wert2 * 5
> Im ersten Fall wäre die Klammerung
>     (Wert1 - (3 max: 4)) - (Wert2 * 5)
> im zweiten Fall :
>     ((Wert1 - 3) max: (4 - (Wert2 * 5))
> Das zweite ist "für mich" viel "richtiger" - wohl, weil ich max: 
> irgendwie
> mit <= in einen Topf werfe ...

Da hast du eines der wesentlichen Probleme der momentanen EToys erkannt 
- der Formeleditor ist keiner. Wir behelfen uns momentan mit dem 
Aufteilen "komplexerer" Ausdrücke auf mehrere Zeilen, notfalls unter 
Zurhilfenahme von Variablen: Der LKW bekommt eine Variable 
"Geschwindigkeit" (der "v"-Knopf oben im Betrachter). Dann macht man 
mehrere Zeilen:
	LKWs geschwindigkeit := Schiebers reglerWert - 0.2.
	LKWs geschwindigkeit := LKWs geschwindigkeit * 10.
	LKW gehe vorwärts um LKWs geschwindigkeit.
Alternativ kann man Ausdrücke "rückwärts" aufbauen, aber lesbar wird 
das dann auch nicht. In deinem Fall müsste man aus der 5 beim "gehe 
vorwärts" eine 10 machen, dann mit dem Reglerwert multiplizieren, und 
von diesem 0.2 abziehen:
	LKW gehe vorwärts um 10 * (Schiebers reglerWert - 0.2).
Nicht schön, und für Kinder auf jeden Fall ungeeignet.

Steht auf der ToDo-Liste für den EToys-Nachfolger mit ganz oben.

- Bert -