Autor Wątek: Odświeżanie w konsoli  (Przeczytany 759 razy)

Offline nimtiz

  • Użytkownik

# Maj 06, 2012, 11:38:50
witajcie

Czy jest jakiś sposób ładnego odświeżania w konsoli? Do tej pory korzystałem z system("CLS") i rysowałem od początku ale w grze migający ekran jest wnerwiający. Macie jakieś pomysły?

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Pawel1503

  • Użytkownik
    • DevBlog Pawel1503

# Maj 06, 2012, 11:53:05
Ja robię coś takiego: tworzę sobie bufor np.

char mBuffer[80][50];
W trakcie gry operuje na nim, rysuje jakiś interfejs, plansze, postacie, cokolwiek. Następnie w funkcji drawFrame() mam coś takiego:

COORD mCoord = { 0, 0 };
DWORD mWritten;

WriteConsoleOutputCharacterA(mOut,mBuffer[0],50*80-1,mCoord,&mWritten);

Odsyłam też do msdn: http://msdn.microsoft.com/en-us/library/windows/desktop/ms687410%28v=vs.85%29.aspx

Offline AS

  • Użytkownik
    • Homepage

# Maj 06, 2012, 11:54:42
Na migający ekran to double buffering.

A tak na poważnie, zamiast czyścić cały ekran, idziesz w miejsce (x,y) i zamazujesz znak na tej pozycji. Zamazujesz tylko zmieniające się znaki ekranie.

Na Windowsie jeśli korzystasz z Borlandowskiego conio.h to tam jest gotoxy(), w bardziej ogólnym przypadku możesz użyć WinAPI i SetConsoleCursorPosition():

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686025(v=vs.85).aspx

Tu jest fragment kodu: http://peb.pl/programowanie/82529-c-zmiana-polozenia-kursora.html

Offline ShadowDancer

  • Moderator

# Maj 06, 2012, 12:03:23
Jeśli w grze np. postać przesuwa się względem otoczenia, to musi odrysować cały ekran, wymiana jednego znaku to raczej specyficzna funkcjonalność.

Offline nimtiz

  • Użytkownik

# Maj 06, 2012, 12:33:37
EDIT

myślę że jednak ten sposób nie jest taki zły jak na początku mi się wydawało.
#include <windows.h>
void gotoxy(int x, int y)
{
  COORD c;

  c.X = x - 1;
  c.Y = y - 1;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);
}

nie potrzebuje żadnego bufora tylko zamiast:
system("cls");
wpisałem
gotoxy(1, 1);
dało to płynny efekt odświeżania :)
efekt mojej pracy na warsztacie:
http://warsztat.gd/projects/Tetris_konsolowy

uważam że temat można zamknąć
Dzięki za pomoc
« Ostatnia zmiana: Maj 06, 2012, 22:28:37 wysłana przez nimtiz »

Offline Xender

  • Użytkownik

# Maj 06, 2012, 13:00:21
Można trzymać poprzedni bufor, i zmieniać tylko te znaki, które różnią się między poprzednim a aktualnym.