Explodierende Zeichen auf einer Matrixanzeige

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    • Explodierende Zeichen auf einer Matrixanzeige

      Da ich immer wieder Geschenke brauch, bin ich gerade wieder am 'Andenken' einer neuen Idee.
      Es wäre eine Uhr (wer hätte das gedacht), deren Anzeige von Stunden und Minuten auf einem array von max7219 8x8-Ledmatrixen erfolgt. Allerdings wäre die Gesamtmatrix deutlich größer, als für den Uhrzeittext nötig, sodass rings um den Text Platz ist. Beim Minutenwechsel soll jetzt der nicht mehr gültige Teil explodieren, es soll so eine Art Funkenregen dargestellt werden und wenn alle Funken 'zu Boden gefallen' sind, bleibt ein leerer Platz. Auf den fällt dann von oben die neue Ziffer. Fertig, die Zeitanzeige ist wieder vollständig und aktuell. Um das zu realisieren stelle ich mir 2 Bildspeicher vor, ein bit entspricht einer Led der Gesamtmatrix. In den ersten wird der Uhrzeittext über eine font-Tabelle reingeschrieben und über die max7219 zur Anzeige gebracht. In einer data-Tabelle würde ich auch die Einzelbilder des Funkenregens ablegen. Ist jetzt eine Explosion einer Ziffer dran, würde ich in den 2. Bildspeicher ein Teilbild des Funkenregens kopieren, beide Bildspeicher mit 'or' verknüpfen und an die max7219 senden. Das sooft, wie es Teilbilder des Funkenregens gibt. Die 2 Bildspeicher deswegen, weil die Funken ja über die verbleibenden Ziffern drüber fliegen. Das kann ich mir jetzt alles gut vorstellen, nur, was mach ich mit der explodierenden Ziffer. Durch die 'or'-Verknüpfung bleibt die ja zunächst unverändert, was ja in den ersten Bildern des Feuerregens passen würde, aber dann, wenn die Funken weit genug weg sind, muss die Ziffer auch weg sein. Wenn ich jetzt den Zeittext ohne diese Ziffer während des Funkenregens neu in den Bildspeicher schreibe, gibt das sicher einen Hakler im Ablauf. Sollte ich für jede Ziffer einen eigenen Funkenregen hinterlegen und bei Beginn der Explosion den Zeittext ohne diese Ziffer in den Bildspeicher schreiben und dann mit der 'or'-Verknüpfung aus dem 'Explosionsbildspeicher' zur Anzeige bringen? Das sollte ohne Hakler gehen.
      Hat jemand Ideen dazu?
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hm, der Funkenregen ist aber in Höhe und Breite größer als die Ziffer.
      Etwas konkreter mein angedachter Aufbau: 2 'Stangen' aus 6 Matrixen übereinander, ergibt eine Gesamtmatrix 48 x 16 Leds. Die Bildspeicher bestehen aus je 48 words. Eine Ziffer braucht ein Raster von 5 x 7 Leds, wird als 5 words in der font-Tabelle abgelegt. Der Funkenregen sollte an der breitesten Darstellung vielleicht 12 pixel breit sein, dass heißt ein Einzelbild des Funkenregens braucht 12 words. Der Funkenregen besteht aus 20? Einzelbildern, damit ein Funke auch einen schönen Bogen fliegen kann. Ich würde halt den Bildspeicher mit dem Funkenregen an der Stelle der Explosion mit einem Teilbild füllen und beide Bildspeicher mit or verknüpfen und ausgeben - neues Funkenbild einkopieren - wieder mit or verknüpft ausgeben...

      Varianten des Funkenregens wären natürlich schöner.
      (wer friedlicher eingestellt ist, könnte die Ziffer auch schmelzen und wegfließen lassen)
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Hm, ich hab' zB die Ziffer '0', die 5 pixel breit ist und 7 pixel hoch. Die Unterkante der '0' steht in der Gesamtmatrix auf der 3. Ledreihe von unten. Somit sind über der '0' 6 Ledzeilen. Wenn jetzt die '0' explodiert, dann fliegen die pixel, die die '0' bilden in verschiedenen Bögen weg, die oberen pixel fliegen steil nach oben durch die 6 Ledzeilen über der ursprünglichen '0' und fallen dann seitlich nach unten. So kommt man auf 22 Einzelbilder (6 Zeilen hoch + 16 Zeilen runter), bis ein oberer pixel der '0' unten ankommt. Wenn die '0' 5 pixel breit ist, dann wird die äußerste 'Flugbahn' eines pixels nochmal 5 pixel von der '0' entfernt sein. Das heißt für ein Bild des Funkenregens brauche ich 15 words, das 22x und dann für jede der 10 Ziffern. Ist viel, sähe aber gut aus. Oder halt anders geschickt programmiert :D , da fehlt mir grad' die Idee.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Du hast , je nach zu zerstörender Zahl, ja alle Ausgangs-Pixelpositionen.
      Du benötigst demnach ein Array, welches für die maximal mögliche Anzahl Pixel eines Zeichen, die X/Y Position enthält.
      Dein Vorhaben ist, alle Pixel auf Y=0 fallen zu lassen, wenn wir Ymin als "Boden" mit 0 annehmen.
      Ich würde Anfangs einen Sinus berechnen, um die Pixel in einem leichten Aufschwung dann abstürzen zu lassen. Um beim Absturz nicht eine gerade Linie zu bekommen,
      würde ich per Zufall eine X-Abweichung programmieren (Random). Die X/Y Steps werden in festen Zeitrahmen berechnet und dargestellt.
      Sind alle Y=0, dann ist der Vorgang beendet.
      Code first, think later - Natural programmer :D
    • @six1 dein Vorschläge sind gut, aber mehr für ein feines Raster, dein's ist Lego, ich hab' mehr Duplo, also sehr, sehr grob. Die Bandbreite für x liegt so bei 5, also der Wert von x eines pixels ändert sich maximal um 5 Zähler, bei einer max y Bandbreite von 16.
      Die Idee, für jeden pixel aus dem 5x7 array, innerhalb dessen das Ziffernzeichen steht, ein 'Flugbahnfilmchen' anzulegen und diese Filmchen, je nachdem welcher pixel für das Zeichen verwendet werden, zu kombinieren, wäre schon auch denkbar, gibt aber auch einen ziemlichen Sack von Daten.
      So ganz theoretisch geht's wohl nicht so einfach. Ich werd' doch mal eine Matrix zusammen basteln.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Wahrscheinlich, ich denke an die 8x8 Einzelmatrixen, Ledabstand 5mm (ca.) und die zur Gesamtmatrix mit 48x16 (40x16 langt vielleicht auch schon) Leds kombiniert. Dein Vorgehen wäre für Graphik-Lcds das passende.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • @tschoeatsch
      hatten wir gerade Vollmond?? Aber die Idee ist klasse.
      Eine Explosion geht ja meist von einem Punkt aus und expandiert dann in den Raum.
      Wenn du also deine Ziffer erst in sich zusammenfallen läst, vielleicht 2*3Pixel, um den
      entstandenen "Punkt" dann explodieren zu lassen,könntest du den Funkenregen als
      einmaliges Event speichern.
      Ich denke , das zusammenfallen lassen der Ziffern ist dann das kleinere Problem.
      Ob es dann jemand merkt, das die Explosion immer gleich aussieht, keine Ahnung.
      Aber wer guckt sich schon Minute für Minute die Explosion an, zumal ja das
      Zusammenfallen der Ziffern ja jedesmal anders ist.
      Nur so als Idee.

      Detlef
      Leichtsinn ist kein Mut, Vorsicht keine Feigheit.
    • @Ramby01 es geht schon in die von dir vorgeschlagene Richtung, nur braucht es halt noch mehr datas, eigentlich ziemlich viele...

      da ist dann der Tipp von @Dekaman sehr platzsparend. Um das bisschen abwechslungsreicher zu machen, kann das Zentrum der Explosion von Ziffer zu Ziffer eine unterschiedliche Position einnehmen. Ist mal einen Programmierversuch wert.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Die ganze Ziffer - poff, weg - was bleibt ist der freie Platz, der dann zB. durch eine von oben herunter fallende Ziffer wieder belegt wird.

      Wenn jetzt 12:45 angezeigt wird, dann explodiert die 5, es wird kurz 12:4 gezeigt, bis die 6 von oben fällt und dann 12:46 angezeigt wird.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------