Wenn Sie kein Inhaltsverzeichnis sehen, dann klicken Sie bitte hier:
Wenn Sie diese lecture note schon früher einmal angeschaut haben und sicher sein wollen, dass Sie die neueste Version haben, leeren Sie bitte den Browser Cache und laden Sie die Seite neu.
Wenn Sie auch andere Themen sehen wollen, bitte hier klicken: .


0. Vorwort

LiveCode (früherer Name RunRev) ist in gewissem Sinne ein Nachfolgeprodukt von Claris HyperCard aus den 80er Jahren und SuperCard. Stacks beider alten Apps kann man konvertieren [10,11]. Apples XCode. Im Gegensatz zu den beiden genannten kann man mit LiveCode jedoch Applikationen nicht nur für den Mac, sondern auch für Unix, Linux und Windows machen. Die Programmierung ist Event-gesteuert und erinnert an die früheren Versionen von Directors Lingo.

Es gibt zu dem eigentlichen Programm eine Anzahl von Plugins. Diese müssen in einem Ordner mit der Bezeichnung Plugins gespeichert werden. In welchem Ordner sich dieser Ordner befindet wird angegeben unter LiveCode>Einstellungen>Files & Memory>user Extensions.

Diese Lecture Note setzt ein allgemeines, elementares Verständnis von Programmierung voraus.

Englische Begriffe werden, wenn es sich um Substantiva handelt, im Deutschen zwar groß geschrieben, jedoch ziehe ich es vor sie dann klein zu schreiben, wenn es sich um Worte aus dem Sprachschatz der Programmierumgebung handelt um sich nichts Falsches anzugewöhnen. Manche Programmiersprachen unterscheiden nämlich zwischen xyz und Xyz, wodurch schwer zu entdeckende Syntaxfehler entstehen.

1. Die Grundidee

1.1 Architektur

Ein LiveCode ist die elektronische Abbildung eines Karteikartenstapels, dessen einzelne Karten gestaltet sind und auch multimediale, sowie interaktive Elemente enthalten können. Der Arbeitsablauf ist top-down. Man beginnt mit einem UI (Fenster, Paletten...), bringt die Objekte des Interfaces an und kodiert schlussendlich das Verhalten der Applikation. LC enthält 23 gestaltbare Interface-Objekte, wie Buttons, Textfelder, Menüs, Datenraster, Bitmap- und Vektor Grafiken sowie Multimediaplayer. Man muss diese Objekte lediglich aus der Werkzeugpalette auf die Karte ziehen. Die Eigenschaften eines Objekts kann man festlegen, indem man darauf doppelklickt.

To create objects, simply drag them out from the Tools palette. To edit them, choose the pointer tool in the top right of the Tools palette and double click them to edit their properties.

Zunächst muss man ein Stack (einen Kartenstapel) erzeugen, wobei das erste erzeugte Stack das sogenannte Mainstack ist. Es öffnet sich mit einem Fenster. Jedes Fenster, egal ob es zu einem Window gehört, zu einer Palette, oder zu einer Dialogbox ist in LC ein Stack (ein Stapel). Jedes Stack enthält eine oder mehrere Cards (Karten). Sie zeigen die verschiedenen Bilder und Informationen an. Controller wie Buttons, Checkboxes etc. werden auf Karten gezogen. Durch Gruppieren von Controllers kann man sie für mehrere Karten verfügbar machen. Backgroundbilder können einem Stack ein einheitliches Bild verleihen.

Mehrere Stacks können zu einem Stack File zusammengefasst werden, wobei die Stacks in Abhängigkeiten voneinander gesteuert werden können. Das erste exekutierende Stack ist das Mainstack. Es kann weitere Substacks enthalten, die entsprechend erzeugt worden sind. Hierbei kann es sich auch um Dialogboxen oder Paletten handeln. Sichert man ein Stack eines Stack Files, so werden gleichzeitig alle Stacks gesichert. Events, die von einem Substack nicht verarbeitet worden sind, gehen hinauf zum Mainstack und die Farb- und Fonteigenschaften des Mainstacks werden hinunter auf die Substacks vererbt. Der Message Path wird folgendermaßen dargestellt [1]:

Message Path in LiveCode

Um im Message Path einen Background als solchen zu definieren, muss seine backgroundBehavior property in einem Skript auf true gesetzt werden oder man tickt die "Behave as Background" Check Box.

LC erlaubt die Verwendung verschiedenster Medien, wobei diese über den in LC enthaltenen Player, oder über QT, oder über einen 3rd-Party Player abgespielt werden können, wobei QT einen größeren Bereich an Medien abdeckt, als der originäre Player des Programms. Der interne Player kann eingebettete Medien abspielen, der QT-Player nur externe, wobei man sie auch streamen kann. Für Bilder empfiehlt es sich, die Originale alle auf ein einziges Stack hochzuladen (einer Art Bildgalerie) und sie dann nach Bedarf zu referenzieren. Auf der anderen Seite kann man Teile der Anwendung auf einem Server liegen haben und erst bei Bedarf mit einem URL-Befehl abrufen. Das Selbe gilt für Datenbanken, wenn es möglich sein soll, dass sie von mehreren Benutzern zugleich verwendet werden.

Der gesamte adressierbare Speicher beträgt auf 32-bit Systemen 4GB.

1.2 Allgemeine Sprachaspekte

Die Programmiersprache von LC ähnelt sehr den älteren Versionen von Macromedia Directors Lingo und Apples einstmaligem HyperCard.

Kommentarzeilen werden mit # eingeleitet. z.B.: # Das ist ein Kommentar. Es funktioniert aber auch das aus Lingo bekannte Voransetzen von 2 Bindestrichen
-- Das ist ein Kommentar
Ein Zeilenumbruch wird mit \ dargestellt. z.B.:
put listFiles((pFolder & slash & tFolder), pRecurse) into \
tCurrentFiles

2. Installieren und IDE

Eine erworbene Lizenz für LC ermöglicht es, auf der Heimseite unter My account eine Übersicht aller erworbenen Produkte zu sehen. Sie können dort heruntergeladen werden und LC kann beim Start automatisch autorisiert werden. Für Produkte von Drittherstellern geben diese einen Aktivierungscode (Seriennummer) an. Acht geben muss man, wenn man 2 oder mehr Produkte nacheinander kauft ohne das 2. als Addon des ersten zu kaufen. Dann hat man nämlich 2 verschiedene Lizenzen, die jeweils nur das eine können (z.B. entweder Mac/Win Standalone Apps zu machen oder nur iOS Apps). Man muss dann jedes Mal, wenn man die andere Option verwenden will LC entlizensieren (Help>Re-license LiveCode) und neu starten. Beim Neustart schaltet man dann auf manuelle Lizensierung und verweist auf die jeweilige für die entsprechende Version in Frage kommende Lizenzdatei. Diese Datei kann man als .lic File auf der Accountseite runterladen:

Die Arbeitsumgebung des Programms sieht etwa folgendermaßen aus. Für den hier nicht dargestellte Application Browser gibt es ein eigenes Kapitel.

LiveCode IDE

Aus der horizontalen Menüleiste links oben kann man einen kontextspezifischen Inspector aufrufen, ein Programmierfenster (Code Window) und eine Message Box. Letztere ermöglicht es, während der Ausführung des Stackablaufs Dinge auszulesen, und auch in Art eines Command Line Tools Befehle einzugeben. Am oberen Rand der Tools-Palette befinden sich zwei Buttons zum Umschalten zwischen Run- und Editumgebung. In der Editumgebung wird programmiert und im Runmode lässt man die App laufen.

 

3. Das Userinterface (UI)

Eine ausführliche Beschreibung der verschiedenen Interfaceelemente findet man in Kap.4 des Userguides.

3.1 Das Tools-Fenster

Das Wichtigste zum Verständnis des Programmablaufs sind die beiden Pfeile im Tools-Fenster. Klickt man den rechten der beiden Pfeile an, so befindet man sich im Edit-Modus. In diesem Zustand kann man das Projekt programmieren, Ressourcen einsetzen und entfernen usw.

Will man sehen wie das Programm abläuft, so klickt man in den linken der beiden Pfeile und befindet sich dann im sogenannten Run-Modus.

 

4. Pfade und Dateien

4.1 Pfade

Bei Angaben von Dateinamen darf kein Zwischenraum enthalten sein, oder man muss die Bezeichnung unter Anführungszeichen stellen. also

play audioclip Der_Ton.aif
oder
play audioclip "Der Ton.aif"

4.2 Dateien ein- und auslesen

 

5. Stacks, Cards und Controls

Das erste Element, das in LC erzeugt wird, ist ein neues Stack (Mainstack) und seine untrennbar mit ihm verbundene 1. Karte. Seine Eigenschaften werden im durch Object>Stack Inspector aufgerufenen Stack Inspector angezeigt. Dort kann man im Pop-up Menü unter anderem zuerst einmal Size & Position festlegen. Würde man für ein iPad 2 im Querformat programmieren, dann wäre das Breite: 1024px, Höhe: 768px, für das Nachfolgemodell 2048 x 1536 px (bei 264 ppi). Mit View>Rulers werden lineale an den Seiten sichtbar. Im Stack Inspector (SI) gibt es unter Basic Properties ein Feld Controls. Mit seiner Hilfe kann man die Eigenschaften des Title Bars einstellen, die aber  erst dann wirksam werden, wenn man das Stack geschlossen und erneut geöffnet hat. Bei einer iPad-Programmierung wird man z. B. den letzten Menüpunkt Empty wählen.

Dem Stack kann man durch Object>New Card weitere Karten hinzufügen. Um zu einer bestimmten Karte zu navigieren, klickt man im Inspector auf das rechts oben befindliche Dreieck und geht weiter mit inspect > card > card ID xxxx. Vor- und zurückblättern kann man mit View > Go xxxxx.

5.1 Der Application Browser (AB)

Die Architektur eines Programms ist im Application Browser abgebildet. Mit Tools>Application Browser erhält man ein Fenster in dem alle geöffneten Stacks und die darin befindlichen Cards, sowie die auf den Karten vorhandenen Elemente zu sehen sind.

Der Application Browser hat viele sehr nützliche Funktionen. Die linke Seite zeigt alle offenen Stacks und Substacks an. Doppelklick auf ein Stack oder eine Karte zeigt dieses Objekt an. Doppelklick auf Sound oder Video spielt dieses Objekt ab. Die Zahlen in der Kolonne Num gibt die Objektnummer an. Spalten, die in der Kopfzeile das Skriptsymbol enthalten, geben die Anzahl Skriptzeilen für diese Karte, dieses Stack, diesen Button usw. Ein Klick auf eine Spalte sortiert diese aufsteigend. Ein Rechtsklick auf den Spaltenkopf erlaubt es zusätzliche Merkmale einzufügen. Rechtsklick auf ein Stack, eine Karte oder einen Layer (rechte Spalte) öffnet ein kontextsensitives Objektmenü, in dem besonders die Option refresh für Layerobjekte interessant ist. Nähere Erklärungen dazu siehe S.56f in [1]. alt-Doppelklick öffnet den PI, sofern er nicht ohnehin schon offen ist. cmd-Doppelklick auf ein Stack, eine Karte oder einen Layer öffnet das Skriptfenster, was man auch über Rechtsklick>edit Script machen kann. Mit cmd-click auf verschiedene Layerobjekte kann man diese kumulierend anwählen. Man kann ein Objekt der rechten oder auch der linken Spalte dadurch anwählen, dass man seinen Namen eintippt. Die Lupe im Right Header Bar ermöglicht es, temporär Objekte auf einer Karte auszublenden.

