%% Presentation about Pygame

%% Some useful variations of the document class
%%\documentclass[ignorenonframetext,draft]{beamer}
%%\documentclass[ignorenonframetext,handout]{beamer}
\documentclass[ignorenonframetext,handout]{beamer}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{listings}
\mode<presentation>{\usetheme{Copenhagen}}
\title{``pygame'' am Beispiel von ``screensaw.py''}
\author{Marek~Kubica}
\date{22.~November~2007}

%% logo
%%\pgfdeclareimage[width=3cm]{logo}{pygame_tiny}
%%\logo{\pgfuseimage{logo}}
\logo{\includegraphics[width=3cm]{pygame_tiny}}
\titlegraphic{\includegraphics[width=10cm]{pygame_logo}}

%% get rid of navigation symbols
%%\setbeamertemplate{navigation symbols}{}
\beamertemplatenavigationsymbolsempty

\begin{document}

\frame{\titlepage}

\begin{frame}
  \frametitle{Was soll das sein?}
  \begin{itemize}
    \item Python-Binding für SDL
    \pause
    \item Simple DirectMedia Layer
    \pause
    \item Von Loki (Loki~Games) entwickelt
    \pause
    \item Einfache (aber auch primitive) API zur Programmierung von Spielen
  \end{itemize}
\end{frame}

\begin{frame}
  \frametitle{``screensaw.py'' als Pygame-Anwendung}
  \begin{block}{Der Ursprung}
    \begin{itemize}
      \item 27.~Februar~2005 ins Repositry eingefügt
      \item Als eine Art Python-Klon von XScreenSaver gedacht
      \pause
        (siehe schlechtes Wortspiel im Namen)
      \pause
      \item Seitdem sporadisch erweitert
    \end{itemize}
  \end{block}
  \begin{block}{Der Umfang von ``screensaw.py''}
    \begin{itemize}
      \item einige ``Bildschirmschoner'', also einfache Demos
      \item eine Bibliothek die Zufallswerte mit bestimmten Wahrscheinlichkeiten
        ausgibt
      \item eine stark optimierte Bibliothek zum Errechnen von Primzahlen
      \pause (in Python, also keine Wunder zu erwarten)
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Überblick über die Demos}
  Vorweg: Ja, es gibt Screenshots.
  \pause
  \begin{block}{Simple Demos}
    \begin{itemize}
      \item Fade: Überblendung von schwarz nach weiß und zurück. Der Trenner sozusagen
      \item Critter: Zwei zufällige Punkte mit weißer Linie verbinden
      \item Ant: eine Art ``Ameise'' lauft über den Bildschirm
      \item Popsquares: blinkende blaue Kästen
      \item Cube: Ein Gamecube-ähnliches Logo aus Sechsecken konstruiert
      \item Freefall: Freier Fall
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Noch mehr Demos}
  \begin{block}{Interessantere Demos}
    \begin{itemize}
      \item Sine Wave: Sinuswelle, mit farbigen Extrema
      \item Primes: Visualisiert Primzahlen
      \item AXE Alaska: Drehendes Sechseck. Nicht ganz fertig geworden, keine Motivation mehr
      \item Textraise: Fliegende Schrifteffekte
    \end{itemize}
  \end{block}

  \begin{block}{Angefangene, aber nie beendete Demos}
    \begin{itemize}
      \item Laser: ebenfalls von XScreenSaver kopiert, konstante Rotationsgeschwindigkeit fertig
      \item Grail: Bau des Grail-Logos, war aber zu zeitaufwendig
      \item Magnets: Magnet-Physik-Simulation.
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Screenshots}
  \begin{figure}
    \includegraphics[height=7cm]{critter}
    \caption{Computergenerierte Kritzeleien}
  \end{figure}
\end{frame}

\begin{frame}
  \frametitle{Screenshots}
  \begin{figure}
    \includegraphics[height=7cm]{ant}
    \caption{Ein Quarder, der herumläuft}
  \end{figure}
\end{frame}

\begin{frame}
  \frametitle{Screenshots}
  \begin{figure}
    \includegraphics[height=7cm,width=10cm]{sine-white}
    \caption{Sinuswelle}
  \end{figure}
\end{frame}

\begin{frame}
  \frametitle{Screenshots}
  \begin{figure}
    \includegraphics[height=7cm,width=10cm]{sine-gradient}
    \caption{Sinuswelle mit Extrema}
  \end{figure}
\end{frame}

\begin{frame}
  \frametitle{Screenshots}
  \begin{figure}
    \includegraphics[height=7cm,width=10cm]{sine-kali}
    \caption{Farbige Sinuswelle, nachgezogen}
  \end{figure}
\end{frame}

\begin{frame}
  \frametitle{Screenshots}
  \begin{figure}
    \includegraphics[height=7cm]{visual-prime}
    \caption{Primzahlenverteilung, schwarz auf weiß}
  \end{figure}
\end{frame}

\begin{frame}
  \frametitle{Screenshots}
  \begin{figure}
    \includegraphics[height=7cm]{visual-prime-new}
    \caption{Primzahlenverteilung, weiß auf schwarz}
  \end{figure}
