Autostradowe światła drogowe

0

Cześć.

Chcę napisać prostą symulację błyskających, ostrzegawczych świateł drogowych jakie można spotkać np na autostradach (kilkanaście połączonych kablem lamp typu flesz błyskających jedna po drugiej wskazują na przykład kierunek zwężenia drogi; taki b. szybki efekt domina; kojarzycie ocb?). Zastanawiam jak poprawnie zamodelować (i jakie) klasy aby rozwiązanie było w miarę rozsądne...

Przyjąć można że naszymi lampami błyskowymi będą zwykłe labele jedna obok drugiej na formatce. Paląca się ma w treści "0" a niepaląca się "_". Efektem działania byłoby zatem to, że co 2 sekundy przez zera "przebiega" szybko symbol podkreślnika.

Myślę, że:

  1. Przyda się klasa "FleshingLamp" z polem 'state' typu boolean reprezentująca pojedynczą lampę
  2. Klasa "LampsSequence", posiadająca tablicę (lub listę) FleshingLamp[] oraz metody start/stop fleshing.
  3. Jeszcze jakaś klasa typu "Driver" która sterowałaby tym "urządzeniem". Gdzieś trzeba powiązać obiekty FlashingLamp z konkretnymi labelami, dodać logikę (chyba jakiś Timer i TimerTask) odpowiedzialne za periodyczne odpalanie błysków... Nie wiem tylko gdzie

Proszę o rady ;)

0

Hmm, ja bym zaczął od KISS (Keep It Simple) - czyli nie komplikowania ponad potrzebę. Driver i LampsSequence, na ile je rozumiem, wyglądają na właśnie przesadne kombinowanie.

Z drugiej strony, fajnie żeby aplikacja była rozszerzalna - na przykład gdybyś po obsłudze autostrady chciał napisać też na wigilię software do świateł na choince ;)
Dlatego wypadałoby jakoś oddzielić ideę 'migającej lampy' od labela - ta 'lampa' to coś co można zapalić/zgasić i właściwie tyle Ci potrzeba.
Czyli najpierw tworzysz abstrakcyjny interfejs IŚwiatła (obsługującego na przykład getZapalona i setZapalona).
Następnie tworzysz konkretną implementację - na przykład ŚwiatłoLabelowe (bo ma być reprezentowane jako label) - które przy setZapalona zmienia swój tekst.

Jeśli masz już uniwersalne pojęcie światła (w zasadzie to jest coś jak jeszcze bardziej ogólny 'przełącznik' niż 'światło', ale...) możesz się zająć algorytmem migania.
To dalej można rozwiązać na wiele sposobów - ja bym do tego jeszcze nie mieszał mierzenia czasu - proponuję stworzyć klasę HighwayAlgorithm z metodą Update(float deltaTime) która powodowałaby symulację upłynięcia deltaTime sekund czasu rzeczywistego.

No i największy 'problem', czyli sama klasa HighwayAlgorithm - z tego co rozumiem, ma to wyglądać tak że masz kilka labeli/świateł ułożonych po kolei w postaci "0 0 0 0 0 0" i ma po nich 'przebiegać' w kółko pojedynczy "_". Najprościej chyba trzymać 1) indeks aktualnie zapalonego światła 2) ile sekund (a raczej jaka część sekundy) zostało do kolejnej zmiany stanu.

Czyli przy każdym update robisz coś w rodzaju:

update(deltaTime):
    timeLeft -= deltaTime      # minęło deltaTime sekund, czyli czas do zmiany stanu zmniejszył się o deltaTime sekund
    while timeLeft < 0:        # jeśli ilość czasu jaka została jest mniejsza od zera
                               # (while zamiast if gdyby deltaTime było przypadkowo większe niż FLASH_TIME - tak dla pewności)
        timeLeft += FLASH_TIME # FLASH_TIME to stała określająca co ile czasu się zmienia stan
                               # czyli co FLASH_TIME sekund znak '_' przesuwa się o jedną pozycję
        currentNdx += 1        # przesuwamy zapalone światło o jeden
        updateLights()         # zmieniamy światłom stan tam gdzie trzeba - tzn. jedno światło gaśnie, inne się zapala.

Powinna przyjmować w konstruktorze listę świateł które ma obsługiwać w kolejności w jakiej się mają zapalać.

HighwayAlgorithm trzymasz chociażby w oknie głównym, ważne żeby na nim cyklicznie (np. co 1/20 sekundy) wywoływać Update().

Hmm, mam nadzieję że w miarę jasno opisałem swój pomysł...

0

Tak, dzięki bardzo za te wskazówki ;)

0

Myślę, że:
Ja myślę, że za dużo myślisz, zamiast po prostu położyć na formę te labele, timera i oprogramować.

1 użytkowników online, w tym zalogowanych: 0, gości: 1