Dziwny błąd zw. z Bar() w Graph;

0

Witam wszystkich na forum,

Jestem bardzo początkującym programistą, piszę swój pierwszy projekt w 2d:
Zauważyłem pewien błąd: gdy wywołuję rysunek w programie procedurami

procedure rect(a,b,c,d,color:word);
begin 
     setcolor(color); 
     setfillstyle(solidfill,color); 
     bar(a,b,c,d); 
end;

procedure draw_soldier(x,y:integer);
begin
      rect(x,y,x+64,y+64,lightgreen); {//tło pseudoobrazka}

      {//reszta elementów, które nie mają wpływu na problem; sprawdzone}

end;

Powinienem otrzymać zielone pole 64x64: tymczasem po bokach pola występują dwa szare paski na całym boku, o wcięciu ok. 8px w głąb pola. Przy Initgraph(); korzystam z VGI oraz VGIHi.
Nie wiem, co może być przyczyną. Szukałem w Google przez ~0,5h - nic.

Dodatkowo proszę o pomoc z trybem 13h - nie wiem, jak wyświetlić obrazek jedynie na części okna, dodatkowo mogąc swobodnie poruszać się po drugiej.

CComando

0

Powinienem otrzymać zielone pole 64x64

Kto ci tak powiedział.

Przy Initgraph(); korzystam z VGI oraz VGIHi.

Jeżeli używasz nowoczesnego kompilatora to nie ma to znaczenia, jeżeli używasz TP to powinieneś używać nowoczesnego kompilatora.

Dodatkowo proszę o pomoc z trybem 13h - nie wiem, jak wyświetlić obrazek jedynie na części okna, dodatkowo mogąc swobodnie poruszać się po drugiej.

Kolega używa DOSa, tak? Czy może kolega nie bawi się w coś czego się używało 20 lat temu i chce się zainteresować np. OpenGLem?

0

@CComando: mamy XXI wiek; TP wyszedł z użytku już dawno temu, wraz z przerwaniami.
My, w roku 2012 mamy dostęp do magicznego WinAPI/OpenGL/DirectX i innych pożytecznych i dobrze opisanych rzeczy...

0

@-123oho:

Powinienem otrzymać zielone pole 64x64
Kto ci tak powiedział.

No... wydaje mi się, że to jest dosyć logiczne, prawda? Poza tym, jeśli nawet nie wpisuję żadnego szarego elementu do kodu źródłowego, to skąd on tam jest?

Kolega używa DOSa, tak? Czy może kolega nie bawi się w coś czego się używało 20 lat temu i chce się zainteresować np. OpenGLem?

OpenGL potem; zresztą próbowałem go nieco użyć w C++: bez lepszych efektów. Tzn. oczywiście, nie nastawiam się od razu na nie wiadomo co, toteż odpuściłem sobie GLut-a i obecnie skupiłem się na 13h. Każda wiedza się przyda ;)

Jeżeli używasz nowoczesnego kompilatora to nie ma to znaczenia, jeżeli używasz TP to powinieneś używać nowoczesnego kompilatora.

Szczerze mówiąc, to chyba było jedyne Twoje pomocne zdanie... tak czy siak - dzięki za podpowiedź.

@Patryk27

@CComando: mamy XXI wiek; TP wyszedł z użytku już dawno temu, wraz z przerwaniami.
My, w roku 2012 mamy dostęp do magicznego WinAPI/OpenGL/DirectX i innych pożytecznych i dobrze opisanych rzeczy...

WinAPI itp. jeszcze nie ogarniam. Jak dla mnie, to Pascal ma bardziej walory edukacyjne - jestem maturzystą i chciałbym dobrze zrozumieć logikę programów oraz komputera. Zresztą - ale aż wstyd się przyznać - przed Pascalem bawiłem się w pisanie gier... na wiersz poleceń Windowsa. :D Ale każdy musi od czegoś zacząć.

0

Każda wiedza się przyda

Mogę Cię zapewnić, że korzystając z tego trybu graficznego (tj.13h), niczego pożytecznego się nie nauczysz (raczej będziesz się - tak jak teraz - zamartwiał, że coś nie działa, a powinno), a już na pewno nigdzie więcej tego nie będziesz wykorzystywał.

WinAPI itp. jeszcze nie ogarniam

ZenGL jest bardzo przejrzysty i łatwy w obsłudze; jest to silnik graficzny oparty na OpenGL.
Jeżeli nawet jego nie zrozumiesz, pora wrócić do konsoli i łatwiejszych programów.

chciałbym dobrze zrozumieć logikę programów oraz komputera

To się zacznij uczyć Assemblera, nie Pascala.
Pascal to język wysokopoziomowy.

na wiersz poleceń Windowsa.

Czyli jak prawie każdy.

0

@Patryk27
Tak, ale Pascala będę miał na maturze - chwilowo 13h może się naprawdę bardzo przydać, biorąc pod uwagę moją rozszerzoną z informatyki... Za wszelakie *GL/*API/DirectX (nie znam się na nazwach) wezmę się dopiero na studiach - teraz mi się nie przydadzą.

To się zacznij uczyć Assemblera, nie Pascala.

W sumie, dobry pomysł. Zabiorę się za to w roku szkolnym.

Wracając do tematu: czy ktokolwiek zna przyczynę błędu/jego rozwiązanie?

(edit) Zresztą, nie połapałbym się teraz w C++/Javie. Pascal jest dosyć prosty (możliwe, że przez DOS-a). Poza tym, chodzi mi o projekty gier - zawsze lubiłem tworzyć coś pod swoje potrzeby, niż korzystać z cudzych projektów, które nie muszą mi się podobać. Wyobraźnia ;)

0

Istnieje wersja FPC dedykowana dla DOS'a.
Sprawdź czy tam też to występuje, ponieważ na pierwszy rzut oka - w tym kodzie nie powinno być żadnego problemu.

0

Nie wiem, może coś robię źle, ale w FPC po przekompilowaniu nie reaguje klawiatura.
Za to problem z paskami chyba rozwiązany, ale nie mam pewności.
Wersja to i386-win32.
Mam tak:

procedure button(x,y,color:word;text:string;id:byte);
begin 
   rect(x,y,x+192,y+32,color); 
   setcolor(white); 
   outtextxy(x+32,y+12,text); 
   bx[id]:=192; 
   by[id]:=32;     {//w sumie, nie wiem, po co te tablice, ale do czegoś mi służyły}
end;

procedure act(id:byte);
begin b[id]:=40; abut:=id; end;

procedure deact(id:byte);
begin b[id]:=0; end;

procedure limit(ldn,lup:integer);
begin limitu:=lup; limitd:=ldn; end;

procedure menucase(a,b:byte);
begin limit(a,b); key:=readkey; deact(abut);
     if key=#72 then abut:=abut-1;     {//po wciśnięciu strzałki zmienia nr aktywowanego przycisku}
     if key=#80 then abut:=abut+1; 
     if abut<a then abut:=b;               {//jeśli użytkownik wciśnie strzałkę przy aktywowanym przycisku skrajnym}
     if abut>b then abut:=a;
     act(abut);                                   {//aktywuje przycisk o numerze abut}
end;

procedure menu;
begin
repeat
     cleardevice;
     button(b[1]+60,40,lightgray,'START',1);
     button(b[2]+60,80,lightgray,'OPCJE',2);
     button(b[3]+60,120,lightgray,'WYJSCIE',3);
     menucase(1,3);
until key=#13;   {//enter}
end;

Sory, jeśli przyprawiłem o palpitację/zawał, ale przywykłem, że robię rzeczy po swojemu. Bardzo wielka tragedia z tym kodem?

W każdym razie w TP wybór menu działał, ale w FPC już nie reaguje na #72, #80 i Entera.

(edit)

Edit: być może FPC założył obsługę klawiatury na konsolę, a Ty próbujesz przy sfocusowanym oknie?

Kurde... ale ja głupi... rzeczywiście...
Uruchamiają się dwa okienka: jedno konsolowe, drugie graficzne; w graficznym nic się nie da zrobić, natomiast gdy wcisnę Enter w konsoli, wychodzi z pętli w

procedure menu; 

Powiesz mi jeszcze, jak to zmienić? ;D

(edit2)
W porządku, dziwne szare paski zniknęły, ta część problemów rozwiązana.

0

Spróbuj skorzystać z biblioteki WinGraph (w tym WinCRT do obsługi tekstu i WinMouse do myszki); oferuje ona to samo, co zwykła Graph (a nawet więcej), a jest praktycznie taka sama w obsłudze.
Nic innego mi na myśl nie przychodzi.
Odnośnie kodu -
1.Wklejaj go do znaczników <code><code class="delphi">...</code></code> to będzie bardziej czytelny.
2.

procedure limit(ldn,lup:integer);
begin limitu:=lup; limitd:=ldn; end;

Kod należy formatować nawet w przypadku takich prostych funkcji.
Niewiele więcej jestem w stanie w tej chwili powiedzieć...


Edit: być może FPC założył obsługę klawiatury na konsolę, a Ty próbujesz przy sfocusowanym oknie?
0

Kod należy formatować nawet w przypadku takich prostych funkcji.

Co masz na myśli? Czy chodzi Ci o coś takiego:

procedure limit(ldn,lup:integer);
begin 
   limitu:=lup; 
   limitd:=ldn; 
end;

Niewiele więcej jestem w stanie w tej chwili powiedzieć...

Dobra, to jakbyś miał jakiś pomysł, to czekam.

0

Edit: być może FPC założył obsługę klawiatury na konsolę, a Ty próbujesz przy sfocusowanym oknie?

W Win32 to normalne zachowanie. Użyć WinGraph.

Wersja to i386-win32.

To jest PORT nie WERSJA. Pewnie masz 2.6.0 gdzie na Win32 fokus klawiszy jest na konsoli.

Uruchamiają się dwa okienka: jedno konsolowe, drugie graficzne; w graficznym nic się nie da zrobić, natomiast gdy wcisnę Enter w konsoli, wychodzi z pętli w

A co ma się dać zrobić w graficznym.

Powiesz mi jeszcze, jak to zmienić? ;D

Zmień to tak żeby robiło to co chcesz żeby robiło. I tak swoją drogą, to być może wiesz że tutaj nie pomaga jedna osoba i się wypowiadasz do ogółu?

{//w sumie, nie wiem, po co te tablice, ale do czegoś mi służyły}

Tak jest! Piszę kod, nie wiem po co!

Dobra, to jakbyś miał jakiś pomysł, to czekam.

CZEGO oczekujesz od nas. Gotowca? Pomysłu co ma robić twój kod? Niech wychodzi zanim wejdzie, bo graph to przeżytek który jest ze względu na platformy typu DOS.

0

@-123oho

To jest PORT nie WERSJA. Pewnie masz 2.6.0 gdzie na Win32 fokus klawiszy jest na konsoli.

No tak, masz rację, nie rozróżniłem, uczę się. Tak, mam 2.6.0..

A co ma się dać zrobić w graficznym.

Po prostu chodzi mi o "zlepienie" tych dwóch okienek w jedno, jak to wychodziło w TP.

Zmień to tak żeby robiło to co chcesz żeby robiło. I tak swoją drogą, to być może wiesz że tutaj nie pomaga jedna osoba i się wypowiadasz do ogółu?

Jejku, zapomniałem napisać "@", to już od razu katastrofa. A gdybym umiał tak zrobić, to nie zakładałbym tematu.

Tak jest! Piszę kod, nie wiem po co!

Na początku do czegoś mi służyły, potem zmieniłem sposób działania kodu, a tablice zostawiłem, bo mogły się przydać. Gdybym usuwał wszystko, co chwilowo niepotrzebne, to w razie potrzeby powrotu do rzeczy wcześniej napisanych byłby istny armagedon. Przedstawiłem pełny fragment kodu, na wypadek, gdyby np. te tablice były przyczyną.

CZEGO oczekujesz od nas. Gotowca? Pomysłu co ma robić twój kod?

I po co te nerwy? Co Ci to da? Koncepcję programu już mam od dawien dawna, to raz. Dwa, gotowca nie oczekuję - nie należę do leniwców. Trzy: czytaj ze zrozumieniem, w temacie napisałem, że jestem bardzo początkujący, co oznacza, że mogę oczekiwać jakiejkolwiek pomocy.

Mówisz, że mam użyć WinGraph? Czy to rozwiąże problem całkowicie?

0

w razie potrzeby powrotu do rzeczy wcześniej napisanych byłby istny armagedon.

System kontroli wersji przyjacielem programisty :P

Czy to rozwiąże problem całkowicie?

WinGraph jest dedykowane pod Windowsa (jest to wrapper dla api), więc: raczej tak.

0

Jejku, zapomniałem napisać "@", to już od razu katastrofa. A gdybym umiał tak zrobić, to nie zakładałbym tematu.

Czyli pytanie zadajesz wyłącznie do Patryka? Proszę bardzo.

Po prostu chodzi mi o "zlepienie" tych dwóch okienek w jedno, jak to wychodziło w TP.

Nikt nie mówił o Wingraph, co nie?

Na początku do czegoś mi służyły, potem zmieniłem sposób działania kodu, a tablice zostawiłem, bo mogły się przydać. Gdybym usuwał wszystko, co chwilowo niepotrzebne, to w razie potrzeby powrotu do rzeczy wcześniej napisanych byłby istny armagedon. Przedstawiłem pełny fragment kodu, na wypadek, gdyby np. te tablice były przyczyną.

"pełny fragment" - bardzo ciekawe.
W komentarzach wskazujesz że NIE WIESZ po co ten kod, teraz twierdzisz że wiesz, że może się przyda. Słabo się tłumaczysz...

I po co te nerwy? Co Ci to da? Koncepcję programu już mam od dawien dawna, to raz. Dwa, gotowca nie oczekuję - nie należę do leniwców. Trzy: czytaj ze zrozumieniem, w temacie napisałem, że jestem bardzo początkujący, co oznacza, że mogę oczekiwać jakiejkolwiek pomocy.

Czytać ze zrozumieniem powinieneś ty i udzielić mi odpowiedzi, no ale widzę że mam zbyt duże wymagania. I nie widzę abyś w temacie napisał że jesteś początkujący. (HINT: Temat - to coś na górze).

Mówisz, że mam użyć WinGraph? Czy to rozwiąże problem całkowicie?

No ja już nie wiem kogo tym razem pytasz. Mnie, patryka? Widzę że wymagasz aby tylko jedna osoba ci odpowiadała.
I niestety, nie wiem jaki problem, bo twój opis jest na tyle dokładny że nie wiadomo czego chcesz. Najpierw gadałeś o niedziałającym barze, potem stwierdziłeś że teraz jest ok ale 'coś ci nie działa'. Genialne.

Zresztą, ja chyba nie powinienem odpowiadać bo tutaj wszystko od pytacza jest @Patryk27 chyba że wyraźnie zaznaczył inaczej (widać np. po pisaniu 'ty' zamiast 'wy').

0

@-oho123

"pełny fragment" - bardzo ciekawe.

Jest to fragment całości bez żadnych wycinek wewnątrz.

Czytać ze zrozumieniem powinieneś ty i udzielić mi odpowiedzi, no ale widzę że mam zbyt duże wymagania.

Wytłuszcz mi, na CO nie udzieliłem Ci odpowiedzi?

I nie widzę abyś w temacie napisał że jesteś początkujący.

Nie?

Witam wszystkich na forum,

Jestem bardzo początkującym programistą, piszę swój pierwszy projekt w 2d:


No ja już nie wiem kogo tym razem pytasz. Mnie, patryka? Widzę że wymagasz aby tylko jedna osoba ci odpowiadała. I niestety, nie wiem jaki problem, bo twój opis jest na tyle dokładny że nie wiadomo czego chcesz. Najpierw gadałeś o niedziałającym barze, potem stwierdziłeś że teraz jest ok ale 'coś ci nie działa'. Genialne.

Pytałem Ciebie, bo nie zaznaczyłem nikogo innego od "@-123oho", ale jeśli odpowie ktoś inny, to też OK. Proste?
No to tak:

  1. Najpierw Bar() - działa, ale wadliwie: paski, których być nie powinno.
  2. Rzeczywiście, pomogliście mi (Ty i Patryk - dla pewnych opornych), zalecając Free Pascala i WinGraph.
  3. Bar() już OK, ale nie wiedziałem o tych okienkach, że są 2.
  4. Potem przetestuję WinGrapha, teraz nie mam czasu.

Do wszystkich: jeśli coś jeszcze nie zadziała i tego nie rozwiążę, to napiszę - nie zamykać.

0

@-oho123

Widzę że mam trudny nick... No chyba że założyłeś sobie podobne konto (CC* kojarzę) i pamiętasz jeden z moich starych nicków. Whatever...

Jest to fragment całości bez żadnych wycinek wewnątrz.

No i dlatego pełny? Widzę że się nie znam.

Wytłuszcz mi, na CO nie udzieliłem Ci odpowiedzi?

-123oho napisał(a)

CZEGO oczekujesz od nas. Gotowca? Pomysłu co ma robić twój kod?

Pytałem Ciebie, bo nie zaznaczyłem nikogo innego od "@-123oho", ale jeśli odpowie ktoś inny, to też OK. Proste?

Prostsze jest to że nie odnosisz się do jednej osoby a ogólnie i nie mówisz 'odpowiesz mi' tylko 'odpowiecie mi'. Taka mała różnica a tak dużo zmienia. To że akurat wtedy odpowiadała Tobie jedna osoba nie znaczy że zaraz nie przyjdzie -123oho się nad Tobą pastwić.

jeśli coś jeszcze nie zadziała i tego nie rozwiążę, to napiszę - nie zamykać.

Tutaj zamykane są tylko wątki które mają niski poziom. Najlepiej jak ci się uda też rozwiązać to zaznacz odpowiedni post jako rozwiązanie, podziękuj i powiedz co dokładnie zrobiłeś.

Patryk27 napisał(a)

Teraz się będziesz fochał na autora tematu?

Według niektórych potrafię się przyczepić do jednej złej literki w komentarzu kodu (mimo że nie tego się czepiałem), więc czemu nie? :P

0

Tutaj zamykane są tylko wątki które mają niski poziom. Najlepiej jak ci się uda też rozwiązać to zaznacz odpowiedni post jako rozwiązanie, podziękuj i powiedz co dokładnie zrobiłeś.

Zatem, pobrałem FPC i wklepałem do niego kod, błąd z paskami zniknął - może to przez lepszy kompilator. Dałem

uses dos,crt,wincrt,graph;

i problem ze sterowaniem konsolą zniknął.

podziękuj

Dziękuję wszystkim pomocnym.

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