Appendix
← C Teil 10: ASCII-GFX Vektorgraphik | ● | C Appendix: Screenshots →
Zusammenfassung
der NCurses bzw. ASCII-GFX API:
Man unterscheidet prinzipiell zwischen
Direct Draw Mode (ohne Back-Buffer)
und Retained Render Mode (mit Back-Buffer)
Ablauf-Schema #1 für das reguläre NCurses Terminal (Direkt Draw Mode):
Verwendung findet API #1 oder #2
1) Daten initialisieren
2) Jeden Frame komplett löschen (clear)
3) Und jeden Frame neu zeichnen (mvaddch, mvprintw, usw.)
Ablauf-Schemata fĂĽr den Canvas mit Back-Buffer (Retained Render Mode):
Verwendung findet API #3 oder #4
Ablauf-Schema #2 (Back-Buffer als statischer Hintergrund):
1) Hintergrund einmalig vorbereiten
2) Sprites einmalig erzeugen (enable_sprite)
3) Hintergrund für jeden Frame ändert sich nicht oder nur inkrementell (set_cell)
4) Sprite-Positionen können sich für jeden Frame beliebig ändern (set_sprite_position)
5) Spielfeldausschnitt im Back-Buffer einmalig pro Frame differentiell aktualisieren (center_window)
Ablauf-Schema #3 (Back-Buffer als dynamischer Hintergrund):
1) Daten initialisieren
2) Jeden Frame komplett löschen (clear_area)
3) Und jeden Frame neu zeichnen (set_cell, render_text_area, render_line, usw.)
4) Ggfls. Sprite-Positionen ändern (set_sprite_position)
5) Spielfeldausschnitt im Back-Buffer einmalig pro Frame differentiell aktualisieren (center_window)
Für Vektorgraphik wird sinnvollerweise Schema #3 verwendet, da sich Polygone in der Regel ständig dynamisch ändern bzw. transformiert werden können. Bei der Vorbereitung des Hintergrundes bei Schema #2 kann Vektorgraphik ebenfalls eingesetzt werden.
Vier unterschiedliche APIs
für die unterschiedlichen Anwendungsfälle:
Direct API #1: Plain Ncurses | Direct API #2: ASCII-GFX | Retained API #3: ASCII-GFX mit Back-Buffer/Scroll-Area | Retained API #4: ASCII-GFX mit 5×3 Back-Buffer/Grid-Char Area | Beschreibung |
---|---|---|---|---|
Pong | Schiffe-Versenken, 4-Gewinnt, Tron, Centipede | Tetris, Tanks, Asteroids, Space Invaders, Breakout, Autorennen, Flappy Bird | Pacman, Dig-Dug, Boulder-Dash | Typisches Anwendungsbeispiel |
#include <ncurses.h> | #include "gfx.h" | #include "scrollarea.h" | #include "gridarea.h" | Benötigte Header |
initscr() | init_gfx() | init_gfx() | init_gfx() | Initialisierung des Graphiksubsystems |
set_area_size() | set_grid_size() | Erzeugung eines Spielfelds (Canvas) | ||
set_window_size() | set_window_size() | Größe des dargestellten Spielfeldausschnittes | ||
clear() | clear() | clear_area() | clear_grid() | Terminal bzw. Spielfeld löschen |
mvaddch() | mvaddch() | set_cell() | set_grid() | Ein einziges Zeichen darstellen |
mvprintw() | draw_text() | render_text_area() | Eine Zeichenkette darstellen | |
draw_grid_text() | render_grid_text() | set_grid_text() | Eine 5×3 Zeichenkette darstellen benötigt: init_grid_font() | |
color_set() | use_color() | use_cell_color() | Farbe auswählen benötigt: init_color() | |
draw_sprite() | Sprite zeichnen | |||
enable_sprite | enable_sprite | Sprite erzeugen | ||
set_sprite_data | set_sprite_data | Sprite-Daten definieren (als int Array) | ||
set_sprite_text | set_sprite_text | Sprite-Daten definieren (als C- bzw. Text-String) | ||
set_sprite_position | set_sprite_position | Sprite-Position definieren | ||
detect_sprite_collision | detect_sprite_collision | Sprite-Kollisionserkennung | ||
hide_sprite | hide_sprite | Sprite unsichtbar machen | ||
show_sprite | show_sprite | Sprite sichtbar machen | ||
bake_sprite | bake_sprite | Sprite in das Spielfeld hineinbrennen | ||
disable_sprite | disable_sprite | Sprite entfernen | ||
draw_line() | render_line() | render_grid_line() | Liniensegment zeichnen | |
draw_circle() | render_circle() | Kreis zeichnen | ||
draw_ellipse() | render_ellipse() | Ellipse zeichnen | ||
render_polygon() | Polygon zeichnen | |||
render_triangle() | Dreieck zeichnen (Polygon-Sonderfall) | |||
translate() rotate() scale() | Polygon transformieren | |||
push() pop() | Polygon-Transformation duplizieren bzw. entfernen | |||
flood_fill() | flood_fill_grid() | Zusammenhängende Fläche füllen | ||
position_window() | redraw_grid_window() | Spielfeldausschnitt positionieren und inkl. Sprites darstellen | ||
center_window() | scroll_grid_window() | Spielfeldausschnitt zentriert scrollen und inkl. Sprites darstellen | ||
set_grid_char() | set_grid_char() | set_grid_char() | Grid-Char umdefinieren benötigt: init_grid_font() | |
set_grid_animation_string() | Grid-Char animieren | |||
mvwinch() | peek() | get_cell() | get_grid() | Dargestelltes Zeichen bestimmen |
msleep() rnd() | msleep() rnd() | msleep() rnd() | Hilfsfunktionen | |
log_text() | log_text() | Hilfsfunktionen zum Debuggen | ||
release_area() | release_grid() | Spielfeld freigeben | ||
getch() | getch() | getch() | getch() | Tastaturabfrage |
mouse_init() | mouse_init() | mouse_init() | Mouse-Reporting anschalten | |
mouse_exit() | mouse_exit() | mouse_exit() | Mouse-Reporting abschalten komplementär zu: mouse_init() | |
joy_init() | joy_init() | joy_init() | Joystick-Reporting anschalten | |
joy_exit() | joy_exit() | joy_exit() | Joystick-Reporting abschalten komplementär zu: joy_init() | |
sound_init() | sound_init() | sound_init() | Soundsubsystem initialisieren | |
sound_play() | sound_play() | sound_play() | WAV abspielen benötigt: sound_init() | |
sound_stop() | sound_stop() | sound_stop() | WAV stoppen | |
sound_exit() | sound_exit() | sound_exit() | Soundsubsystem herunterfahren komplementär zu: sound_init() | |
endwin() | exit_gfx() | exit_gfx() | exit_gfx() | Graphiksubsystem herunterfahren komplementär zu: initscr() bzw. init_gfx() |
Siehe auch unter Doxygen Dokumentation: www.th-nuremberg.de/docs/html/index.html
API #1 ist mit API #2 mischbar.
API #2 ist jedoch nicht mit API #3 oder #4 mischbar!
D.h. Direct und Retained Mode sind nicht mischbar!
Die konkrete obige ASCII-GFX API ist nicht PrĂĽfungsstoff, die dabei angewandten prinzipiellen Vorgehensweisen und Techniken jedoch schon (siehe Musterklausur).
← C Teil 10: ASCII-GFX Vektorgraphik | ● | C Appendix: Screenshots →