[delphi] Symulator zielonej fali

0

Witam, to mój pierwszy temat tutaj :)

Dostałem zadanie z informatyki - projekt - stworzenia symulatora zielonej fali, czyli jadą sobie samochody i zatrzymują się przed pasami kiedy mają czerwone światło. Trzeba to zrobić w aplikacji okienkowej w delphi7. Ma to wyglądać mniej więcej tak:

|car1|->.........|car2|->........|car3|->..|pasy-zielone|.........|car4|.|car5|.|pasy-czerwone|.........

....... - ulica
-> - samochód się porusza

Jak widać, samochody mają przejeżdżać przez pasy kiedy jest zielone światło, a kiedy jest czerwone zatrzymywać się przed pasami i później mają się ustawić jeden za drugim w kolejce. Kiedy pojawi się zielone, znowu jadą - najlepiej gdyby startowały w miarę realistycznie czyli najpierw rusza pierwszy z kolejki, później następne.

Jestem bardzo początkujący, ale nauczenie się kilku zagadnień nie stanowi dla mnie problemu, jednak prosiłbym o podpowiedź które zagadnienia byłyby mi potrzebne do wykonania tego zadania.

Oto co wymyśliłem do tej pory, jeśli nie da się tego zrobić tak jak zacząłem proszę o skierowanie mnie na właściwą drogę :P

Na początku trzeba podać natężenie ruchy - ile pojazdów przejeżdza na godzinę przez tę ulicę. Wczytywana jest zmienna "natezenie" oznaczająca ilość pojazdów. Samochody przejeżdzają co sekundę, więc maksymalnie może być 3600 aut na godzinę. Jeśli natężenie wynosi np. 1800, to wtedy następuje test: losowana jest liczba z przedziału 1 - 3600, jeśli jest większa od 1800 to tworzony jest Tshape (który odzwierciedla samochód) i jest zapisywany do tablicy "samochody".

procedure TForm1.Timer4Timer(Sender: TObject);
begin
randomize;
inc(e);
test[e]:=random(3600+1);

if natezenie>test[e] then begin
s:=tshape.create(form1);
s.Parent:=Form1;
s.Top:=250;
s.Left:=64+s.left;
s.Width:=37;
s.Height:=17;
s.Brush.Color:=clWhite;
s.Brush.Style:=bsSolid;
s.Shape:=stRectangle;
s.Pen.Color:=clBlack;
s.Pen.Mode:=pmCopy;
s.Pen.Style:=psSolid;
s.Pen.Width:=1;
s.Visible:=true;
end;

if natezenie>test[e] then inc(a);
samochody[a]:=s;

end;

A więc mam tutaj tworzące się co sekundę Tshape zapisane w tablicy samochody[a].

Co chciałbym z tym zrobić:
-Chcę żeby samochody z tej tablicy zachowywały się tak jak opisałem na początku. Zamierzam to zrobić poprzez stworzenie timera, który będzie po prostu dodawał "left" do każdego Tshape jaki się pojawi.
-Kiedy wyjadą poza teren drogi, chcę żeby się po prostu zatrzymały i żeby program o nich zapomniał. Czyli kiedy ich parametr "left" wyniesie ileśtam, przestanie im się dodawać "left".
-Chce kontrolować ich ruch za pomocą Timera. Jeśli jeden samochód napotka czerwone światło lub inny samochód przed sobą w jakiejś odległości od siebie, jego "left" przestanie się dodawać. Jeśli światło będzie zielone, left znowu się zacznie dodawać.
-Na końcu zlicza się ilość samochodów które przejechały i największa długość kolejki samochodów przed pasami.

Czego nie umiem zrobić:
-Nie wiem jak jednocześnie kontrolować ruch wszystkich aut z tablicy jednym Timerem.

Pytania:
-Czy mój pomysł jest dobry i czy da się to tak zrobić?
-Czy jest jakiś łatwiejszy sposób?
-Czego powiniennem się douczyć przed zrobieniem tego zadania?

0
Pivu napisał(a)

Czego nie umiem zrobić:
-Nie wiem jak jednocześnie kontrolować ruch wszystkich aut z tablicy jednym Timerem.

pętla.

0

Ciekawe ile już zrobileś czekając na odpowiedź. Ja z nudów chcialem sprawdzić czy coś prostego wykombinuje. Nie ma tutaj zielonej fali, ani więcej niż
jednego samochodu na danym pasie, ale działa jak należy. Pobierz z adresu: http://www.speedyshare.com/fi[...]07/symulacja_sygnalizacji.exe i
jak interesuje Ciebie źródło - to moja cena 100 PLN. Ogółnie napisać to nie było trudno, tylko trochę posiedzieć i pomyleć, dałem rade mimo żem lama.

0

Ech niektórzy to dostają fajne zadania, u mnie na uczelni zadawali same pierdoły.
Tak dla zabawy sobie coś takiego zrobiłem - exek do ściągnięcia TUTAJ.
Podobnie jak Olesio, nie chciało mi się już dodawać kolejnych samochodów, ale sposób wykrywania innych aut działałby tu na tej samej zasadzie co wykrywanie pasów, więc nie jest dużym problemem to przerobić.
Proste zadanie, całkiem przyjemne do zrobienia. Teraz jak już masz dwa przykłady to chyba zrobienie czegoś takiego nie będzie stanowiło problemu ? Ewentualnie zawsze możesz zakupić kod Olesia (mój nie jest na sprzedaż - nie będę się innym w paradę wpychać, Olesio był pierwszy :)).

0

