CC2

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
PongSchiffe-Versenken, 4-Gewinnt, Tron, CentipedeTetris, Tanks, Asteroids, Space Invaders, Breakout, Autorennen, Flappy BirdPacman, Dig-Dug, Boulder-DashTypisches 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_spriteenable_spriteSprite erzeugen
  set_sprite_dataset_sprite_dataSprite-Daten definieren (als int Array)
  set_sprite_textset_sprite_textSprite-Daten definieren (als C- bzw. Text-String)
  set_sprite_positionset_sprite_positionSprite-Position definieren
  detect_sprite_collisiondetect_sprite_collisionSprite-Kollisionserkennung
  hide_spritehide_spriteSprite unsichtbar machen
  show_spriteshow_spriteSprite sichtbar machen
  bake_spritebake_spriteSprite in das Spielfeld hineinbrennen
  disable_spritedisable_spriteSprite 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

Options: