Maniac Mansion Mania Forum

MMM-Werkzeugkiste => Technik => Thema gestartet von: 1mal_volltanken am 08. April 2011, 17:46:44

Titel: Display-Anzeige integrieren
Beitrag von: 1mal_volltanken am 08. April 2011, 17:46:44
Hallo Leutz!

Ich interessiere mich gerade, wie Ihr eine aktive Display-Anzeige in einem Hintergrund integrieren würdet.

Sprich, solche, die als Temperaturanzeige, Gewichtsanzeige oder sonstige Meßfunktionen dienen und auf allen Stellen auch alle Zahlen anzeigen können (bspw. auf 3 Stellen alle möglichen Werte zwischen 000 und 999).
Dazu möchte ich gerne auch grafische Ziffern verwenden (kein Font).

Die konservative Lösung wäre, für jede Stelle jede Ziffer als Objekt einzufügen.
Für 3 Stellen würde das allerdings 30 Objekte benötigen und für 4 Stellen sogar 40, wenn man auf jeder Stelle alle Zahlen von 0-9 unterbringen möchte.
In technischer Hinsicht ist dieses Vorgehen natürlich Unsinn und schon wegen der Begrenzung der Objektanzahl nicht machbar.

Wie würdet Ihr das denn machen?


BG
der Volltanker

Titel: Re: Display-Anzeige integrieren
Beitrag von: 1mal_volltanken am 08. April 2011, 23:00:04
Obwohl, mir fiel das grad was ein:

Wäre das nicht möglich, bspw. bei 3-Stelligen-Ziffern drei Objects zu nehmen und diese als Views zu verwenden?

Es gäbe da sicher doch auch ne Möglichkeit, wie bei Hintergründen (SetBackgroundFrame) ähnliches mit Objekten zu machen, oder?
Eben, dass nicht eine komplette Animation abgespielt wird, sondern nur jeweils der bestimmte Frame eingeblendet wird.


BG
der Volltanker
Titel: Re: Display-Anzeige integrieren
Beitrag von: Cone Arex am 08. April 2011, 23:03:35
F1 -> Object functions?
Es gibt ein Befehl, mit dem man die Object-Grafik ändern kann. int object.Graphic = slot nummer; oder SetGraphic statt Graphic. Kenn den Befehl grad nicht auswendig.
Titel: Re: Display-Anzeige integrieren
Beitrag von: KhrisMUC am 11. April 2011, 16:03:32
Da gibt es verschiedene Möglichkeiten; persönlich würde ich die Zahl bei jeder Änderung neu zeichnen, und zwar auf ein DynamicSprite, das als .BackgroundGraphic eines GUIs gesetzt wird.

[ags]DynamicSprite*MyDisplay;

void UpdateDisplay(int value) {

  String s = String.Format("%03d", value);  // hier wird z.B. 47 zu "047"

  DrawingSurface*ds = MyDisplay.GetDrawingSurface();
  ds.Clear();

  int i, n;
  while (i < 3) {
    n = s.Chars - 48;   // hier mache ich aus den Zeichen des Strings die Ziffern, z.B. s.Chars[1] ist '4' bzw. 52 (ascii) und wird somit zur Zahl 4
    ds.DrawImage(i*20, 0, n + 15);   // die Ziffernsprites sind 18 Pixel breit, 2 Pixel Abstand -> i*20,  die Sprites haben die Slotnummern 15-24, -> n +15
    i++;
  }
  ds.Release();

  gMyDisplay.BackgroundGraphic = MyDisplay.Graphic;   // sprite als Hintergrund setzen (eigentlich nur einmal nötig)
}[/ags]

Der Vorteil eines GUIs liegt auf der Hand, es ist nämlich raumunabhängig. Ansonsten müsste ich für jeden Raum die drei oder vier Anzeige-Objekte erstellen.