Wenn man im Menü LiveCode->Einstellungen->General die Checkbox LiveCode UI elements appear in lists of stacks gewählt hat, so sieht man zusätzlich zu den eigenen auch alle Stacks des Frameworks.

5.2 Ein neues Stack aufsetzen

Erzeugt man ein neues Main Stack, so öffnet es in einer gewissen Größe. Diese Größe, ebenso wie seine Position auf dem Schirm, kann man im SI unter Size & Position festlegen. Außerdem könnte man auch ein Skript der Art

on preOpenStack
    local tRectangle
    put the windowBoundingRect into tRectangle
    put 200 into item 1 of tRectangle
    put 200 into item 2 of tRectangle
    put item 1 of tRectangle + 1024 into item 3 of tRectangle
    put item 2 of tRectangle + 768 into item 4 of tRectangle
    set the rectangle of me to tRectangle
end preOpenStack

verwenden, um zum Beispiel das Fenster immer mit dem linken oberen Eckpunkt auf 200,200 und in der Größe 1024 x 768 öffnen zu lassen.

Erzeugt man ein Substack (File>New Substack of <Name des Mainstacks>), so ist das Substack (sind die Substacks) children des Mainstacks und erben seine Eigenschaften. Umgekehrt werden auch Messages, die von Substack nicht verarbeitet werden, an das Mainstack weiter gereicht, sodass man Code, der von mehreren Substacks gebraucht wird am besten in das Mainstack steckt. Typische Anwendungsbereiche für Substacks sind zum Beispiel das Zusammenfassen aller möglichen Dialogboxen oder der Werkzeugpaletten eines Programms in einem eigenen Stack.

Der Titel des Stacks ist die Bezeichnung, die auch in der Titelleiste des Applikationsfensters aufscheint. Skripts beziehen sich immer auf den Namen (die Nameneigenschaft) des Fensters. Beide kann man im SI nachschauen.

5.3 Cards

Die Eigenschaften von Karten sind im CI ersichtlich. Ihre Reihenfolge innerhalb des Stacks lässt sich durch ändern der Nummer (oder gleichbedeutend der Layereigenschaft) vertauschen. Dabei kann eine Nummer nicht größer sein als die Zahl der vorhandenen Karten in einm Stack. Die untrennbar mit der Karte verbundene Identifikation ist ihre ID. Das Fortschreiten (go next, go previous) erfolgt aber anhand der Nummer der Karten.

5.4 Controls

Controls werden aus der Tools-Palette auf die Karte gezogen.

 

6. Elementare Arbeitsprozesse

6.1 Ein Bild einfügen

Unterstützt werden zahlreiche Bildformate wie GIF, JPEG, PNG, BMP, XWD, XBM, XPM, oder PBM, PGM, oder PPM files. Am Mac OS kann man zwar auch PICT Dateien verwenden, die aber auf Unix oder Windows Systemen nicht dargestellt werden. Am besten ist es ein .png zu verwenden, aber auch .jpg ist gut geeignet. Für die Anwendung auf Computerbildschirmen braucht die Auflösung nicht größer zu sein als eine übliche Bildschirmauflösung, also 72 resp. 96 dpi. Bei iOS-Anwendungen, muss man sich nach den respektiven Auflösungen des iPhone, iPods oder iPads richten. Das Bild wird mittels File>Import as Control>Image File... importiert. Anschließend kann man im Inspector diverse Einstellungen vornehmen. WarnlichtHat man die Einstellungen vorgenommen, so ist es wichtig diese zu fixieren, sonst wird beim Übergang auf eine andere Karte der ursprüngliche Zustand des Bildes wiederhergestellt. Dazu geht man im Pop-up Menü des Inspectors auf Size & Position und checkt Lock size and position. Mit Object>Move kann man die Ebenen mehrerer, einander überlappender Bilder einstellen [2]. Will man das Bild als Hintergrund einer Karte, so kann man seine Helligkeit im Inspector mit dem Popup Blending einstellen.

Um eine Bilddatei zu referenzieren geht man auf File -> New Referenced Control -> Image file. Paint tools kann man nur auf Bilder anwenden, die als control importiert wurden.

6.2 Buttons

Man kann die üblichen Buttons aus dem Tools-Fenster auf die Karte ziehen. Es gibt zwar einen Push-Button und einen Default-Button, die beiden sind jedoch das Gleiche und unterscheiden sich lediglich in den voreingestellten Basic Properties im PI. Stellt man den Blend Level eines Buttons auf 100, so wird er total transparent, funktioniert aber noch immer als Button. Zusätzlich kann man noch show border abwählen. Auf diese Art und Weise kann man mehrere Hotspots auf einem Bild erzeugen.

Will man einen Button zum Navigieren verwenden, so wählt man ihn aus und öffnet anschließend das Code-Fenster. Dort kann man ein Mouseevent schreiben und mit go to the next oder the previous card verbinden. Will man zu einer bestimmten Karte springen, so gibt man ihre id an, die man dem AB entnehmen kann. z.B.: go to card id 1025

Meldungen an den Benutzer kann man mit answer schicken:

answer hat vielfältige Gestaltungsmöglichkeiten. In iOS ist das Äusserste, was man machen kann die Form answer "msg" [ with "button1" and "button2" ...] [titlted "Fensterüberschrift"]. Auch sieht die Darstellung des Fensters anders aus:

Der letzte Button in der Reihe ist immer der Default.

 

6.3 Text

obwohl es im Toolfenster ene Anzahl von möglichen Textfeldern gibt, so sind diese ineinander überführbar, also letztlich ein und das selbe Objekt.

6.3.1 Erzeugen von Text

Will man Text auf eine Karte bekommen, so zieht man einen Label auf sie. Der PI liefert die Möglichkeit Text einzugeben (Popup-Menü Contents), sowie die Gestaltung der Inhalte. Beachte, dass der Umbruch im Contentfeld des PI, symbolisiert durch den gekrümmten Pfeil nichts mit dem Umbruch im Label zu tun hat. Dieser wird unabhängig davon in den Basic Properties des PI mit der Checkbox Don't wrap gesteuert.

