Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Migotanie "planszy gry" na przykładzie labiryntu.

Ostatnio zmodyfikowano 2014-01-22 21:14
Autor Wiadomość
Dwunogalek
Temat założony przez niniejszego użytkownika
[C++] Migotanie "planszy gry" na przykładzie labiryntu.
» 2014-01-22 15:06:10
   Sytuacja wygląda tak : Po dłuuugim czasie jaki zajęło mi zrobienie gry typu labirynt w której poruszamy się klawiszami W, A, S, D , zauważyłem że ( z resztą to było logiczne że tak będzie się działo po użyciu : system("cls"); ) plansza po każdym ruchu miga/mryga/odświerza się - jest to raczej normalne gdyż program działa dokładnie na takiej zasadzie:

1. Start, ustawienie postaci na odpowiednich polach X i Y na tablicy dwuwymiarowej.
2. Przejście do funkcji gry w której następuje pobranie koordynatów "ludzika" po czym następuje rysowanie planszy pętlą for - cegiełka po cegiełce.
3. Po narysowaniu planszy znak postaci jest zastępowany pustym polem aby poruszanie nie dawało efektu wężyka.
4. Przejście do funkcji pobierającej klawisz.
5. Dany klawisz dodaje/odejmuje wartość X/Y z miejsca postoju postaci.
6. Wyczyszczenie CAŁEGO OKNA konsoli za pomocą - system("cls");
7. --- w tym momencie następuje tytułowe mignięcie ---
7.1 -> powrót programu do funkcji z nr. 2. Co jest równoznaczne z - patrz. pkt. '8'
8. Natychmiastowe przydzielenie nowych koordynatów i rysowanie planszy z nowym ustawieniem.

           I tak w kółko.


Nie da się ukryć że miganie może być drażniące lub nawet wywołać epilepsję :P Więc chciałbym to zniwelować.

   na początku to tak nie przeszkadzało jak zaczynałem z planszą 10x10 ale jak jest to 20x80 to przez dłuższy czas rysowania planszy , miganie jest zbyt dobitne by tak dalej funkcjonować.


            Jeżeli ktoś miał ten sam problem i udało mu się go rozwiązać prosiłbym o fragment kodu/algorytmu czy też                     naprowadzenia/wskazówki jak poradzić sobie z tym fantem.
P-102830
leon_w
» 2014-01-22 15:34:30
Nie wiem czy w Twoim przypadku to się uda, ale ja w podobnej sytuacji, zamiast czyścić cały ekran, ustawiałem kursor na początku i następna "klatka" była rysowana na poprzedniej. Zrobiłem na tej zasadzie "węża" i praktycznie migotanie nie występuje.
Kawałek kodu do ustawienia kursora na początku okna:
C/C++
COORD cord;

cord.X = 0;
cord.Y = 0;
SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), cord );
P-102834
kubawal
» 2014-01-22 16:49:32
Zrób namiastkę podwójnego buforowania za pomocą stringstream'a

C/C++
#include <sstream>
//...

ostringstream out; // wyświetlaj do tego zamiast do cout'a;

//...

void display()
{
    system( "clr" );
    cout << out.str();
    out.str( "" ); // czyszczenie bufora
}
// ta funkcję wywoływać na końcu pętli głównej gry, po narysowaniu wszystkiego
P-102840
Dwunogalek
Temat założony przez niniejszego użytkownika
» 2014-01-22 17:56:01
Znów nie zawiodłem się na wiedzy forumowiczów ;)

Skorzystałem ze sposobu leon_w który wydał mi się łatwiejszy i cóż : To działa ;)
Ogromne dzięki za pomoc, w końcu mój labirynt jest grywalny.

Chętnie też bym spróbował ze sposobu Jakuba, ale nie za bardzo wiem jak się do tego zabrać... Znaczy to co generuje for mam wrzucać zamiast do wyświetlenia od razu : std::cout << Pole[X][Y] , wrzucać do ostringstream out; - tak ??

P-102846
kubawal
» 2014-01-22 18:27:11
Jednak nie - kiedyś mi działało, ale teraz już nie :)
P-102852
Dwunogalek
Temat założony przez niniejszego użytkownika
» 2014-01-22 21:14:05
Nie ma sprawy ;) Ale dzięki że chciałeś pomóc :)


Zamykam temat.
P-102885
« 1 »
  Strona 1 z 1