Samstag, 30. Juli 2011

Do-It-Yourself Spieleentwicklung mit Unity 3D

Habe seit langem mal wieder eine aktuelle Version von Unity 3D runter geladen und damit herum gespielt. Und ich muss sagen, ich bin beeindruckt.

Wer JavaScript programmieren und Google SketchUp bedienen kann, dem steht die Laufbahn als Spiele-Entwickler vermutlich so offen wie nie zuvor. Die 3D-Objekte (Meshes) kann man mit SketchUp selbst entwerfen oder ganz einfach im Google's 3D-Warehouse besorgen. Anschliessend exportiert man das Ganze als FBX-Datei. Per Drag & Drop fügt man die Datei als Asset in das Unity-Projekt ein. Nun noch ein paar Geräusche von einer alten FX-Sound-DVD kopieren und los geht's.

Ein Unity-Projekt besteht aus einem Assets-Ordner (mit Bildern, Sounds, etc.) und einer Liste von Scenes. Eine Scene besteht aus einem Baum von GameObjects. Jedes GameObject kann mit beliebig vielen Components ausstaffiert werden, die dessen Aussehen und das Verhalten bestimmen. Beispiele sind Light, Mesh, Collider, Rigidbody, AudioSource und Script.

Hat man alles zusammen gesteckt, so klickt man oben auf den Play-Button und kann das Spiel ausprobieren. Ausserdem kann man Binaries für Mac, Windows, Xbox, PS3, Wii, Android und iPhone generieren. Da bleiben keine Wünsche offen...

Deep Sea Mining

Unten seht ihr ein paar Screenshots aus dem Spiel "Deep Sea Mining", das ich gestern schnell zusammen gezimmert habe. Wer es ausprobieren will, kann das Programm für Windows und Mac aus meiner Drop Box holen. Gesteuert wird mit den Cursor-Tasten und der Leerttaste. Viel Spass!

 

 

 

Montag, 28. Februar 2011

Was ist eine funktionale Programmiersprache ohne Listen?


Oder anders ausgedrückt: wie könnte man sich einer funktionalen Sprache besser nähern, als über Listen? Auf www.simplyscala.com habe ich die folgenden Beispiele durchgespielt.

Der graue Text sind meine Eingaben. Der grüne Text sind die Ausgaben des Interpreters.

var la = List(1,4,6,9,10,20,11,3)
la: List[Int] = List(1, 4, 6, 9, 10, 20, 11, 3)

Mit List(x, y, ...) kann ich offenbar eine Liste von Zahlen definieren. Und la=... weist das neue Objekt der Variable la zu.

var lb = la ++ List(-3,-2,-8)
lb: List[Int] = List(1, 4, 6, 9, 10, 20, 11, 3, -3, -2, -8)

Mittels ++ kann man also Listen aneinander hängen.

var lc = lb.sorted
lc: List[Int] = List(-8, -3, -2, 1, 3, 4, 6, 9, 10, 11, 20)

Die Funktion sorted ist eine Methode der Liste und liefert, nicht unerwartet, eine sortierte Variante.

var ld = lc.filter( _ < 0)
ld: List[Int] = List(-8, -3, -2) 

Aha, filtern kann man also auch. Der Ausdruck zwischen den runden Klammern ist das Prädikat, anhand dessen die Liste gefiltert wird. Es wird auf jedes Element der Liste angewendet. Wenn es zu true evaluiert, dann wird das Element (dargestellt durch ein "_") in die neue Liste aufgenommen, andernfalls wird es verworfen.
Vermutlich kann ich dafür auch eine Funktion verwenden?!

def isNeg(v:Int) = v < 0
isNeg: (v: Int)Boolean 
 
Wie man sieht, kann man mit def ... = ... in Scala eine Funktion definieren.
Verwenden wir die doch gleich mal.

var le = lc.filter(isNeg(_))
le: List[Int] = List(-8, -3, -2) 
 
Ok. Das hat geklappt.
Ob man auch zwei Listen auf einmal erzeugen kann?

var (low, hi) = lc.partition(isNeg(_))
low: List[Int] = List(-8, -3, -2)
hi: List[Int] = List(1, 3, 4, 6, 9, 10, 11, 20)

Die Methode partition zerlegt die Liste anhand des Prädikats in zwei Listen ("Die Guten ins Töpfchen, die schlechten ins ..."). Der Rückgabewert ist ein Tuple. Hier habe ich es gleich wieder in seine Bestandteile zerlegt und den beiden Variablen zugewiesen.