Während eines Resize des Labelfeldes sieht man seinen Zeilenabstand. Dieser kann im Menü Text>Size... umgestellt werden. Der größtmögliche Zeilenabstand beträgt 48. Mit Text>Size>Other... kann man andere, als die vorgegebenen Werte, aber nicht größere als 48 eingeben. Dementsprechend kann auch kein in LC erzeugter Text größer als 48 sein.

Braucht man eine Tabelle, so zieht man ein basic Table Field auf die .Karte. Wieder wird im PI>Contents der Inhalt eingegeben. Will man zur nächsten Spalte rechts springen, so gibt man einen TAB-Befehl. Die neue Zeile der Tabelle erreicht man durch ein CR im Content Feld.

Zur Erstellung von Listen gäbe es ein PlugIn ListMagic 1.1.4 aus 2008, das die Listenerstellung sehr vereinfachen könnte, jedoch wird die Trial-Version auf MacOS 10.6.2 auch nach dem Kauf einer Lizenz nicht freigeschaltet, was die Software unbrauchbar macht.


6.3.2 Sichern und Laden

Textfelder sichern und/oder laden


6.4 Zeichnen

Es gibt zwei Werkzeugbereiche mit denen man direkt auf eine Karte zeichnen kann:

6.5 Navigation

6.5.1 Oberste Karte

Erstens ist es einmal wichtig, dass beim Öffnen des Stacks die richtige Karte obenauf liegt. Das geht am einfachsten mit

on preOpenStack
go to card id <xxxx>
end preOpenStack

wobei für <xxxx> der 4-stellige id-Code der betreffenden Karte einzusetzen ist.

Allerdings kann man auch noch nachträglich die Reihenfolge, in der die Karten auf einen go next-Befehl reagieren, verändern. Man muss dazu im CI entweder die Nummer oder die Layereigenschaft verändern.Beide sind miteinander verbunden. Je niedriger die Zahl, desto früher erscheint die Karte beim Vorwärtsblättern.

6.5.2 Weiterblättern, springen

Zunächst benötigt man eine Grafik die, wenn geklickt, auf eine andere Karte weiter leitet. So etwas kann man z.B. aus den Symbolen von AI bekommen. . Nun kann man entweder einen Button mit einem Bildschirm isolieren, Kopieren und auf einer Karte einfügen, oder man sichert das isolierte AI-Bild, wenn man eine höhere als die Bildschirmauflösung benötigt. Ist der Hintergrund der Stackkarte nicht weiß, so muss man einen allenfalls vorhandenen weißen Rand um das Bild verschwinden lassen. Das gelingt dadurch, dass man im PI der Grafik den Blending Modus auf transparent setzt. Bei dem oben gezeigten Beispiel ist das allerdings nicht perfekt, da das Bild selbst auch weiße Stellen besitzt, die dadurch Durchsichtig werden. Man kann nun entweder diesen Bereich im Ausgangsbild leicht grau einfärben und das Bild noch einmal importieren oder einen anderen Blending Modus verwenden, bei dem das nichts ausmacht, wie z.B. blendMultiply. (Blend wirkt nicht auf Bilder im PICT-Format).

Um dem Button Funktionalität zu verleihen, wird er angewählt und ein Skript geschrieben:

on mouseup
go to card id 1002
end mouseup

Wenn der Button einfach auf die nächste Karte führen soll, heißt der entsprechende Befehl

go to next card

entsprechend das Attribut previous, wenn die vorherige Karte angesteuert werden soll. Gelegentlich kann zur Verwendung eines allgemeinen Begriffs wie next und previous ein vorheriges Umordnen der Karten nötig sein. Solche allgemeinen Buttons wird man unter Umständen auf eine Backgroundkarte (§) setzen.

User Guide: You can also group controls together if you want them to operate as a set. For example, if you
have a set of navigation buttons that go from card to card in your stack, you can make them into
a single group. Groups can appear on more than one card, so your navigation buttons or
background image can appear on each card of your stack. For more details, see the section on
Group and Backgrounds.

Soll der Button noch einen Downstate erhalten, also ein Hilite wenn man klickt, braucht man ein zweites Bild oder man ändert den Blending Modus.

on mousedown
set the blendLevel of image id 1028 to 50
end mousedown

on mouseup
go to card id 1002
set the blendLevel of image id 1028 to 0
end mouseup

Zur Sicherheit muss man noch ein Skript hinzufügen, denn wenn der User zwar auf den Button klickt (mousedown) es sich aber dann doch anders überlegt und mit gedrücktem Mausknopf aus dem Bild herausfährt, so soll ja der ursprüngliche Blendmodus wieder hergestellt werden.

on mouseleave
set the blendLevel of image id 1028 to 0
end mouseleave

Der Effekt des Mouseleave-Handlers tritt aber erst nach Loslassen des Mausknopfs ein.

7. Sound

Eine gelungene Einstimmung in diese Thematik kann man an Hand der iBand der North Point Community Church in Atlanta, Georgia, USA, sehen.

Der einfachste Sound ist der Systemwarnsound. Er hilft oft bei der Kontrolle eines Stacks, indem man an Prüfstellen den Befehl beep mit n-facher Wiederholung einfügt (n=1,2,...)

on handler
   ...
   beep 3
   ...
end handler

7.1 Audioclip

Sound kann importiert oder verlinkt sein. Importiert man einen Sound, so residiert er im Stack und nimmt entsprechend Platz weg. Dafür wird er sofort mit dem Stack geladen und ist jederzeit griffbereit. Einen solchen importierten Sound nennt man einen audio clip. Die Sounddateien sollten in der Form von .aif oder .aiff vorliegen. Es funktionieren auch .wav und .au, hingegen können keine .mp3 verwendet werden. Eine unvergleichlich größere Zahl von Audioformaten kann man mit dem Player abspielen

