Skip to content

Commit 8356efe

Browse files
committedSep 23, 2017
Upload presentation
1 parent 3d9e618 commit 8356efe

25 files changed

+599
-0
lines changed
 

‎presentation/.gitignore

+221
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,221 @@
1+
## Core latex/pdflatex auxiliary files:
2+
*.aux
3+
*.lof
4+
*.log
5+
*.lot
6+
*.fls
7+
*.out
8+
*.toc
9+
*.fmt
10+
*.fot
11+
*.cb
12+
*.cb2
13+
14+
## Intermediate documents:
15+
*.dvi
16+
*.xdv
17+
*-converted-to.*
18+
# these rules might exclude image files for figures etc.
19+
# *.ps
20+
# *.eps
21+
# *.pdf
22+
23+
## Generated if empty string is given at "Please type another file name for output:"
24+
.pdf
25+
26+
## Bibliography auxiliary files (bibtex/biblatex/biber):
27+
*.bbl
28+
*.bcf
29+
*.blg
30+
*-blx.aux
31+
*-blx.bib
32+
*.run.xml
33+
34+
## Build tool auxiliary files:
35+
*.fdb_latexmk
36+
*.synctex
37+
*.synctex(busy)
38+
*.synctex.gz
39+
*.synctex.gz(busy)
40+
*.pdfsync
41+
42+
## Auxiliary and intermediate files from other packages:
43+
# algorithms
44+
*.alg
45+
*.loa
46+
47+
# achemso
48+
acs-*.bib
49+
50+
# amsthm
51+
*.thm
52+
53+
# beamer
54+
*.nav
55+
*.pre
56+
*.snm
57+
*.vrb
58+
59+
# changes
60+
*.soc
61+
62+
# cprotect
63+
*.cpt
64+
65+
# elsarticle (documentclass of Elsevier journals)
66+
*.spl
67+
68+
# endnotes
69+
*.ent
70+
71+
# fixme
72+
*.lox
73+
74+
# feynmf/feynmp
75+
*.mf
76+
*.mp
77+
*.t[1-9]
78+
*.t[1-9][0-9]
79+
*.tfm
80+
81+
#(r)(e)ledmac/(r)(e)ledpar
82+
*.end
83+
*.?end
84+
*.[1-9]
85+
*.[1-9][0-9]
86+
*.[1-9][0-9][0-9]
87+
*.[1-9]R
88+
*.[1-9][0-9]R
89+
*.[1-9][0-9][0-9]R
90+
*.eledsec[1-9]
91+
*.eledsec[1-9]R
92+
*.eledsec[1-9][0-9]
93+
*.eledsec[1-9][0-9]R
94+
*.eledsec[1-9][0-9][0-9]
95+
*.eledsec[1-9][0-9][0-9]R
96+
97+
# glossaries
98+
*.acn
99+
*.acr
100+
*.glg
101+
*.glo
102+
*.gls
103+
*.glsdefs
104+
105+
# gnuplottex
106+
*-gnuplottex-*
107+
108+
# gregoriotex
109+
*.gaux
110+
*.gtex
111+
112+
# hyperref
113+
*.brf
114+
115+
# knitr
116+
*-concordance.tex
117+
# TODO Comment the next line if you want to keep your tikz graphics files
118+
*.tikz
119+
*-tikzDictionary
120+
121+
# listings
122+
*.lol
123+
124+
# makeidx
125+
*.idx
126+
*.ilg
127+
*.ind
128+
*.ist
129+
130+
# minitoc
131+
*.maf
132+
*.mlf
133+
*.mlt
134+
*.mtc[0-9]*
135+
*.slf[0-9]*
136+
*.slt[0-9]*
137+
*.stc[0-9]*
138+
139+
# minted
140+
_minted*
141+
*.pyg
142+
143+
# morewrites
144+
*.mw
145+
146+
# nomencl
147+
*.nlo
148+
149+
# pax
150+
*.pax
151+
152+
# pdfpcnotes
153+
*.pdfpc
154+
155+
# sagetex
156+
*.sagetex.sage
157+
*.sagetex.py
158+
*.sagetex.scmd
159+
160+
# scrwfile
161+
*.wrt
162+
163+
# sympy
164+
*.sout
165+
*.sympy
166+
sympy-plots-for-*.tex/
167+
168+
# pdfcomment
169+
*.upa
170+
*.upb
171+
172+
# pythontex
173+
*.pytxcode
174+
pythontex-files-*/
175+
176+
# thmtools
177+
*.loe
178+
179+
# TikZ & PGF
180+
*.dpth
181+
*.md5
182+
*.auxlock
183+
184+
# todonotes
185+
*.tdo
186+
187+
# easy-todo
188+
*.lod
189+
190+
# xindy
191+
*.xdy
192+
193+
# xypic precompiled matrices
194+
*.xyc
195+
196+
# endfloat
197+
*.ttt
198+
*.fff
199+
200+
# Latexian
201+
TSWLatexianTemp*
202+
203+
## Editors:
204+
# WinEdt
205+
*.bak
206+
*.sav
207+
208+
# Texpad
209+
.texpadtmp
210+
211+
# Kile
212+
*.backup
213+
214+
# KBibTeX
215+
*~[0-9]*
216+
217+
# auto folder when using emacs and auctex
218+
/auto/*
219+
220+
# expex forward references with \gathertags
221+
*-tags.tex
1.46 KB
Loading

‎presentation/Bilder/dfs1.png

12.7 KB
Loading

‎presentation/Bilder/dfs2.png

21.3 KB
Loading

‎presentation/Bilder/dfs3.png

22.9 KB
Loading

‎presentation/Bilder/dfs4.png

28.4 KB
Loading

‎presentation/Bilder/dfs5.png

26.5 KB
Loading

‎presentation/Bilder/dfs6.png

30.2 KB
Loading

‎presentation/Bilder/dfs7.png

46.4 KB
Loading

‎presentation/Bilder/little.png

190 Bytes
Loading

‎presentation/Bilder/noten.png

17 KB
Loading

‎presentation/Bilder/pwm.png

5.19 KB
Loading

‎presentation/Bilder/speicherplatz.png

8.88 KB
Loading

‎presentation/Bilder/splash.png

2.17 KB
Loading
2.48 KB
Loading
82.4 KB
Loading

‎presentation/Bilder/wir.jpg

96.1 KB
Loading

‎presentation/Bilder/world.png

1.82 KB
Loading

‎presentation/Bilder/world2.png

8.67 KB
Loading

‎presentation/Bilder/world3.png

8.3 KB
Loading

‎presentation/Bilder/world4.png

9.12 KB
Loading

‎presentation/Bilder/world5.png

319 KB
Loading

‎presentation/Bilder/world6.png

318 KB
Loading

‎presentation/document.pdf

1.09 MB
Binary file not shown.

‎presentation/document.tex

+378
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,378 @@
1+
%!TEX program = lualatex
2+
3+
\documentclass[fleqn]{beamer}
4+
\usetheme{metropolis}
5+
\usepackage{graphicx}
6+
\usepackage{comment}
7+
\usepackage{color}
8+
\usepackage{algpseudocode,algorithm}
9+
\usepackage{minted}
10+
\usepackage{listings}
11+
\usepackage{fontspec}
12+
\usepackage{polyglossia}
13+
\setmainlanguage{german}
14+
\usepackage[super]{nth}
15+
\title{Spielekonsole B}
16+
\date{\today}
17+
\author{Robert Schütz, Daniela Kilian, Stefan Müller}
18+
\subtitle{Fortgeschrittenenpraktikum SS 2017}
19+
20+
21+
\begin{document}
22+
\maketitle
23+
24+
\begin{frame}{Die Crew}
25+
\setbeamertemplate{section in toc}[sections numbered]
26+
\begin{center}
27+
\includegraphics[width=10cm]{Bilder/wir.jpg}
28+
\end{center}
29+
\begin{minipage}{0.3\textwidth}
30+
\centering Stefan Müller
31+
\end{minipage}
32+
\begin{minipage}{0.3\textwidth}
33+
\centering Daniela Kilian
34+
\end{minipage}
35+
\begin{minipage}{0.3\textwidth}
36+
\centering Robert Schütz
37+
\end{minipage}
38+
\end{frame}
39+
\section{Spielidee}
40+
\begin{frame}{Das Spiel: Metro HD}
41+
\begin{center}
42+
\includegraphics[width=10cm]{Bilder/splash.png}
43+
\end{center}
44+
\end{frame}
45+
46+
\begin{frame}{Spielaufbau: Schritt 1}
47+
\begin{center}
48+
\includegraphics[width=9cm]{Bilder/world2.png}
49+
50+
\large \textbf{Kämpfe gegen verschiedene Monster!}
51+
\end{center}
52+
\end{frame}
53+
\begin{frame}{Spielaufbau: Schritt 2}
54+
\begin{center}
55+
\includegraphics[width=9cm]{Bilder/world3.png}
56+
57+
\large \textbf{Entdecke aufregende Level!}
58+
\end{center}
59+
\end{frame}
60+
\begin{frame}{Spielaufbau: Schritt 3}
61+
\begin{center}
62+
\includegraphics[width=9cm]{Bilder/world4.png}
63+
64+
\large \textbf{Bereite dich auf einen anstrengenden Kampf vor!}
65+
\end{center}
66+
\end{frame}
67+
\begin{frame}{Spielaufbau: Schritt 4}
68+
\begin{center}
69+
\includegraphics[width=9cm]{Bilder/world6.png}
70+
71+
\large \textbf{Stelle dich gefährlichen Endbossen!}
72+
\end{center}
73+
\end{frame}
74+
\begin{frame}{Spielaufbau: Schritt 5}
75+
\begin{center}
76+
\includegraphics[width=9cm]{Bilder/world5.png}
77+
78+
\large \textbf{Verdiene dir mächtige Power-Ups!}
79+
\end{center}
80+
\end{frame}
81+
82+
\section{Spielumsetzung}
83+
84+
\begin{frame}[fragile]{Zeichen: Sprites}
85+
Das Display zeichnet immer vier Pixel untereinander auf einmal.
86+
Ein Python-Skript vereinfacht das Zeichnen:
87+
88+
\begin{minipage}{0.2\textwidth}
89+
\includegraphics[width=\textwidth]{Bilder/little.png}
90+
\end{minipage}
91+
\begin{minipage}{0.15\textwidth}
92+
\centering\huge$\longrightarrow$
93+
\end{minipage}
94+
\begin{minipage}{0.6\textwidth}
95+
\small
96+
\begin{lstlisting}[language=C]
97+
const PROGMEM uint8_t little[16] = {
98+
0b00000100, 0b00010100,
99+
0b10010000, 0b10000000,
100+
0b10000000, 0b10010000,
101+
0b00010100, 0b00000100,
102+
0b00000000, 0b00001000,
103+
0b11111010, 0b01111001,
104+
0b01111001, 0b11111010,
105+
0b00001000, 0b00000000
106+
};
107+
\end{lstlisting}
108+
\end{minipage}
109+
\end{frame}
110+
111+
\begin{frame}[fragile]{Zeichnen: Display}
112+
Idee: Window-Funktionalität des Displays benutzen
113+
114+
\includegraphics[width=11cm]{Bilder/windowcommands.png}
115+
116+
\begin{minted}[fontsize=\tiny]{C}
117+
void drawsprite(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t* sprite)
118+
{
119+
enable_window(x, y, width, height);
120+
for (uint16_t i = 0; i < width * height; ++i)
121+
sendbyte(pgm_read_byte_near(sprite + i), 1);
122+
disable_window();
123+
}
124+
\end{minted}
125+
$\Rightarrow$ Schneller als \mintinline{C}{page()}
126+
\end{frame}
127+
128+
\begin{frame}[fragile]{Zeichnen: Pixelweise}
129+
\begin{minted}[fontsize=\tiny]{C}
130+
void drawsprite_px(uint8_t x, uint8_t y, uint8_t width, uint8_t height, uint8_t* sprite)
131+
{
132+
uint8_t offset = 2 * (y % 4);
133+
if (offset == 0)
134+
{
135+
drawsprite(x, y / 4, width, height / 4, sprite);
136+
}
137+
else
138+
{
139+
enable_window(x, y / 4, width, height / 4 + 1);
140+
uint16_t i = 0;
141+
for (; i < width; ++i)
142+
sendbyte(pgm_read_byte_near(sprite + i) << offset, 1);
143+
for (; i < height / 4 * width; ++i)
144+
sendbyte(pgm_read_byte_near(sprite + i) << offset |
145+
pgm_read_byte_near(sprite + i - width) >> (8 - offset), 1);
146+
for (; i < (height / 4 + 1) * width; ++i)
147+
sendbyte(pgm_read_byte_near(sprite + i - width) >> (8 - offset), 1);
148+
disable_window();
149+
}
150+
}
151+
\end{minted}
152+
\end{frame}
153+
154+
\begin{frame}[fragile]{\mintinline{C}{struct Character}}
155+
Alle beweglichen Objekte werden als \mintinline{C}{Character} repräsentiert.
156+
\begin{minted}[fontsize=\tiny]{C}
157+
struct Character
158+
{
159+
uint8_t x;
160+
uint8_t y;
161+
enum {LOOK_MONSTER_MEMU, LOOK_PROTAGONIST, LOOK_FIREBALL, ...} look;
162+
uint8_t lookstate; // to e.g. store whether the wings are turned upwards or downwards
163+
uint32_t lastlookstatechg;
164+
uint8_t width; // in pixels
165+
uint8_t height; // in pixels
166+
enum {DIRECTION_LEFT, DIRECTION_RIGHT} direction;
167+
enum {DIRECTION_UP, DIRECTION_DOWN} verticaldirection;
168+
int8_t jumpstate;
169+
uint8_t initial_health;
170+
int8_t health;
171+
uint8_t damage;
172+
uint8_t jumpheight;
173+
enum {FOLLOW_PROTAGONIST, BACK_AND_FORTH, ...} movement;
174+
uint8_t x_pace;
175+
uint8_t y_pace;
176+
};
177+
\end{minted}
178+
\end{frame}
179+
180+
\begin{frame}[fragile]{Spielablauf}
181+
\begin{minted}[fontsize=\tiny]{C}
182+
while(1)
183+
{
184+
if (nextmoveevent < getMsTimer())
185+
{
186+
if (B_RIGHT)
187+
{
188+
moveright(protagonist);
189+
nextmoveevent = getMsTimer() + 50;
190+
}
191+
...
192+
}
193+
if (projectile->movement == HIDDEN
194+
&& num_rockets > 0
195+
&& nextshootevent < getMsTimer()
196+
&& B_A)
197+
{
198+
projectile->movement = PROJECTILE;
199+
draw(projectile);
200+
num_rockets--;
201+
eeprom_write_byte(&num_rockets_stored, num_rockets);
202+
nextshootevent = getMsTimer() + 500;
203+
}
204+
if (monster->movement != HIDDEN && collision(protagonist, monster))
205+
{
206+
takingdamage(monster->damage);
207+
}
208+
...
209+
}
210+
\end{minted}
211+
\end{frame}
212+
213+
\begin{frame}[fragile]{Zufällige Plattformen}
214+
\begin{minted}[fontsize=\tiny]{C}
215+
srandom(level_seed + level_pos);
216+
platforms_13 = random();
217+
platforms_19 = random();
218+
platforms_24 = random();
219+
nofloor = random();
220+
221+
bool obstacle(uint8_t x, uint8_t y)
222+
{
223+
if (y >= 19 * 4 && y < 20 * 4)
224+
return !(platforms_19 & (3l << (x / PLATFORM_WIDTH * 2)));
225+
else if (y >= 13 * 4 && y < 14 * 4)
226+
return !(platforms_13 & (3l << (x / PLATFORM_WIDTH * 2)));
227+
else if (y >= 24 * 4 && y < 25 * 4)
228+
return !(platforms_24 & (3l << (x / 16 * 2)));
229+
else if (y >= FLOOR_Y && y < FLOOR_Y + 4)
230+
return nofloor & (3l << x / 16 * 2);
231+
else
232+
return false;
233+
}
234+
\end{minted}
235+
Die \mintinline{C}{obstacle()} Funktion dient dazu, herauszufinden, ob an einer gegebenen Stelle eine Plattform ist.
236+
\end{frame}
237+
238+
\begin{frame}{Tiefensuche: Schritt 1}
239+
\begin{center}
240+
\includegraphics[width=11cm]{Bilder/dfs1.png}
241+
\end{center}
242+
\end{frame}
243+
244+
\begin{frame}{Tiefensuche: Schritt 2}
245+
\begin{center}
246+
\includegraphics[width=11cm]{Bilder/dfs2.png}
247+
\end{center}
248+
\end{frame}
249+
250+
\begin{frame}{Tiefensuche: Schritt 3}
251+
\begin{center}
252+
\includegraphics[width=11cm]{Bilder/dfs3.png}
253+
\end{center}
254+
\end{frame}
255+
256+
\begin{frame}{Tiefensuche: Schritt 4}
257+
\begin{center}
258+
\includegraphics[width=11cm]{Bilder/dfs4.png}
259+
\end{center}
260+
\end{frame}
261+
\begin{frame}{Tiefensuche: Schritt 5}
262+
\begin{center}
263+
\includegraphics[width=11cm]{Bilder/dfs5.png}
264+
\end{center}
265+
\end{frame}
266+
\begin{frame}{Tiefensuche: Schritt 6}
267+
\begin{center}
268+
\includegraphics[width=11cm]{Bilder/dfs6.png}
269+
\end{center}
270+
\end{frame}
271+
\begin{frame}{Tiefensuche: Letzter Schritt}
272+
\begin{center}
273+
\includegraphics[width=11cm]{Bilder/dfs7.png}
274+
\end{center}
275+
\end{frame}
276+
277+
\section{Sound}
278+
\begin{frame}{Timer}
279+
Wir verwenden zwei Timer:
280+
\begin{itemize}
281+
\item Timer1
282+
\begin{itemize}
283+
\item Frequenz: 62\,500 Hz
284+
\item Toggelt Pin B1
285+
\item Pulsweite bestimmt „Ausschlag“ der Welle
286+
287+
\end{itemize}
288+
\end{itemize}
289+
\begin{center}
290+
\includegraphics[width=8cm]{Bilder/pwm}
291+
\end{center}
292+
\end{frame}
293+
294+
\begin{frame}{Timer}
295+
\begin{itemize}
296+
\item Timer2
297+
\begin{itemize}
298+
\item Frequenz des Interrupts: 15\,625 Hz
299+
\item Dient zur Zeitmessung
300+
\item Legt den aktuellen Ausschlag fest:
301+
302+
Für einen Ton mit 440 Hz wird bei jedem Aufruf des Interrupts die Pulsweite (max.\ 255) um
303+
\[255 / (15625/440) \approx 7,18\]
304+
erhöht.
305+
Für eine höhere Genauigkeit werden \mintinline{C}{uint16_t}s verwendet.
306+
\end{itemize}
307+
\end{itemize}
308+
309+
\end{frame}
310+
311+
\begin{frame}[fragile]{MIDI einlesen}
312+
\begin{center}
313+
\includegraphics[height=2cm]{Bilder/noten.png}
314+
315+
\huge$\downarrow$
316+
317+
\begin{minted}[fontsize=\small]{C}
318+
const Event boss4[] PROGMEM = {
319+
{ { .track = 0, .increment = 615, .delay = 0 } },
320+
{ { .track = 1, .increment = 307, .delay = 0 } },
321+
{ { .track = 2, .increment = 2463, .delay = 2812 } },
322+
{ { .track = 2, .increment = 1231, .delay = 2812 } },
323+
{ { .track = 0, .increment = 1231, .delay = 0 } },
324+
...,
325+
STOP
326+
};
327+
\end{minted}
328+
\end{center}
329+
\end{frame}
330+
331+
\section{Probleme und Verbesserungen}
332+
\begin{frame}{Aufgetretene Probleme}
333+
\begin{itemize}
334+
\item Problem: Speicherplatzmangel
335+
\end{itemize}
336+
\begin{center}
337+
\includegraphics[width=7cm]{Bilder/speicherplatz.png}
338+
\end{center}
339+
\begin{itemize}
340+
\item Lösung: Ablegen der Sprites im PROGMEM und
341+
effiziente Aufspaltung von großen Bildern
342+
\end{itemize}
343+
\begin{center}
344+
% \includegraphics[height=2cm]{Bilder/splashleft.png}
345+
% \includegraphics[height=3cm]{Bilder/splashcenter.png}
346+
% \includegraphics[height=2cm]{Bilder/splashright.png}
347+
\includegraphics[width=6cm, height=3cm]{Bilder/splashspeicher.png}
348+
\end{center}
349+
\end{frame}
350+
351+
352+
\begin{frame}{Mögliche Verbesserungen}
353+
Hardware
354+
\begin{itemize}
355+
\item Tiefpass einbauen
356+
\item Farbdisplay
357+
\end{itemize}
358+
359+
Software
360+
\begin{itemize}
361+
\item (Noch) Effizientere Implementierung
362+
\item Highscore hinzufügen
363+
\item Spiel weiter ausbauen:
364+
\begin{itemize}
365+
\item Neue Monster, Endbosse und Power-Ups
366+
\item Weitere Waffen
367+
\item Geheimwege
368+
\end{itemize}
369+
370+
\end{itemize}
371+
\end{frame}
372+
373+
374+
\begin{frame}
375+
\includegraphics[width=11cm]{Bilder/aufmerksamkeit.png}
376+
\end{frame}
377+
378+
\end{document}

0 commit comments

Comments
 (0)
Please sign in to comment.