Poul: no właśnie mnie też zaciekawiło to zadanie dlatego sprawdzilem sam z przyjemnością, czy w ogóle jestem, w
stanie to zakodować. Muszę przyznać. U Ciebie jest trochę ładniejsza grafika, a i żółte świeci się po czerwonym, to
też muszę u siebie poprawić oraz dorobić zmianę prędkości poruszania się samochodów. Tylko, że z tego co sobie u
Ciebie pozwalilem podejrzeć to Ty masz na sztywno załadowane obrazki do Image, ja mam to ładowane z zasobów
gdzie poza jpgiem z drogą są gify, bo pozwalają na ustawienie przeźroczystości oraz mniej zajmują niż bitmapy, a
poza tym obsługa świateł oraz poruszania samochodów jest ładnie umieszczona w osobnym module, jako obiekty.

0

Drogę oraz linię przerywaną narysowałem na Canvasie formy, auta to obrazki, sygnalizator to też obrazki (choć tutaj efektywniej byłoby je narysować na canvasie, po prostu mi się nie chciało z tym bawić). Pasy dałem jako Image, ponieważ mogę w kodzie sprawdzać kolizję z jego brzegami, więc przesunięcie pasów nie wpłynie na sam kod. Obrazki w formacie PNG, choć mogłem je przerobić jak Ty, czyli na GIFy. Tak czy siak, kilka KB więcej zasobów nie zrobi tutaj różnicy.
Oczywiście, to nie jest konkurs kto zrobi lepsze, ja jeszcze sporo mam do nauki, a pisanie programów sprawia, że zawsze sobie coś przypomnę, czego dawno nie robiłem :). Więc nie traktuj mojego programu jak konkurencji, to po prostu zabawa - skoro już nad tym posiedziałem to udostępniłem efekty.

0

Ja też to traktuje jako zabawę. Napiałem to żeby zobaczyć czy dam radę. U mnie sygnalizator jest rysowany na Canvasie, a
pasy też śa Image żeby łatwiej było wykryć kolizję. Tylko że wszystko u mnie tworzone jest dynamicznie jedynie Image od
świateł mam umieszczony, ale kod go odpowiednio ustawia. A faktycznie u Ciebie ładnie wyszla droga i pasy, jakieś chyba
miałem zaćmienie bo nie wpadłem żeby sprobować narysować to na Canvasie. Zaraz to dopracuje. Ale znająć życie - to jak
tutaj często bywa, pytający nie odpisze nam w ogóle, będzie pewnie chcial gotowca z kodem za darmo, ale może się mylę.

0

Przyznaję bez bicia, że zanim zacząłem pisać swoją wersję, sprawdziłem w zasobach Twojego exeka ilu imagów użyłeś - stąd wiem, że Twój sygnalizator jest rysowany ręcznie. Mój też powinien taki być, ale po prostu szybciej mi poszło zrobienie 7dmiu PNGów, wgranie ich do Imagelisty i podmienianie obrazków w osobnej funkcji w zależności od światła. Wszystkie moje PNG dołączone do projektu zajmują 15.9 KB, więc nie jest to jakaś przerażająca wielkość - dlatego tego nawet nie kompresowałem. Niestety używam Delphi 2010, a wielkość exeków w każdym kolejnym Delphi znacząco rośnie (pusta forma w D2010 ma 800 KB).
Co do autora tematu to pewnie już dawno wykasował 4programmers.net z ulubionych (o ile w ogóle je tam miał).

0

Hmmm, pewnie pytający Nas już nie odwiedzi. A faktem jest, że ja użyłem gifów, bo png są ciutke większe chyba,
jednak kiedy używałem modułu pngimage w Delphi 7 Personal i przekonwertowanych pod IrfanView obrazkow - z
wybranym kolorem przezroczystości niestety nie mogłem jej uzyskać. Zadziałal moduł gifimage dopiero, może coś
źle robilem, bo nie znam się praktycznie na edycji grafiki i o jej formatch też mało wiem. Btw, ja mam jeszcze na
dysku Delphi 3 powinno się pod nim też dać skompilować i exek będzie pewnie znacznie mniejszy, po spakowaniu
go UPXem. A skoro już rozwinąl się wątek to mam do Ciebie pytanie, jakie własności ma TTrackBat jaki użyłeś, o
ile to standardowy z Delphi 2010, bo w siodemce Trackbar jest jakiś "kulawy" -- nie jest przeźroczysty jak ten u
Ciebie, jak rownież nie można klikać na pole obok suwaka. Nie mam doświadczenia z tym komponentem, a i pod
edytorem zasobu nie widzę całego dfma, dlatego jak możesz skopiuj, z widoku tekstu formatki jego własności tu.

0

Jeśli chodzi o obrazki to w D2010 ImageList obsługuje praktycznie każdy format (np. do ImageList bez problemu wczytujesz sobie JPEG, z tego co pamiętam D7 obsługiwał tylko PNG i BMP, wielkość obrazków w D2010 nie jest już ograniczona). Mówię o tym, bo to świetny sposób na automatyczne dołączanie każdego obrazka do zasobów exeka, w D7 strasznie kiepsko to wyglądało.
Jeśli chodzi o przeźroczystość to obraz musi posiadać kanał Alpha (niestety większość przeglądarek graficznych ten kanał domyślnie 'wycina'). Najlepiej tutaj użyć albo formatu PNG albo GIF i programu, który ten kanał potrafi zapisać (ja używam programu do obróbki ikon, który obsługuje każdy format graficzny i nie ma limitu rozmiarów obrazka, więc spisuje się świetnie do obróbki właściwie wszystkiego).
Co do TrackBara to jest to standardowy TrackBar - odpowiedzialna za ten efekt, który opisujesz jest właściwość "ShowSelRange". Niestety nie pamiętam, czy była ona dostępna w D7. Jednak standardowy TrackBar jest dość toporny, w necie można znaleźć lepsze zamienniki.

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