Man wählt die Karte aus, auf die importiert werden soll und importiert wie üblich über File>Import as Control>Audio File... Anschließend zieht man einen Button auf die Karte definiert im PI seine Attribute und klickt das Codewerkzeug an. Anschließend kann man ein Skript an den Button hängen etwa folgender Art:

on mouseUp
-- play audioclip MeinSound.aiff
end mouseUp

Wenn ein Audioclip spielt, wird ein temporärer Player erzeugt. Wenn der Clip zu spielen beginnt wird eine playStarted message an ihn gesendet.
Ich habe erlebt, dass eine .aiff Datei, die ich von einer CD runtergezogen hatte nicht richtig abspielte, sondern nur rauschte. Nach dem Öffnen der Sounddatei in Audacity und sichern als .aiff war diese Datei dann abspielbar. Den Grund für dieses Verhalten kenne ich noch nicht, vermute aber, dass die Datei von der CD irgend ein störendes Merkmal besaß, das durch das Öffnen und Exportieren im Audioprogramm automatisch beseitigt worden war. Obwohl es sich in beiden Situationen um .aiff Dateien handelte, ist .aiff nicht gleich .aiff.


will man den Sound stoppen:

play stop für Desktopsysteme, für iOS lautet der Befehl: play empty

Ein Befehl zum Abspielen eines Audioclips stoppt einen bereits spielenden Sound und die Karte erhält eine playStopped message. Es ist außerdem nicht möglich Sounds zu queuen. Will man checken ob ein Sound spielt oder nicht, so kann man die sound Funktion nutzen:

if the sound is done then
   ...
else
   play stop
oder play empty für iOS
end if

Will man die Lautstärke für einen Audioclip <name> einstellen, so geschieht das zwischen den Werten 0 bis 100, z.B. für den Wert <wert> mit

set the play Loudness of audioclip <name> to <wert>

7.2 Der Player

Der Player ist eigentlich ein Werkzeug, das für "Höheres" bestimmt ist als nur für Ton. Mit ihm kann man bis zum QTVR verschiedenste Videoformate abspielen. Natürlich ist eine Untermenge dabeon der Ton. Der Player importiert den Sound nicht, sondern spielt eine separate Sounddatei ab. Das schont den Speicher, weil die Datei nur während des Gebrauchs dort residiert. Natürlich müssen verlinkte Dateien immer mit dem Projekt mitgeliefert werden. Der Player wird der Werkzeugpalette entnommen und befindet sich entweder in einer Karte, einer Gruppe oder in einem Background [1, Kap. 13.3.1 in der Version vom Jänner 2011].

start player "Gong" Dabei ist Gong die filename property des Players

Während durch den Start-Befehl der Player erzeugt wird, wird eine newPlayer message geschickt, die mit einem on newPlayer Skript verwendet werden kann.


hide player (the selectedText of button "Current Movie")
delete player

Die mit einem Player assoziierten properties und messages findet man im LiveCode Dictionary unter Object>Player.

Ändert man den Filenamen eines Players, so wird nicht seine Timeproperty verändert. Man muss also nötigenfalls die currentTime wieder auf 0 zurücksetzen, damit der nächste Sound von vorne beginnt

Mittels der Properties the duration und the timescale kann man die Dauer eines Players in Sekunden bestimmen. Beide Eigenschaften sind read-only:

put (the duration of me/the timeScale of me) into SpieldauerInSekunden

the duration eines Players ist eine Integer, die die Anzahl von Intervallen des Sounds oder Movies im player angibt, the timescale gibt die Anzahl der Intervalle pro Sekunde.

Weitere Eigenschaften sind

Der Befehl set the playrate of player <n> to <m> mit -1<m<+1

ändert die Spielgeschwindigkeit des Players mit der Zahl n auf die Geschwindigkeit m, wobei +1 die Normalgeschwindigkeit ist und -1 ein Rückwärtsspielen bedeutet.


Mit der playSelection property auf true, spielt der play Befehl nur den Bereich zwischen gesetzter startTime und endTime. Zu einem gegebenen Zeitpunkt steht der Player bei currentTime.


Mit der callbacks Eigenschaft eines Players kann man zu bestimmten Zeitpunkten eines Player-Ablaufs callback messages schicken um Ereignisse mit dem Abspielen zu synchronisieren (z.B. das Umblättern eines Notenblatts an der entsprechenden Stelle in der Musik).

set the callbacks of player "Do It!" to "2500,soundNotes"

The callbacks eines Players kann auch eine ganze Liste von callbacks sein, einer pro Zeile. Jeder callback besteht aus einer Intervallzahl und getrennt davon durch einen Beistrich ein message Name.

set the callbacks of playesr "Mist" to myCallbacks

Eine Anleitung zur Darstellung von Sound am iPhone kommt später.

8.Video

Ongoing discussion

9. Programmierung

Die Programmierung erfolgt im Code Editor. Er wird kontextspezifisch geöffnet, wenn man ein Objekt rechtsklickt und Edit Script wählt. Beim Schreiben kann es vorkommen, dass die Einrückungen des Textes ganz wirr sind. Das lässt sich ganz einfach beheben, indem man die TAB-Taste drückt.

9.1 Variablen

9.1.1 Scope

Wie auch im sonstigen Programmierleben gibt es lokale und globale Variable. Globale Variable können irgendwo in einem Skript angegeben werden. Persönlich finde ich es sinnvoll, das oberhalb des ersten Handlers in einem Skript zu tun, weil sie dann ohne eine weitere Deklaration für jeden Handler dieses und weiterer Skripts (auch in Substacks) gültig ist. Zum Beispiel:

global gREVStackName
    
on preOpenStack
    put empty into gREVStackName
end preOpenStack