\end{frame}

\begin{frame}
  \frametitle{Outtakes}
  Einige Beispiele von des rotierenden Sechsecks, die Probleme mit ``pygame'' 
  aufzeigen.
  \begin{columns}[c]
    \column{0.4\textwidth}
      \begin{figure}
        \includegraphics[height=3cm]{blured-hex}
        \caption{Nach unten bewegt}
      \end{figure}
    \column{0.6\textwidth}
      \begin{figure}
        \includegraphics[height=3cm]{bumping-hex}
        \caption{Seitwärtsbewegung}
      \end{figure}
  \end{columns}
  \begin{figure}
    \includegraphics[width=5cm]{tailed-hex}
    \caption{Nach rechts bewegt}
  \end{figure}
\end{frame}

\begin{frame}
  \frametitle{Probleme mit dem Rotieren}
  \begin{figure}
    \includegraphics[height=7cm]{flying-hex}
    \caption{Das Sechseck, einige Male hintereinander rotiert}
  \end{figure}
\end{frame}

\begin{frame}
  \frametitle{Sprites}
  \begin{block}{Was sind Sprites?}
    \begin{itemize}
      \item Sprites sind Surfaces + ihre Rectangles
      \pause
      \item Simpler: Bewegliche Teile auf dem Bildschirm, etwa Raumschiffe, Gegner, Spielfigur.
      \item Grob: alles was nicht der Hintergrund ist
      \item Vorteil: Man kann diese Sprites einfacher herumbewegen
      \item Beispiel: sprite-demo.py
      \pause
      \item Essentielles Tutorial dazu: \url{http://kai.vm.bytemark.co.uk/~piman/writing/sprite-tutorial.shtml}
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Mögliche Optimierungen}
  \begin{block}{Problem}
    Die Ausgabe der Primzahlen war zu langsam. Das lag daran, dass das gesammte
    Surface ge-updated wurde, immer wenn eine neue Primzahl eingezeichnet wurde.
  \end{block}
  \begin{block}{Lösung: ``Dirty Rectangles''}
    \begin{itemize}
      \item Jede Zeichenaktion gibt sogenannte ``dirty rectangles'' zurück, 
        das sind die Rechtecke die verändert wurden.
      \item Man kann \lstinline|pygame.display.update| die zu updatenden ``dirty rectangles'' mitgeben.
      \item Voila, nun ist es schneller.
    \end {itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Pro und Kontra ``pygame''}
  \begin{block}{Es ist nicht \textit{die} Lösung}
    Also wie man sieht ist es mit ``pygame'' zwar recht einfach etwas zu bauen,
    nicht aber trivial. Es gibt auch Schattenseiten.
  \end{block}
  \begin{columns}[t]
    \column{0.5\textwidth}
      \begin{block}{Vorteile}
        \begin{itemize}
          \item Primitiv, daher einfach
          \item bietet Grafik, Sound, Film, Input
          \item Dokumentiert (API, Tutorials)
          \item Community
          \item Überall verfügbar (Linux, BSD, Mac, Windows)
        \end{itemize}
      \end{block}
    \column{0.5\textwidth}
      \begin{block}{Nachteile}
        \begin{itemize}
          \item Entwicklung eingeschlafen (analog zu SDL)
          \item nur 2D (3D über PyOpenGL)
          \item direkt \textit{zu} primitiv, zu wenig abstraktion
        \end{itemize}
      \end{block}
  \end{columns}
\end{frame}

\begin{frame}
  \frametitle{Alternativen zu ``pygame''}
  \begin{block}{Direkte Alternativen}
    \begin{itemize}
      \item pyglet - sehr neu, aber die Screenshots sehen schon mal klasse aus, Dokumentation ist auch vorhanden
    \end{itemize}
  \end{block}
  \begin{block}{3D-Engines}
    Es gibt viele verschiedene Engines für 3D, aber so wie es aussieht gibt es
    nicht \textit{die} Engine. Zu den wohl aussichtsreichsten zählen:
    \begin{itemize}
      \item Panda3D - enthält auch eine Physik-Engine
      \item OGRE 3D - nur Grafik, aber Physik per ODE integrierbar
      \item Soya3D - eine Engine die speziell für Python geschrieben wurde
    \end{itemize}
  \end{block}
\end{frame}

\begin{frame}
  \frametitle{Ende der Präsentation}
  \begin{block}{pygame selbst}
    Viele Informationen zu pygame findet man auf der Homepage, 
    \url{http://www.pygame.org/}. Viele tolle Spiele und Ideen die mit
    pygame realisiert sind findet man auf \url{http://www.ludumdare.com}
    und \url{http://www.pyweek.org}.
  \end{block}
  \begin{block}{``screensaw.py'' beschaffen}
    \url{http://svn.projectdream.org/people/mkubica/snippets/trunk/}
  \end{block}
  \pause
  \begin{block}{Danke}
    Danke fürs Zuhören und ertragen meiner leider nicht so wie geplant
    gelungenen Folien.
  \end{block}
  \pause
  \begin{block}{Fragen? Diskussion?}
    Gibt es noch Fragen?
  \end{block}
\end{frame}

\end{document}
