[Delphi] Konsola jak w grach FPS

0

Witam!
Po nocach śnią mi sie koszmary związane z tym problemem ;) Chodzi o konsolę, która działąłaby jak konsola w grach FPS chociażby.

Mam parser który oddziela wyrazy od siębie i zpisuje je do tablicy. I jak na razie zrobiłem bardzo prosty projekt takiej konsoli. Wszystko opiera się na if'ach, i zdażeniach. Z tego powodu powstaje bałagan w kodzie, bo jeżeli mam powiedzmy 20 komend + każda z nich posiada przynajmniej 2 argumenty, to robi się bałagan. Wszystko znajduje się w jednej procedurze "OnCommand". Takich "if'ów' jest masa i przez to dodawanie kolejnych komend jest uciążliwe.

Moje pytanie brzmi natępująco: Jak zrobić to lepiej?

Najlepszym wyjściem pewnie byłoby zrobienie jakiejś tablicy zawierającej wyraz na który program ma zareagować i co ma potem zrobić, ale kompletnie nie wiem jak się za to zabrać. Chciałbym, żeby dodawanie komend było łatwe, a kod żeby był czytelny, i co za tym idzie, łatwo możnaby poprawiać w nim błędy.

Jeśli ktoś wie jak to zrobić, prosiłbym o odpowiedź + ew jakiś przykład.

Pozdrawiam.

0

Chodzi ci nie o wyswietlanie tylko o komendy.

Po pierwsze parsujesz sobie wszystkie komendy np.

function stringtocardinal(s : string) : cardinal;
begin
s := lowercase(s);
result := UNKNOWN;
if pos('gl_2_bytes',s) > 0 then result := GL_2_BYTES;
if pos('gl_2d',s) > 0 then result := GL_2D;
if pos('gl_3_bytes',s) > 0 then result := GL_3_BYTES;
if pos('gl_3d',s) > 0 then result := GL_3D;
if pos('gl_3d_color',s) > 0 then result := GL_3D_COLOR;
if pos('gl_3d_color_texture',s) > 0 then result := GL_3D_COLOR_TEXTURE;
if pos('gl_4_bytes',s) > 0 then result := GL_4_BYTES;
if pos('gl_4d_color_texture',s) > 0 then result := GL_4D_COLOR_TEXTURE;
if pos('gl_accum',s) > 0 then result := GL_ACCUM;

kazdej funkcji nadajesz jakies tam wartosci

a swoje nowe komendy jak chcesz dodac to dodawaj do jakiejs tablicy

i uzywaj tej funkcji wyzej tylko innej nie problem jest napisac parser do takiego czegos zeby ci kod sam napisal w jakims osobnym unicie, nie jest to aż takie wolne jak się wydaje

swoją drogą:
http://www.gamedev.pl/articles.php?x=view&id=219</quote>

0
Komorkowy_dzony napisał(a)

swoją drogą:
http://www.gamedev.pl/articles.php?x=view&id=219

Fajnie... Tylko, ze tam jest w C++

0

No i co z tego?

0
Komorkowy_dzony napisał(a)
function stringtocardinal(s : string) : cardinal;
begin
s := lowercase(s);
result := UNKNOWN;
if pos('gl_2_bytes',s) > 0 then result := GL_2_BYTES;
if pos('gl_2d',s) > 0 then result := GL_2D;
if pos('gl_3_bytes',s) > 0 then result := GL_3_BYTES;
if pos('gl_3d',s) > 0 then result := GL_3D;
if pos('gl_3d_color',s) > 0 then result := GL_3D_COLOR;
if pos('gl_3d_color_texture',s) > 0 then result := GL_3D_COLOR_TEXTURE;
if pos('gl_4_bytes',s) > 0 then result := GL_4_BYTES;
if pos('gl_4d_color_texture',s) > 0 then result := GL_4D_COLOR_TEXTURE;
if pos('gl_accum',s) > 0 then result := GL_ACCUM;

kazdej funkcji nadajesz jakies tam wartosci

Ja mam już parser który wyciąga wszystko z wpisanego tekstu, ta procedura tutaj robi praktycznie to co moja, bo mam taką samą konstrukcje, czyli np.:

if parser.strings[0] = 'close' then Application.Terminate;

i w taki sposób dodaje komendy, oczywiście w tym przykładzie jest mało kodu ale dajmy na to taki przykład:

if parser.strings[0] = 'dodaj' then
    begin
      if parser.count<2then begin AddText('/n Nie wpisałeś opcji.',Text,true); Exit; end else
      if parser.count<3 then begin AddText('/n Nie podałeś wszystkich argumentów.',Text,true); Exit; end;
      if is_IntInStr(parser.strings[1]) and is_IntInStr(parser.strings[2]) then
      begin
         a:=StrToInt(parser.strings[1]);
         b:=StrToInt(parser.strings[2]);
         EmptyLine;
         AddText('^7Wynik:',Text,false);
         EmptyLine;
         AddText('^3'+parser.strings[1]+' + ^3'+parser.strings[2]+' = ^6'+IntToStr(a+b),Text,true);
      end else raise ENotInteger.Create(CNotInteger);
    end;

to tylko dodaje dwie liczby, przy okazji sprawdza czy podane argumenty są typu Integer i drukuje za pomocą procedury AddText stosowny napis (te "ptaszki" z liczbami służą do kolorowania tekstu), albo wyświetla błąd. taka prosta a taka długa (pomijając to, że można to w inny sposób napisać, bo to jest na razie nie ważne chciałem pokazać jak wygląda dodawanie długich procedur).

Chciałbym ten proces zautomatyzować, tzn wszelki tekst na jaki ma program zaskoczyć najlepiej jakby był w jednym miejscu, a nie rozsiany po if'ach bo nie które funkcje bedą się składały z kilku stringów, i trzeba dodawać kolejne if'y, case'y w jednej procedurze. najlepiej byłoby wykorzystać tablice, i uruchamiać oddzielne funkcje w osobnym unicie, tylko jak zrobic to sprawnie, żeby potem sie nie pogubić.

A i jeszcze jedno, to wszystko jest używane do gry typu SUD (Single-User Dungeon) i opcji bedzie masa, poza tym parser który mam ma własność OnCommand, która jest po prostu Eventem gdy przkeazywane są do niego informacje, i wszystko musiałoby być w tej procedurze.

Pozdrawiam i czekam na odpowiedź.
(Pewnie jest prostsza niż mi sie wydaje)</delphi>

0

dodajesz komende
pozniej parsujesz kazda komende function stringtocardinal(s : string) : cardinal; poszczegolne rzeczy oddzielasz jakims znakiem np. ; i tyle nie wiem o co ci chodzi

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