Die Deklaration könnte aber auch innerhalb des Skripts vor der ersten Verwendung der Variablen erfolgen. Dann muss die globale Variable in jedem Handler, in dem sie verwendet werden soll, erneut als globale deklariert sein, sonst wird sie als lokale Variable betrachtet und kennt den ursprünglich zugeteilten Wert nicht mehr. Auch in diesem Fall erstreckt sich der Gültigkeitsbereich der Variaben auf alle Skripts in diesem Stack und den Substacks.

Für lokale Variable gilt folgendes: Innerhalb eines Handlers muss man sie nicht extra deklarieren. Sie entstehen, wenn man sie belegt - außer man hat (bei angewähltem Scriptfenster) Edit > Variable Checking gecheckt. Dann muss jede verwendete lokale Variable in der Form local xyz vor der ersten Verwendung von xyz deklariert werden. Das hat aber lediglich den Vorteil, dass man bei einem Schreibfehler im Variablennamen auf den Fehler durch einen Kompilierungsabbruch aufmerksam gemacht wird.

Ein Mittelding zwischen globaler und lokaler Variablen ist die script local variable. Sie verhält sich wie eine globale Variable, die aber nur für das Skript des einen Objekts Gültigkeit hat. Auch wenn man die Karte verlässt und wieder zurück kommt, ist der Wert der script local Variablen erhalten. Sie ist aber in anderen Skripts nicht deklariert.

9.1.2 Type und Deklaration

Lokale Variable müssen nicht deklariert werden, wenn Edit > Variable Checking nicht gecheckt ist. Auch die Type wird in LC nicht angegeben und es findet bei Bedarf eine automatische Umwandlung statt. Allerdings gibt es seltene Fälle in denen das auch versagen kann und zum Beispiel ein Blank nicht in eine Null umgewandelt wird (siehe Beispiel. Der String 3 & space wird erst umgewandelt, wenn eine arithmetische Operation stattfindet. Um im konkreten Fall das Problem zu umgehen, sollte man Word 2 of line 3 verwenden)

Stringvariable bestehen aus einem Zeichen oder einer Zeichenkette und werden in Anführungszeichen eingeschlossen, z.B. "Robert Wolff, 22.12.2010". Aus diesen könne Chunks ausgelesen werden wie word 2 (ergibt "Wolff,") oder char 3 (ergibt "b"). Bei mehrzeiligen Feldern kann mn auch line auslesen.

9.2 Mausbezogene Angaben

the mouseLoc #Mauskoordinate
the clickLoc (clickH, clickV) #gibt an wohin zuletzt geklickt worden war

the clickLine oder clickLine() #gibt die Nummer der Zeile eines Feldes an, auf die zuletzt geklickt worden war. Die Form ist: line 3 of field 2. Dazu muss aber der Text gesperrt sein (Lock Text im PI gecheckt), weil ja sonst eher ein Editieren des Textes durch den Benutzer erwartet wird.

9.3 Cursorformen

set the cursor to watch

10. Funktionalität

10.1 Timing Events

send "mouseUp" to me in 10 seconds

10.2 Kontakt nach außen

Es ist möglich Kontakt zu URLs herzustellen und Daten auszutauschen.

11. Animation

 

12. iOS

iOS ist seit der Version 4.5.2 von LC als Veröffentlichungsbasis integriert (in 4.5.1 war es noch ein Plugin). Diese Option muss allerdings zu LC zusätzlich erworben werden. Achtung: Wenn man ein Stack für iOS baut, kann es nicht mehr für andere Plattformen verwendet werden. Da das aber nur für das MainStack gilt, kann man ein Frontstack für iOS machen und alles Weitere in Substacks stecken, die dann sehr woll auch auf anderen Plattformen verwendet werden können.

Es gibt zwei Arten für iOS zu entwickeln, nämlich für einen iOS Simulator oder für einen physischen Device. Es ist einfacher (und beim ersten Projekt auch billiger) die App zunächst für den iPhone Simulator (der bietet natürlich auch die Umgebung für iPod touch und iPad) zu entwickeln. Dazu müssen 4 Punkte berücksichtigt werden:
1) Man muss die LiveCode iOS - Lizenz besitzen und in Development>Simulator Version einstellen welche Version des Simulators das Apple SDK verwenden soll.
2) In LC sind die richtigen Settings vorzunehmen: In File>Standalone Application Settings... muss in der obersten Reihe iOS ausgewählt werden; Build for iOS ist zu checken; und unter supported devices (rechts oben im Fenster) ist der Targetdevice zu wählen. Minimum iOS Version gibt an wie weit abwärtskompatibel das Produkt sein soll.

Auch viele andere Optionen werden in diesem Fenster angegeben. Darunter auch in der obersten Zeile der Button Copy Files. önnen weitere Files zum Projekt hinzugefügt werden, die zu dem Bundle gehören. Dabei kann es sich auch um weitere Stacks handeln. Der Name des Bundles kann in General eingestellt werden.
3) Muss LC das SDK (die SDKs) finden. Dazu stellt man den Pfad in LiveCode>Einstellungen...>Mobile Support ein.
Schlussendlich muss man 4), will man ein Stack an den iPhonesimulator schicken, in der Werkzeugleiste von LC ganz rechts Simulate anklicken.

Bleibt der Simlate-Button grau, so hat LC keine SDKs gesehen (meist ein Pfadfehler - siehe den vorigen Punkt 3).

