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

[C++] Motyw z TheMatrix

Ostatnio zmodyfikowano 2012-11-24 10:19
Autor Wiadomość
hugerth
Temat założony przez niniejszego użytkownika
[C++] Motyw z TheMatrix
» 2012-11-23 14:34:53
Witajcie, piszę sobie prosty konsolowy program do tworzenia efektu spadających znaków z matrixa. I mam problem :)

Napisałem funkcję, która tworzy ciąg znaków w danej (lub losowej) kolumnie, następnie ciąg "przejeżdża" na dół okienka konsoli i znika. No dobra, dla jednej kolumny to wygląda fajnie, ale ja potrzebuję na dobrą sprawę 79 takich samych wywołań odpalonych równolegle.

Miałoby to wyglądać tak: w pętli losuję kolumnę i dla tej kolumny wywołuję funkcję Kolumna. Ale nie chcę czekać zanim funkcja dojdzie do końca, tylko np. po wyświetleniu n znaków w kolumnie startuje już druga kolumna (czyli wywołuję tę samą funkcję).
P-69748
jsc
» 2012-11-23 14:39:33
Zainteresuj się biblioteką thread. Jest natywna w C++11 lub w boost.
P-69749
m4tx
» 2012-11-23 15:14:26
@up ta, nie ma to jak odpalić 79 wątków dla prościutkiej aplikacji... :P

@hugerth - napisałeś co chcesz uczynić, napisałeś jak to chcesz uczynić, więc... w czym właściwie masz problem? :)

Generalnie ja bym to zrobił tak, że czekam
rand() % 100
 milisekund, w
rand() % 10
 losowo wybranych kolumnach dodaję
rand() % 3
 (dla każdej kolumny inna wartość) znaków. I tak w nieskończoność. :P
P-69751
jsc
» 2012-11-23 15:25:47
nie ma to jak odpalić 79 wątków dla prościutkiej aplikacji...

Jak przyjdzie do trudniutkiej to nie wiadomo się gdzie podziać, więc trzeba się wdrażać, im szybciej tym lepiej.
P-69753
akwes
» 2012-11-23 15:29:58
Wiele osób robi konsolę z matriksu i prawie każda jest niezadowolona. Efekt w konsoli nie wyjdzie taki jak w matriksie. Ponieważ konsola w matriksie to animacja, w której literki spadają płynnie co x pikseli a nie o jeden rząd.

Po prostu za każdym razem trzeba by rysować całą konsolę (45x70?) pamiętać gdzie jest jaka literka i tyle... Ja bym zrobił to na klasach... Ale ponieważ to Twój pierwszy post to podpowiem, że przecież można zrobić duży std::string i co "x" czasu przenosić literkę "piętro niżej" pamiętając ile ma piętro (70?)
P-69754
hugerth
Temat założony przez niniejszego użytkownika
» 2012-11-23 15:32:09
@m4tx - no chciałbym żeby to tak szło - wymyślam, piszę, działa. Ale niestety nie.

Na razie mam tak, że przelatuje jedna kolumna od góry do dołu i dopiero jak zniknie ostatni znak to funkcja się kończy. I jak tu kilka jednocześnie odpalić?

Klasy dopiero przede mną. Jestem uber newbie, dopiero zaczynam.

Mogę niby zrobić tablicę długości 80 (szer. konsoli) i w losowe miejsce wpisywać losowy znak i znowu przechodzić do nowego wiersza itd... ale będzie mizerny efekt.
P-69755
pekfos
» 2012-11-23 15:51:59
Zrób bufor 80x25 i na nim operuj. Później wyświetlaj go w konsoli jakąś funkcją (np z WinAPI). Wtedy wystarczy ci do tego jedna prosta pętla. (I nie potrzeba żadnych klas)
79 wątków to najgorsze możliwe rozwiązanie.
P-69756
akwes
» 2012-11-23 15:53:01

// szkic
// tablica dla całego ekranu o wielkości całego ekranu
std::string konsola[70*45];

// jeżeli znajdziesz znaczek, to przesuń go o wiersz niżej
for (int i =0; i<konsola.size; i++)
{
 konsola[i] != ' ';
 konsola[i+45] = konsola[i];
 konsola[i] = ' ';
}


// rysujemy z podziałem na wiersze
for (int i =0; i<konsola.size(); i++)
{
 
 std::cout << konsola[i];

if (i%75 == 0) std::cout << "\n";
}


@pekfos

(I nie potrzeba żadnych klas)
Dlatego podałem dwa rozwiązania, co nie zmienia faktu, że jednak na klasach byłoby to wygodniejsze, czytelniejsze i przenośne na bibliotekę 2D przy nie wielkim nakładzie pracy.
P-69757
« 1 » 2 3
  Strona 1 z 3 Następna strona