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

[C++] Gra w konsoli, miganie ekranu

Ostatnio zmodyfikowano 2016-11-10 00:55
Autor Wiadomość
Clarc
Temat założony przez niniejszego użytkownika
[C++] Gra w konsoli, miganie ekranu
» 2016-11-09 20:05:47
Hejka o to mój kod:

 
C/C++
#include <iostream>
#include<iomanip>
#include <windows.h>
#include <conio.h> //getchar
using namespace std;
int main()
{
    int tab[ 12 ][ 12 ] = { 0 };
    int orientacja, x = 1, y = 1;
    int ile_maszt;
    int i, a;
    unsigned char znak;
    HANDLE hOut;
    hOut = GetStdHandle( STD_OUTPUT_HANDLE );
    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY );
    while( 1 )
    {
        for( i = 0; i < 12; i++ )
        {
            for( a = 0; a < 12; a++ )
            {
                if(( i == y ) &&( a == x ) )
                {
                    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY );
                    cout << setw( 3 ) << tab[ i ][ a ];
                    SetConsoleTextAttribute( hOut, FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY );
                } else cout << setw( 3 ) << tab[ i ][ a ];
               
            }
            cout << "\n";
        }
        znak = getch();
        ClearScreen();
        switch( znak )
        {
        case 72:
            if( y == 1 ) y = 10; else y--; //strzalka w góre
            break;
        case 80: //strza³ka w dó³
            if( y == 10 ) y = 1; else y++;
            break;
        case 13:
            //enter
            break;
        case 75: //w lewo
            if( x == 1 ) x = 10; else x--;
            break;
        case 77: //w PRAWO
            if( x == 10 ) x = 1; else x++;
            break;
            default: break;
        }
    } //koniec while
}




kod działa ale przejscia nie sa płynne,np u mnie widać jak ekran jest kasowanya  dopiero potem jest wypisywana wierszami tablica. Jak można się za to zabrać żeby przejscia były płynne?




P-153520
pekfos
» 2016-11-09 20:13:39
Nie czyść ekranu, tylko go nadpisuj. Konsola w systemie Windows jest za wolna, by ją czyścić w takich grach. Do tego, klawisze strzałek generują 2 kody - nie obsługujesz tego, więc gra musi się narysować 2 razy, zanim ruch zostanie wykonany.
P-153521
Clarc
Temat założony przez niniejszego użytkownika
» 2016-11-09 21:41:51
nadpisuj? możesz rozwinąć temat? słyszałem o czymś takim jak podwójne bofurowanie co o tym sądzisz?
P-153526
polepszacz
» 2016-11-09 22:16:13
W tym kontekście nadpisywanie = wypełnienie spacjami całego ekranu roboczego.
P-153529
pekfos
» 2016-11-10 00:55:40
W tym kontekście nadpisywanie = wypełnienie spacjami całego ekranu roboczego.
Nie. Wypełnianie ekranu następnym stanem gry. Spacje to dalej będzie zauważalne czyszczenie.

nadpisuj? możesz rozwinąć temat? słyszałem o czymś takim jak podwójne bofurowanie co o tym sądzisz?
Przenieś kursor na początek i wypisz wszystko jeszcze raz. Jednak jeśli jakiś znak nie zostanie nadpisany, zostanie w tym miejscu jego stara wartość. Wypisz "12345", potem "abc" i wyjdzie "abc45", stąd powinieneś wypisać "abc  ". W bardziej złożonych zastosowaniach jest to niewygodne i wtedy opłaca się już zastosować podwójne buforowanie o którym wspomniałeś. Tworzy się tablicę znaków i atrybutów pokrywającą cały ekran konsoli, z którą możesz robić co tylko sobie chcesz i potem, na żądanie, wypisać ją na ekran. Wtedy dopiero opłaca się robić czyszczenie 'ekranu' bo ekran nie jest od tego od razu czyszczony.
A skoro masz już robić tablice znaków i atrybutów, możesz użyć do tego struktury CHAR_INFO i wypisywać cały bufor jednym wywołaniem WriteConsoleOutput(). Takie rozwiązanie jest już ciężkie do przebicia. Pamiętaj jednak, że wprowadzając własny, dodatkowy bufor, musisz zaimplementować wszystkie niezbędne operacje na nim. Nie możesz już ręcznie pisać po konsoli, by nie psuć efektu, a więc żegnaj cout, printf() i wszystko inne, co do tej pory stosowałeś, zamiast tego, pewnie twoim nowym najlepszym przyjacielem będzie funkcja sprintf() lub vsprintf().

Ewentualnie użyj gotowej biblioteki, np New Curses.
» KursyKurs New Curses, C++ kurs
P-153535
« 1 »
  Strona 1 z 1