Die andere Möglichkeit besteht darin, für ein vorhandenes iPhone/iPad zu entwickeln. Punkt 1 und 2 sind gleich so wie oben, allerdings kommt bei 2) dazu, dass man im Fenster der Application Settings ein Profil wählen muss. Solch ein Profil erhält man von Apple für einen physischen Device, wenn man im Developerprogramm angemeldet ist (Kostenpunkt 12/2010 USD99/Jahr). Als registered iOS developer bei Apple kann man nur den Simulator verwenden. Erst wenn man das iOS Developer Programme inskribiert hat, kann man mit File>Save as Standalone Application... eine eigene Datei auf dem Gerät testen. Auf dem zum Testen verwendeten Geräte muss ein iPhone Developer Certificate installiert werden. Es ist die digitale Unterschrift für die entwickelte App, damit sie auf der Testmaschine laufen kann. Die Anweisungen dazu findet man am Certficates Reiter des iPhone Developer Program Portal. In diesem Portal muss zumindest 1 iOS Device registriert sein. (Hinzufügen über den Devices Reiter). Auf dem App ID Reiter des Portals muss man außerdem eine App ID für die App anlegen. Man kann die selbe ID  verwenden u, verschiedene Programme zu entwickeln und zu testen. Letztlich werden im Provisioning Reiter des Portals die ID des Testdevices, die App ID und das Certificte zusammengeführt. Die daraus resultierende Provisioning Datei taucht dann im Profile drop-down Menü der Application Settings auf. Als nächstes muss das Bundle für den Testdevice gesetzt werden. Dazu öffnet man XCode und wählt Window>Organizer. Hat man sein Testgerät am Computer angeschlossen, so erscheint dieses in der linken Spalte. Dann kann man schließlich das application bundle vom Schreibtisch in die Applications Liste ziehen und auf dem Device laufen lassen. Aufpassen, dass die IDE Versionsnummern zusammenpassen, sonst erscheint eine Meldung "standalone origin mismatch" auf der Console des XCode Organizers [6].

Schließlich ist es noch wichtig

Icons für iPad müssen 72x72px sein, für non-Retina iPods und iPhones 57x57px und für Retinageräte 114x114px

Für Apples Richtlinien siehe diverse Dokumente von Apple, wie z.B. [7]. Eine fertige App kann je nach benutztem distribution profile als Ad-Hoc oder als App Store Anwendung  verwendet werden.

Ganz wichtig ist es zu beachten, dass das Filesystem von Apples iOS case sensitive ist!

12.1 Aufsetzen der Datei

12.1.1 Splash Screens

Es gibt dabei einen Unterschied zwischen educational und commercial Versionen: Die kommerzielle Version erlaubt ein statisches Bilder, das soll lange steht bis das Projekt geladen ist. Wie immer für iOS muss es sich dabe um ein .png handeln mit den Dimensionen des jeweiligen Bildschirms. Bei der educational und der personal Version von LC wird für 5 Sekunden ein LC-eigener Schirm angezeigt, der angibt, dass diese App nicht für die kommerzielle Verwendung lizensiert ist. Innerhalb dieses Schirms kann man ein eigenes Bild einfügen, am besten mit einer Auflösung von 600 x 600 px.

12.1.2 Orientierung

Die App erhält eine orientationChanged Nachricht, wenn das Gerät eine Positionsänderung relativ zum Boden entdeckt. Die jeweils gefundene Orientierung wird in der iphoneDeviceOrientation() Funktion vermittelt. Will man verhindern, dass das Bild rotiert, so schreibt man einen iphoneLockOrientation Befehl in den on openStack Code. Mögliche Orientierungen sind:

unknown
portrait
portrait upside down
landscape left
landscape right
face up
face down

Um die Orientierung des UI zu ändern verwendet man iphoneRotateInterface Ausrichtung, wobei Ausrichtung die Werte portrait, portrait upside down, landscape left und landscape right annehmen kann. Wollte man die Interfaceorientierung nach einer Rotation anpassen, schriebe man:

on orientationChanged
     iphoneRotateInterface     iphoneDeviceOrientation()
end orientationChanged

12.1.3 Auflösung

§iOS pre release handbook S.12

12.2 Buttons in iOS

here are the links to the current version of the buttons for the iPhone stack. Please watch out for linebreaks

enjoy the revlet (you can actually select a button or an image with the select button and copy from the revlet to your stack)

Übersichtsseite

Code

paste into your message box:

go stack url "http://www.berndniggemann.on-rev.com/btnsiphone/ButtonsiPhone_0.1.9.livecode"

Danke Bernd

Das iPad oder iPhone kennt keine Maus. Alle Userinteraktionen laufen über Touchevents. Mouseup, Mauseloc etc. sind ebenfalls bestimmt durch die Berührung. Berührungen beginnen mit einem touchStart, gefolgt von einem oder mehreren touchMove Messages und enden mit einem touchEnd oder, wenn die Berührung unterbrochen wurde, zum Beispiel am iPhone von einem ankommenden Telefonat, mit einem touchRelease. Alle diese Messages besitzen eine unikale id, wodurch es möglich ist Multitouchereignisse wahr zu nehmen.

12.3 Bewegung

Wenn ein Schütteln erfolgt, so wird die momentane Karte des Stacks ein motionStart erhalten, am Ende ein motionEnd und wenn ein Anruf unterbricht ein motionRelease.

Will man den internen Beschleunigungsmesser verwenden, so kann man ihn mit iPhoneEnableAccelerometer [Intervall in Sek] in Gang setzen und mit iPhoneDisableAccelerometer wieder ausschalten. accelerationChanged liefert die Werte x,y,z,t wobei x,y,z die Beschleunigung in der jeweiligen Achsenrichtung angibt und t die Zeit seit der letzten Messung in Sekunden.

12.4 Photo Picking

Man kann den Photo Picker des iPhones mit iPhonePickPhoto quelle, [maxbreite, [maxhöhe]]  aufrufen.

12.5 Sound im iOS

Einen testsound.mp3 oder .aif kann man mit Hilfe folgender Methode abspielen. Nehmen wir an, die Aufnahme läge in einem Ordner "Tonbeispiele" in dem selben Ordner in dem sich das LC-Projekt befindet. Dann muss dieser Ordner als Projektressource hinzugefügt werden. Das geschieht in File>Standalone Application Settings... im Reiter Copy Files und dann Add Folder (und wenn es sich um lose Dateien handelt: Add File).