Zu guter Letzt' wollen wir doch mal eine Funktion in Action sehen...

def f(x:Int) = 2*x+3
f: (x: Int)Int

Das kenn' ich noch aus der Schule: "F von x ist 2 mal x plus 3" :-)
Und nun mal anwenden lassen...

var y = List(-3,-2,-1,-0,1,2,3).map( f)
y: List[Int] = List(-3, -1, 1, 3, 5, 7, 9)

Die Methode map wendet die angegebene Funktion auf jedes Listenelement an und stopft das Ergebnis in die Ergebnisliste.

Das war's für heute.

M.

Sonntag, 12. Juli 2009

Aktivitätsanzeige im iPhone nutzen

In der oberen Statuszeile des iPhones ist eine Aktivitätsanzeige versteckt.






Mit dem folgenden Code kann man sie nutzen:

UIApplication* app = [UIApplication sharedApplication];
app.networkActivityIndicatorVisible = YES;
// start loading data ...
// ...
// finished.
app.networkActivityIndicatorVisible = NO;

Montag, 1. Juni 2009

Spielerei mit JavaFX


Hier ist ein Link auf ein kleines Spiel, das ich mit JavaFX 1.1 implementiert habe.

Der Wassertropfen kann mit den Cursortasten gesteuert werden, oder alternativ mit der Maus.
Das Ziel jedes Levels ist es, vor Erreichen des Ausgangs möglichst viele Blumen zu gießen.

Viel Spaß,

- Michael

Dienstag, 12. Mai 2009

WiredMarker für Firefox

Das WiredMarker Plugin für den Firefox hat es mir echt angetan. Ich kann bei der Recherche nun Textabschnitte von Webseiten farbig markieren.


Nach der Installation des Plugins kann man beliebige Textabschnitte in beliebigen Webseiten markieren und mittels Rechts-Klick über ein Kontextmenü farbig markieren. Diese Markierungen werden in Sammelmappen gespeichert.

Wired-Marker hat eine eigene Konfigurationsleiste, in der man die Sammelmappen für Markierungen verwalten kann. Jeder Mappe kann ein eigener Titel und eine eigene Farbe zugeordnet werden. Die Markierungen werden als spezielle Bookmarks in den Mappen gespeichert. Ein Klick auf einen solchen Bookmark öffnet die entsprechende Webseite und scrollt zur markierten Stelle.

Natürlich sind die Markierungen persistent. Ruft man eine mit Markierungen versehene Seite zu einem späteren Zeitpunkt wieder auf, so sind alle Markierungen zu sehen.

- Michael

Samstag, 9. Mai 2009

Beanfabrics zieht um

Nachdem ich mir einige Wochen angesehen habe (siehe Post), welche Features das Code-Hosting bei Google bietet, habe ich mich durchgerungen, mein Open-Source-Projekt Beanfabrics von meinem Root-Server nach beanfabrics.googlecode.com zu verschieben.

Im wesentlichen sehe ich folgende Vorteile:
  • Wartung entfällt (Linux, Firewall, SVN, Apache, Wiki, MySQL, Forum)
  • Hohe Verfügbarkeit
  • Hohe Sicherheit (Backups, Hacking)
  • Einfache Bedienung über Web
  • Einfach erweiterbar (Groups, Blog, Google-Gadgets)
Welche Nachteile gibt es? Nun, da ich auf code.google.com nichts installieren kann, kann ich zukünftig nur das nutzen, was angeboten wird. Allerdings steht es mir frei, die gewünschten Funktionen auf meinem Root-Server anzubieten und von code.google.com zu verlinken.

Also ran an die Arbeit.

- Michael

Donnerstag, 7. Mai 2009

Ohloh.net - das Open-Source-Netzwerk

Ohloh.net ist eine Community rund um Open-Source-Software. Angemeldete User können sich als "Benutzer" von Software eintragen, sowie Bewertungen und Kommentare abgeben. Wer ein Open-Source-Projekt leitet oder sich daran beteilligt, kann auch dies angeben.


Der Screenshot zeigt den Eintrag für den Firefox-Browser.

Aktuell gibt es 29.632 Einträge. Offenbar wurden die meisten automatisch durch einen Crawler eingetragen. Sogar ein Eintrag für jrexx ist dabei. Das ist eine Bibliothek für reguläre Ausdrücke von Ralf Meyer, für die ich in der Steinzeit einen Visualisierer und Editor mit dem Namen jrexx-Lab geschrieben habe.