• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Przesuwanie napisów w konsoli

Object Storage Arubacloud
+1 głos
1,065 wizyt
pytanie zadane 1 czerwca 2016 w C i C++ przez b00ny Mądrala (6,050 p.)

Witam!

Robiąc grę wpadłem na pomysł aby napis "wysuwał się" z lewej strony, no tylko jest problem. Wiem, że coś takiego osiągnę na linuxie z biblioteką ncurses, ale moim głównym targetem jest Windows. Coś w stylu takiego loga otchłani, chyba wiecie jak to wygląda :p

Piszcie, bo wujek google mnie nie akceptuje.

4 odpowiedzi

+1 głos
odpowiedź 1 czerwca 2016 przez Dubgron Mądrala (5,620 p.)
edycja 1 czerwca 2016 przez Dubgron

Siema. Taki system to nic trudnego. Na początku przygotuj sobie tablicę stringów z tym co chcesz wyświetlić i zrób zmienne, które ją opisują (ew. zaalokuj ją dynamicznie). 

const unsigned int width = 10;
const unsigned int height = 5;

std::string arrow[5] = {"      @   ",
                        "       @  ",
                        " @@@@@@@@ ",
                        "       @  ",
                        "      @   "};

Następnie stwórz funkcję, która będzie rysowała od końca elementy stringa.

void draw(int x, unsigned int width, unsigned int height, std::string* arrow) {

    for (unsigned int i = 0; i < height; ++i) {
        for (unsigned int j = x; j < width; ++j) {

            std::cout << arrow[i][j];
        }
        std::cout << std::endl;
    }
}

I na końcu wywołanie funkcji w pętli, w mainie.

for (int i = width - 1; i >= 0; --i) {

        draw(i, width, height, arrow);
        // Trzeba zaincludowac <thread> i <chrono>
        std::this_thread::sleep_for(std::chrono::seconds(1));
        system("cls");
}

Mam nadzieję, że pomogłem. Pozdrawiam

PS Osobiście nie polecam rozwiązania z system("cls"), ponieważ działa tylko na windowsie, a za każdym razem gdy piszesz w C++ platform dependent code to gdzieś na świecie umiera mały kotek :)

komentarz 1 czerwca 2016 przez b00ny Mądrala (6,050 p.)
Mój główny target to windows :D Raczej nie będzie problemów, bo nie będę robił tej tekstówki na linuxa, w końcu nikt mi za to nie płaci, a to dalej jest zmarnowany czas, wysiłek i praca :v
0 głosów
odpowiedź 1 czerwca 2016 przez Michał Kazula Pasjonat (19,540 p.)
Użyj: "\t" - tabulator :-)
komentarz 1 czerwca 2016 przez niezalogowany
Autorowi chodzi o coś w rodzaju konsolowej "animacji", a nie statyczne wyświetlenie przesuniętego tekstu.
komentarz 1 czerwca 2016 przez Michał Kazula Pasjonat (19,540 p.)
Hmm tak sobie myślę. A w jaki inny sposób, niż dodawanie "\t", "\n" oraz "\r", można uzyskać efekt przesunięcia tekstu w konsoli?

Nikt autorowi nie zabrania napisania klaski do animowania tekstu w konsoli :-) przy użyciu metody statycznej umieszczania tekstu :-)
0 głosów
odpowiedź 1 czerwca 2016 przez niezalogowany
Najprościej jest coś takiego osiągnąć poprzez rozpoczęcie z pustym ekranem, a później ze stopniowym dodawaniem np spacji, albo tabulatorów z lewej strony napisu poprzedzanym czyszczeniem konsoli. Dobrym pomysłem byłoby ustawić ilość zapamiętywanych linii na wysokość konsoli (także w liniach), oczywiście po zakończeniu programu należałoby ustawienia przywrócić do tych sprzed uruchomienia programu.
komentarz 1 czerwca 2016 przez b00ny Mądrala (6,050 p.)
OK, tylko teraz wytłumacz mi, jak to okodować? Bo o tym samym myślałem przed zadaniem pytania...
komentarz 1 czerwca 2016 przez niezalogowany
@Dubgron podrzucił bardzo podobny kod do tego co sam bym ci podrzucił, jeżeli wysuwany napis składa się z 1 linii to zamiast czyszczenia ekranu można posłużyć się "\r"
0 głosów
odpowiedź 1 czerwca 2016 przez xjakubekx Obywatel (1,280 p.)

JA to zrobiłem w jednym z moich projektów w taki sposób:
 

#include <iostream>
#include <windows.h>
#include <cstdlib>

    cout << "Napis";
    Sleep(500);
    system("cls");
    cout << " Napis";
    Sleep(500);
    system("cls");
    cout << "  Napis";
    Sleep(500);
    system("cls");
    cout << "   Napis";
    Sleep(500);
    system("cls");
    cout << "    Napis";
    Sleep(500);
    system("cls");
    cout << "     Napis";
    Sleep(500);
    system("cls");

 

komentarz 1 czerwca 2016 przez Patrycjerz Mędrzec (192,320 p.)
Sposób jak najbardziej poprawny, ale nie sądzisz, że znajduje się w nim zbyt dużo powtarzającego się kodu? Nie lepiej użyć tutaj pętli?
komentarz 3 czerwca 2016 przez xjakubekx Obywatel (1,280 p.)
To zależy od długości, myslę że w przypadku zwykłego przesunięcia w prawo nie ma takiej potrzeby, aczykolwiek mozna
komentarz 3 czerwca 2016 przez xjakubekx Obywatel (1,280 p.)
Chciałem pokazac uzytkownikowi prosty, działający schemat :D

Podobne pytania

0 głosów
2 odpowiedzi 1,148 wizyt
pytanie zadane 23 grudnia 2015 w C i C++ przez Daaa22 Dyskutant (8,250 p.)
+1 głos
2 odpowiedzi 248 wizyt
pytanie zadane 17 stycznia 2023 w C i C++ przez Wikus841 Początkujący (370 p.)
0 głosów
1 odpowiedź 145 wizyt
pytanie zadane 6 stycznia 2020 w C i C++ przez lenzo1 Początkujący (360 p.)

92,568 zapytań

141,422 odpowiedzi

319,640 komentarzy

61,957 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...