Um anschließend die Verbindung zu dem File herzustellen, sollte der absolute Pfad verwendet werden, weil LC anscheinend keinen "defaultfolder" setzt [5]

put the effective filename of this stack into tFilename
set itemdel to "/"
put "testsound.mp3" into item -1 of tFilename
play tFilename

Beachte, dass in iOS der Befehl zum stoppen eines Sounds play empty lautet.

Verschiedene Einzelbeispiele sind hier gesammelt, eine spezielle Anleitung für Sound am iPhone findet man in [3]. (Stand 11/2010).

12.6 Bounciness

Eine typische Qualität auf iPhone und iPad ist die Elastizität, mit der Objekte oder Felder bewegt werden. Ein Beispiel für eine solche Programmierung ist das Programm Finger [9].

12.7 3rd-Party Angebote

12.7.1 MobGUI

"MobGUI is a plugin for LiveCode aimed at rapid mobile app development. With a growing set of custom contols to drag on to your projects, including native iOS controls (browser, movie player, scroller, text field), you can quickly turn ideas into prototypes and fully functioning apps."

13. Testumgebung

Im Menü Development sind Testwerkzeuge untergebracht. Insbesondere kann man den Programmablauf so sehen, wie es der Benutzer außerhalb der Entwicklungsumgebung sehen wird, wenn man den Menüpunkt Suspend Development Tools aufruft.

Mit put string oder put variable wird der String oder die Variable auf den standard Errorstream geschrieben, der in der Message Box zu sehen ist. Diese Outputs kann man auch im iOS sehen, und zwar in Console.app, wenn man im Simulator arbeitet und im Console-Reiter des XCode Organizers, wenn ein physischer Device an den Rechner angeschlossen ist.

Das Herausschreiben in die Message Box ist nicht trivial. Um mehr als eine Variable in einer Zeile auszugeben, bedient man sich der Concatenation:

put clickLine () & CR & "Zeilennummer: "& char 6 of the clickline

komplexer wird es, wenn man in der Message Box Zeile für Zeile weiter schreiben möchte. Dann schreibt man z.B.

put a
put CR & b after msg
put CR & c after msg

wichtig ist, dass man das after msg anfügt.

14. The User Experience

Wie wir von den Produkten der Firma Apple wissen ist die User Experience, also was der Benützer oder Käufer erlebt ein sehr wichtiger Bestandteil seiner Zufriedenheit oder deren Mangel beim Kauf oder bei der Nutzung einer Ware.

14.1 User Preferences

Collecting User Preferences Teil 1, Teil 2

14.2 Passwort

Passwortschutz

14.3 Installation

Es gibt ein Plug-In, den Installer Maker

15. Veröffentlichen

Das Veröffentlichen kann nun auf verschiedenen Plattformen erfolgen, natürlich unter der Voraussetzung, dass für diese Plattform entwickelt worden war.

15.1 Mac/Windows

Um auf einer Computerplattform publizieren zu können, muss zuerst File>Standalone Applicaton Settings... eingerichtet werden.

bug Dabei ist es in LC ver. 4.5.2 so, dass nach dem Anklicken der entsprechenden Plattform am oberen Rand des Fensters noch keine Einstellungsmöglichkeiten vorhanden sind. Erst wenn man die Plattform wechselt und wieder zurück geht, ist es möglich, die entsprechenden Änderungen vorzunehmen.

15.2 iOS

Derzeit (12/2010) bekommt man beim Versuch die App an den iTunes Store zu schicken eine 'Bundle Invalid' Reaktion. Dazu folgendes Zitat aus dem LCForum/iOS Board von Obleo:

think I may have found something that may help here. The iOs setting pane in the standalone builder under version already has 1.0.0 listed in the field next to version. But when one goes and builds it does not add the version number to the plist. If you go to that field and delete the 1.0.0 text from the field and re enter it, then save again, it should appear within the plist file. It sounds kind of dumb, but that how I had to get the cfbundleversion to show up on the plist file. Try it and see if that helps.

Die Prozedur über den iTunes Store zu veröffentlichen ist recht aufwändig. Es gibt da eine Software namens PhoneDisk, die ein direktes Aufspielen von Daten auf die Platte, auch des iPads, ermöglicht. Es ist zwar zu bezweifeln, dass das funktioniert, aber jedenfalls ist es einen Versuch wert. Zur Zeit kann ich diese Möglichkeit leider nicht selbst austesten.

16. Verwendete Abkürzungen

AB Application Browser
AI Adobe Illustrator
App Applikation, Anwendung, Programm
CI Card Inspector (Menüpunkt und Fenster von LC)
CR Carriage return, Zeilenschaltung
IDE Integrated Development Environment
LC LiveCode
PI Property Inspector, Eigenschaftsinspektor
QT QuickTime (Medienplattform von Apple)
QTVR QuickTime Virtual Reality (Medienplattform von Apple)
SI Stack Inspector (Menüpunkt und Fenster von LC)
TAB Tabulator(taste)
UI User Interface

17. Literatur

[1] LC userguide - zu finden im Programm selbst unter dem Menüpunkt Help.
[2] Livecodejournal-images  (Stand 21.11.10)
[3] lessons.runrev.com: How-do-I-play-sounds-on-the-iPhone. (Stand 26.11.10)
[4] Developer Tutorials (Stand 10.12.10)
[5] Danke an Klaus Major
[6] Mark Waddingham: LiveCode for iOS Deployment Pack Rev.9 p.5f
[7] Apple: iOS Development Guide Stand (15.12.2010)
[8] runrev LiveCode Forums
[9] John Craig: Finger.livecode; download in Development>Rev Online>Finger
[10] http://www.mirye.net/livecode-faq/30-port-from-hypercard-to-revolution (Stand 9.3.12)
[11] http://www.mirye.net/livecode-faq/73-convert-supercard-to-revolution (Stand 9.3.12)